diff --git a/base/applications/cacls/lang/ja-JP.rc b/base/applications/cacls/lang/ja-JP.rc index 868f05df891..edc48166f0b 100644 --- a/base/applications/cacls/lang/ja-JP.rc +++ b/base/applications/cacls/lang/ja-JP.rc @@ -3,7 +3,7 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE BEGIN -IDS_HELP, "ファイルのアクセス制御リスト(ACL) を表 示または変更します。n\n\ +IDS_HELP, "ファイルのアクセス制御リスト(ACL) を表示または変更します。\n\n\ CACLS ファイル名 [/T] [/E] [/C] [/G ユーザー名:アクセス権]\n\ [/R ユーザー名 [...]] [/P ユーザー名:アクセス権 [...]]\n\ [/D ユーザー名 [...]]\n\ diff --git a/base/applications/cmdutils/doskey/doskey.rc b/base/applications/cmdutils/doskey/doskey.rc index ca48da26319..d5a85f38b80 100644 --- a/base/applications/cmdutils/doskey/doskey.rc +++ b/base/applications/cmdutils/doskey/doskey.rc @@ -18,6 +18,15 @@ #ifdef LANGUAGE_EN_US #include "lang/en-US.rc" #endif +#ifdef LANGUAGE_ES_ES + #include "lang/es-ES.rc" +#endif +#ifdef LANGUAGE_FR_FR + #include "lang/fr-FR.rc" +#endif +#ifdef LANGUAGE_IT_IT + #include "lang/it-IT.rc" +#endif #ifdef LANGUAGE_PL_PL #include "lang/pl-PL.rc" #endif @@ -33,9 +42,3 @@ #ifdef LANGUAGE_ZH_CN #include "lang/zh-CN.rc" #endif -#ifdef LANGUAGE_FR_FR - #include "lang/fr-FR.rc" -#endif -#ifdef LANGUAGE_ES_ES - #include "lang/es-ES.rc" -#endif diff --git a/base/applications/cmdutils/doskey/lang/it-IT.rc b/base/applications/cmdutils/doskey/lang/it-IT.rc new file mode 100644 index 00000000000..f170fb20e32 --- /dev/null +++ b/base/applications/cmdutils/doskey/lang/it-IT.rc @@ -0,0 +1,27 @@ +LANGUAGE LANG_ITALIAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +BEGIN + +IDS_HELP, "Gestisce le impostazioni della riga di comando di editing, la cronologia e le macro.\n\ +\n\ +DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=size]\n\ + [/REINSTALL] [/MACROS[:exe | :ALL]] [/MACROFILE=file] [macroname=[text]]\n\ +\n\ + /INSERT Attiva la modalità di inserimento.\n\ + /OVERSTRIKE Disattiva la modalità di inserimento.\n\ + /EXENAME=exename Consente di impostare il nome del programma per visualizzare/cambiare la cronologia\n\ + e le macro. Il valore predefinito è cmd.exe.\n\ + /HISTORY Consente di visualizzare la cronologia dei comandi.\n\ + /LISTSIZE=size Imposta il numero di comandi al buffer storico.\n\ + /REINSTALL Cancella la cronologia dei comandi.\n\ + /MACROS Consente di visualizzare le definizioni delle macro.\n\ + /MACROS:exename Visualizza le definizioni di macro per un programma specifico.\n\ + /MACROS:ALL Visualizza le definizioni macro per tutti i programmi.\n\ + /MACROFILE=file Carica le definizioni di macro da un file.\n\ + macroname Specifica il nome di una macro per creare.\n\ + text Consente di specificare il testo di sostituzione per la macro.\n" + +IDS_INVALID_MACRO_DEF, "Definizion macro non valida: %s\n" + +END diff --git a/base/applications/dxdiag/lang/it-IT.rc b/base/applications/dxdiag/lang/it-IT.rc new file mode 100644 index 00000000000..4c7a254fb01 --- /dev/null +++ b/base/applications/dxdiag/lang/it-IT.rc @@ -0,0 +1,226 @@ +LANGUAGE LANG_ITALIAN, SUBLANG_DEFAULT + +IDD_MAIN_DIALOG DIALOGEX DISCARDABLE 0, 0, 478, 280 +STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | + WS_THICKFRAME +CAPTION "Programma di diagnostica ReactX" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "Tab1",IDC_TAB_CONTROL,"SysTabControl32",WS_TABSTOP,2,2,474,250 + PUSHBUTTON "&Aiuto", IDC_BUTTON_HELP, 2, 261, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + DEFPUSHBUTTON "&Prossima pagina", IDC_BUTTON_NEXT, 257, 261, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Salva tutte le informazioni...", IDC_BUTTON_SAVE_INFO, 311, 261, 110, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&uSCITA", IDC_BUTTON_EXIT, 425, 261, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +IDD_SYSTEM_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Questo strumento riporta informazioni dettagliate sui componenti ReactX e dei driver installati sul sistema.", -1, 10, 10, 443, 17 + LTEXT "Se si sa quale zona è la causa del problema, fare clic sopra la scheda appropriata. In caso contrario, è possibile utilizzare il tasto Pagina successiva qui sotto per visitare ogni pagina in sequenza.", -1, 10, 30, 443, 25 + GROUPBOX "Informazioni di sistema", -1, 10, 55, 443, 130, SS_RIGHT + LTEXT "Data/Ora:", -1, 70, 70, 80, 10, SS_RIGHT + LTEXT "Nome del computer:", -1, 70, 80, 80, 10, SS_RIGHT + LTEXT "Sistema operativo:", -1, 70, 90, 80, 10, SS_RIGHT + LTEXT "Lingua:", -1, 70, 100, 80, 10, SS_RIGHT + LTEXT "Produttore DI sistema:", -1, 70, 110, 80, 10, SS_RIGHT + LTEXT "Modello di Sistem :", -1, 70, 120, 80, 10, SS_RIGHT + LTEXT "BIOS:", -1, 70, 130, 80, 10, SS_RIGHT + LTEXT "Processore:", -1, 70, 140, 80, 10, SS_RIGHT + LTEXT "Memoria:", -1, 70, 150, 80, 10, SS_RIGHT + LTEXT "Page file:", -1, 70, 160, 80, 10, SS_RIGHT + LTEXT "ReactX-Version:", -1, 70, 170, 80, 10, SS_RIGHT + LTEXT "", IDC_STATIC_TIME, 155, 70, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_COMPUTER, 155, 80, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_OS, 155, 90, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_LANG, 155, 100, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_MANU, 155, 110, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_MODEL, 155, 120, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_BIOS, 155, 130, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_PROC, 155, 140, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_MEM, 155, 150, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_SWAP, 155, 160, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_VERSION, 155, 170, 195, 10, SS_LEFT +END + +IDD_DISPLAY_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Device", -1, 10, 10, 250, 100 + RTEXT "Nome:", -1, 20, 25, 70, 10 + RTEXT "Fabbricante:", -1, 20, 35, 70, 10 + RTEXT "Chip Type:", -1, 20, 45, 70, 10 + RTEXT "DAC Type:", -1, 20, 55, 70, 10 + RTEXT "Totale memnoria (Approssimativo):", -1, 20, 65, 70, 10 + RTEXT "Modalità di visualizzazione corrente:", -1, 20, 75, 70, 10 + RTEXT "Monitor:", -1, 20, 85, 70, 10 + LTEXT "", IDC_STATIC_ADAPTER_ID, 95, 25, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_VENDOR, 95, 35, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_CHIP, 95, 45, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_DAC, 95, 55, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_MEM, 95, 65, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_MODE, 95, 75, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_MONITOR, 95, 85, 150, 10 + + GROUPBOX "Driver", -1, 270, 10, 190, 100 + RTEXT "Driver Principale:", -1, 275, 25, 55, 10 + RTEXT "Versione:", -1, 275, 35, 55, 10 + RTEXT "Data:", -1, 275, 45, 55, 10 + RTEXT "WHQL-Logo:", -1, 275, 55, 55, 10 + RTEXT "Mini-VDD:", -1, 275, 65, 55, 10 + RTEXT " vvdddVDD:", -1, 275, 75, 55, 10 + RTEXT "DDI Version:", -1, 275, 85, 55, 10 + LTEXT "", IDC_STATIC_ADAPTER_DRIVER, 335, 35, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_VERSION, 335, 35, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_DATE, 335, 45, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_LOGO, 335, 55, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_MINIVDD, 335, 65, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_VDD, 335, 75, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_DDI, 335, 85, 100, 10 + + GROUPBOX "ReactX-Features", -1, 10, 115, 450, 60 + RTEXT "Accelerazione DirectDraw:", -1, 15, 130, 110, 12 + RTEXT "Accelerazione Direct3D:", -1, 15, 145, 110, 12 + RTEXT "AGP Texture Acceleration:", -1, 15, 160, 110, 12 + LTEXT "", IDC_STATIC_DDSTATE, 130, 130, 40, 10 + LTEXT "", IDC_STATIC_D3DSTATE, 130, 145, 40, 10 + LTEXT "", IDC_STATIC_AGPSTATE, 130, 160, 40, 10 + PUSHBUTTON "Abilita", IDC_BUTTON_DDRAW, 170, 124, 60, 14, WS_DISABLED + PUSHBUTTON "Abilita", IDC_BUTTON_D3D, 170, 140, 60, 14, WS_DISABLED + PUSHBUTTON "Abilita", IDC_BUTTON_AGP, 170, 156, 60, 14, WS_DISABLED + PUSHBUTTON "Test DirectDraw", IDC_BUTTON_TESTDD, 250, 124, 80, 14 + PUSHBUTTON "Test Direct3D", IDC_BUTTON_TEST3D, 250, 140, 80, 14 + + GROUPBOX "Notes", -1, 10, 180, 450, 40 + EDITTEXT IDC_TEXT_INFO, 20, 192, 432, 20, WS_DISABLED | WS_TABSTOP +END + + +IDD_SOUND_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Device", -1, 10, 10, 250, 100 + RTEXT "Nome:", -1, 20, 25, 70, 10 + RTEXT "Device ID:", -1, 20, 35, 70, 10 + RTEXT "Manufacturer ID:", -1, 20, 45, 70, 10 + RTEXT "Product ID:", -1, 20, 55, 70, 10 + RTEXT "Tipo:", -1, 20, 65, 70, 10 + RTEXT "Default Device:", -1, 20, 75, 70, 10 + LTEXT "", IDC_STATIC_DSOUND_NAME, 95, 25, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_DEVICEID, 95, 35, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_VENDORID, 95, 45, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_PRODUCTID, 95, 55, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_TYPE, 95, 65, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_STANDARD, 95, 75, 150, 10 + GROUPBOX "Driver", -1, 270, 10, 190, 100 + RTEXT "Nome:", -1, 275, 25, 55, 10 + RTEXT "Versione:", -1, 275, 35, 55, 10 + RTEXT "Data:", -1, 275, 45, 55, 10 + RTEXT "WHQL-Logo:", -1, 275, 55, 55, 10 + RTEXT "Altri Files:", -1, 275, 65, 55, 10 + RTEXT "Provider:", -1, 275, 75, 55, 10 + LTEXT "", IDC_STATIC_DSOUND_DRIVER, 335, 25, 100, 10 + LTEXT "", IDC_STATIC_DSOUND_VERSION, 335, 35, 100, 10 + LTEXT "", IDC_STATIC_DSOUND_DATE, 335, 45, 100, 10 + LTEXT "", IDC_STATIC_DSOUND_LOGO, 335, 55, 100, 10 + LTEXT "", IDC_STATIC_DSOUND_FILES, 335, 65, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_PROVIDER, 335, 75, 100, 10 + GROUPBOX "ReactX-Features", -1, 10, 115, 450, 60 + CONTROL "", IDC_SLIDER_DSOUND, "msctls_trackbar32", TBS_BOTTOM | TBS_AUTOTICKS | WS_TABSTOP, 120, 135, 80, 17 + RTEXT "Hardware Sound\nAcceleration Level:", -1, 20, 135, 90, 20 + PUSHBUTTON "Test DirectSound", IDC_BUTTON_TESTDSOUND, 270, 134, 80, 14 + GROUPBOX "Note", -1, 10, 180, 450, 40 + EDITTEXT IDC_TEXT_DSOUNDINFO, 20, 192, 432, 20, WS_DISABLED | WS_TABSTOP +END + +IDD_MUSIC_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN +END + + +IDD_INPUT_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "DirectInput Devices", -1, 10, 10, 452, 80 + CONTROL "", IDC_LIST_DEVICE, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 20, 22, 432, 60 + GROUPBOX "Input Devices", -1, 10, 100, 452, 60 + CONTROL "", IDC_TREE_PORT, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 20, 112, 432, 40, 0x00000200 + GROUPBOX "Informazioni", -1, 10, 170, 452, 50 + EDITTEXT IDC_RICH_INFO, 20, 182, 432, 30, WS_DISABLED | WS_TABSTOP +END + +IDD_NETWORK_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Registered DirectPlay Service Provider", -1, 10, 10, 452, 80 + CONTROL "", IDC_LIST_PROVIDER, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 20, 22, 432, 60 +END + +IDD_HELP_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_MAIN_DIALOG "Tool di diagnostica ReactX" + IDS_SYSTEM_DIALOG "Sistema" + IDS_DISPLAY_DIALOG "Display" + IDS_SOUND_DIALOG "Suoni" + IDS_MUSIC_DIALOG "Musica" + IDS_INPUT_DIALOG "Input" + IDS_NETWORK_DIALOG "Network" + IDS_HELP_DIALOG "Aiuto" + IDS_FORMAT_MB "%I64uMB RAM" + IDS_FORMAT_SWAP "%I64u MB utilizzata, %I64u MB avviabile" + IDS_FORMAT_UNIPROC "%s (%u CPU)" + IDS_FORMAT_MPPROC "%s (%u CPUs)" + IDS_VERSION_UNKNOWN "Versione Sconosciuta" + IDS_DEVICE_STATUS_ATTACHED "Connesso" + IDS_DEVICE_STATUS_MISSING "Disconnesso" + IDS_DEVICE_STATUS_UNKNOWN "Sconosciuto" + IDS_DEVICE_NAME "Nome Device" + IDS_DEVICE_STATUS "Stato" + IDS_DEVICE_CONTROLLER "Controller ID" + IDS_DEVICE_MANUFACTURER "Manufacturer ID" + IDS_DEVICE_PRODUCT "Product ID" + IDS_DEVICE_FORCEFEEDBACK "Forza Feedback-Driver" + IDS_NOT_APPLICABLE "Non applicabile" + IDS_OPTION_YES "Si" + IDS_DIRECTPLAY_COL_NAME1 "Nome" + IDS_DIRECTPLAY_COL_NAME2 "Registro" + IDS_DIRECTPLAY_COL_NAME3 "File" + IDS_DIRECTPLAY_COL_NAME4 "Versione" + IDS_DIRECTPLAY8_MODEMSP "DirectPlay8-Modem Service Provider" + IDS_DIRECTPLAY8_SERIALSP "DirectPlay8 Serial Service Provider" + IDS_DIRECTPLAY8_IPXSP "DirectPlay8 IPX Service Provider" + IDS_DIRECTPLAY8_TCPSP "DirectPlay8-TCP/IP Service Provider" + IDS_DIRECTPLAY_TCPCONN "Connessione Internet TCP/IP per DirectPlay" + IDS_DIRECTPLAY_IPXCONN "Connessione IPX per DirectPlay" + IDS_DIRECTPLAY_MODEMCONN "Connessione Modem per DirectPlay" + IDS_DIRECTPLAY_SERIALCONN "Connessione seriale per DirectPlay" + IDS_REG_SUCCESS "OK" + IDS_REG_FAIL "Errore" + IDS_DDTEST_ERROR "Test fallito!" + IDS_DDTEST_DESCRIPTION "Questo avvierà il controllo dell'interfaccia DirectDraw. Continuare?" + IDS_DDPRIMARY_DESCRIPTION "Questo test utilizza DirectDraw per disegnare sulla superficie primaria. Rettangoli in bianco e nero devono essere compilati. Continuare?" + IDS_DDPRIMARY_RESULT "Hai visto rettangoli bianchi e neri?" + IDS_DDOFFSCREEN_DESCRIPTION "Questo test utilizza DirectDraw per disegnare buffer fuori schermo. Spostameni rettangolo bianco devono essere compilati. Continuare?" + IDS_DDOFFSCREEN_RESULT "Hai visto il rettangolo bianco muoversi?" + IDS_DDFULLSCREEN_DESCRIPTION "Questo test utilizza DirectDraw per disegnare in una modalità schermo intero. I Spostamenti del rettangolo bianco devono essere compilati. Continuare?" + IDS_DDFULLSCREEN_RESULT "Hai visto un rettangolo bianco in movimento in modalità schermo intero?" + IDS_FORMAT_ADAPTER_MEM "%u MB" + IDS_FORMAT_ADAPTER_MODE "%04u x %04u (%u bit)(%uHz)" + IDS_OPTION_NO "No" + IDS_D3DTEST_DESCRIPTION "Avviare il test dell'interfaccia Direct3D. Continuare?" + IDS_D3DTEST_D3Dx "Questo test utilizza accelerazione hardware dell'interfaccia Direct3D % u." +END diff --git a/base/applications/dxdiag/rsrc.rc b/base/applications/dxdiag/rsrc.rc index bb5f17f179c..7bbc648a36d 100644 --- a/base/applications/dxdiag/rsrc.rc +++ b/base/applications/dxdiag/rsrc.rc @@ -22,6 +22,9 @@ #ifdef LANGUAGE_HE_IL #include "lang/he-IL.rc" #endif +#ifdef LANGUAGE_IT_IT + #include "lang/it-IT.rc" +#endif #ifdef LANGUAGE_JA_JP #include "lang/ja-JP.rc" #endif @@ -34,12 +37,6 @@ #ifdef LANGUAGE_NB_NO #include "lang/no-NO.rc" #endif -#ifdef LANGUAGE_SK_SK - #include "lang/sk-SK.rc" -#endif -#ifdef LANGUAGE_SV_SE - #include "lang/sv-SE.rc" -#endif #ifdef LANGUAGE_PL_PL #include "lang/pl-PL.rc" #endif @@ -52,12 +49,18 @@ #ifdef LANGUAGE_RU_RU #include "lang/ru-RU.rc" #endif -#ifdef LANGUAGE_UK_UA - #include "lang/uk-UA.rc" +#ifdef LANGUAGE_SK_SK + #include "lang/sk-SK.rc" +#endif +#ifdef LANGUAGE_SV_SE + #include "lang/sv-SE.rc" #endif #ifdef LANGUAGE_TR_TR #include "lang/tr-TR.rc" #endif +#ifdef LANGUAGE_UK_UA + #include "lang/uk-UA.rc" +#endif #ifdef LANGUAGE_ZH_CN #include "lang/zh-CN.rc" #endif diff --git a/base/applications/fontview/fontview.rc b/base/applications/fontview/fontview.rc index 797e3cef18e..315e51861fb 100644 --- a/base/applications/fontview/fontview.rc +++ b/base/applications/fontview/fontview.rc @@ -39,6 +39,9 @@ END #ifdef LANGUAGE_HE_IL #include "lang/he-IL.rc" #endif +#ifdef LANGUAGE_IT_IT + #include "lang/it-IT.rc" +#endif #ifdef LANGUAGE_LT_LT #include "lang/lt-LT.rc" #endif diff --git a/base/applications/fontview/lang/it-IT.rc b/base/applications/fontview/lang/it-IT.rc new file mode 100644 index 00000000000..948f3982197 --- /dev/null +++ b/base/applications/fontview/lang/it-IT.rc @@ -0,0 +1,13 @@ +LANGUAGE LANG_ITALIAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +BEGIN + IDS_INSTALL, "Installa" + IDS_PRINT, "Stampa" + IDS_STRING, "" + IDS_OPEN, "Open Font..." + IDS_ERROR, "Errore" + IDS_ERROR_NOMEM, "Memoria insufficiente per completare l'operazione." + IDS_ERROR_NOFONT, "Il file% 1 non è un file di origine valido." + IDS_ERROR_NOCLASS, "Impossibile avviare la classe." +END diff --git a/base/applications/games/solitaire/lang/ja-JP.rc b/base/applications/games/solitaire/lang/ja-JP.rc index d54843a60a9..3dce23a7492 100644 --- a/base/applications/games/solitaire/lang/ja-JP.rc +++ b/base/applications/games/solitaire/lang/ja-JP.rc @@ -19,8 +19,8 @@ BEGIN AUTORADIOBUTTON "1 枚ずつ取る(&O)", IDC_OPT_DRAWONE, 14, 19, 70, 10, WS_GROUP | WS_TABSTOP AUTORADIOBUTTON "3 枚ずつ取る(&T)", IDC_OPT_DRAWTHREE, 14, 32, 70, 10 - AUTOCHECKBOX "時間を表 示する(&S)", IDC_OPT_SHOWTIME, 7 ,51 ,65 ,10, WS_TABSTOP | WS_DISABLED - AUTOCHECKBOX "ステータスバーを表 示する(&T)", IDC_OPT_STATUSBAR, 7, 66, 64, 10, WS_TABSTOP + AUTOCHECKBOX "時間を表示する(&S)", IDC_OPT_SHOWTIME, 7 ,51 ,65 ,10, WS_TABSTOP | WS_DISABLED + AUTOCHECKBOX "ステータスバーを表示する(&T)", IDC_OPT_STATUSBAR, 7, 66, 64, 10, WS_TABSTOP DEFPUSHBUTTON "OK", IDOK, 35, 97, 50, 14 PUSHBUTTON "キャンセル", IDCANCEL, 101, 97, 50, 14 @@ -53,8 +53,8 @@ END STRINGTABLE BEGIN - IDS_SOL_NAME "ソ リティア" - IDS_SOL_ABOUT "J Brown によるソ リティア\n\nCardLib バージョン 1.0。" + IDS_SOL_NAME "ソリティア" + IDS_SOL_ABOUT "J Brown によるソリティア\n\nCardLib バージョン 1.0。" IDS_SOL_QUIT "現在のゲームを終了しますか?" IDS_SOL_WIN "おめでとう、あなたの勝ちです!" IDS_SOL_DEAL "もう一度カードを配りますか?" diff --git a/base/applications/games/solitaire/lang/tr-TR.rc b/base/applications/games/solitaire/lang/tr-TR.rc index 8029aff7726..80da4cd23db 100644 --- a/base/applications/games/solitaire/lang/tr-TR.rc +++ b/base/applications/games/solitaire/lang/tr-TR.rc @@ -71,14 +71,14 @@ BEGIN BEGIN MENUITEM "&Dağıt\tF2", IDM_GAME_NEW MENUITEM SEPARATOR - MENUITEM "D&esteler", IDM_GAME_DECK - MENUITEM "&Ayarlar", IDM_GAME_OPTIONS + MENUITEM "D&esteler...", IDM_GAME_DECK + MENUITEM "&Ayarlar...", IDM_GAME_OPTIONS MENUITEM SEPARATOR MENUITEM "&Çıkış", IDM_GAME_EXIT END POPUP "&Yardım" BEGIN - MENUITEM "&İçerik\tF1", IDM_HELP_CONTENTS + MENUITEM "&Yardım Konuları\tF1", IDM_HELP_CONTENTS MENUITEM "&Hakkında", IDM_HELP_ABOUT END END diff --git a/base/applications/games/spider/lang/ja-JP.rc b/base/applications/games/spider/lang/ja-JP.rc index 882bcc3c26f..8a52a17d6e6 100644 --- a/base/applications/games/spider/lang/ja-JP.rc +++ b/base/applications/games/spider/lang/ja-JP.rc @@ -49,7 +49,7 @@ END STRINGTABLE BEGIN IDS_SPI_NAME "スパイダ" - IDS_SPI_ABOUT "Gregor Schneider によるスパイダ ソ リティア\n\nCardLib バージョン 1.0" + IDS_SPI_ABOUT "Gregor Schneider によるスパイダ ソリティア\n\nCardLib バージョン 1.0" IDS_SPI_QUIT "現在のゲームを終了しますか?" IDS_SPI_WIN "おめでとう、あなたの勝ちです!" IDS_SPI_DEAL "もう一度カードを配りますか?" diff --git a/base/applications/games/spider/lang/tr-TR.rc b/base/applications/games/spider/lang/tr-TR.rc index 9b14a2ae32b..0da28065b7c 100644 --- a/base/applications/games/spider/lang/tr-TR.rc +++ b/base/applications/games/spider/lang/tr-TR.rc @@ -64,13 +64,13 @@ BEGIN BEGIN MENUITEM "&Yeni oyun\tF2", IDM_GAME_NEW MENUITEM SEPARATOR - MENUITEM "&Desteler", IDM_GAME_DECK + MENUITEM "&Desteler...", IDM_GAME_DECK MENUITEM SEPARATOR MENUITEM "&Çıkış", IDM_GAME_EXIT END POPUP "&Yardım" BEGIN - MENUITEM "&İçerik\tF1", IDM_HELP_CONTENTS + MENUITEM "&Yardım Konuları\tF1", IDM_HELP_CONTENTS MENUITEM "&Hakkında", IDM_HELP_ABOUT END END diff --git a/base/applications/games/winmine/lang/tr-TR.rc b/base/applications/games/winmine/lang/tr-TR.rc index 3c2dcad1ffa..91032ad246e 100644 --- a/base/applications/games/winmine/lang/tr-TR.rc +++ b/base/applications/games/winmine/lang/tr-TR.rc @@ -23,7 +23,7 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT STRINGTABLE BEGIN - IDS_APPNAME, "Wine Mayın Tarlası" + IDS_APPNAME, "Mayın Tarlası" IDS_NOBODY, "Hiç kimse" IDS_ABOUT, "Telif hakkı: Joshua Thielen, 2000" END @@ -31,20 +31,20 @@ END MENU_WINEMINE MENU BEGIN POPUP "&Seçenekler" BEGIN - MENUITEM "&Yeni\tF2", IDM_NEW + MENUITEM "&Yeni\tF2", IDM_NEW MENUITEM SEPARATOR - MENUITEM "&Soru İmi", IDM_MARKQ + MENUITEM "&Soru İmi", IDM_MARKQ MENUITEM SEPARATOR - MENUITEM "&Başlangıç", IDM_BEGINNER - MENUITEM "&Orta", IDM_ADVANCED - MENUITEM "&İleri", IDM_EXPERT - MENUITEM "&Özel", IDM_CUSTOM + MENUITEM "&Başlangıç", IDM_BEGINNER + MENUITEM "&Orta", IDM_ADVANCED + MENUITEM "&İleri", IDM_EXPERT + MENUITEM "&Özel...", IDM_CUSTOM MENUITEM SEPARATOR - MENUITEM "&Çıkış\tAlt+X", IDM_EXIT + MENUITEM "&Çıkış\tAlt+X", IDM_EXIT END POPUP "&Bilgi" BEGIN - MENUITEM "&En Kısa Süreler", IDM_TIMES - MENUITEM "&Hakkında", IDM_ABOUT + MENUITEM "&En Kısa Süreler...", IDM_TIMES + MENUITEM "&Hakkında", IDM_ABOUT END END diff --git a/base/applications/logoff/lang/ja-JP.rc b/base/applications/logoff/lang/ja-JP.rc index 945d0572c27..28e99e0d683 100644 --- a/base/applications/logoff/lang/ja-JP.rc +++ b/base/applications/logoff/lang/ja-JP.rc @@ -4,8 +4,8 @@ STRINGTABLE DISCARDABLE BEGIN IDS_USAGE, "セッションを終了します。\n\n\ - /v\t\t実行中に詳細情報を表 示します。\n\ - /?\t\tこの情報を表 示します。\n\n" + /v\t\t実行中に詳細情報を表示します。\n\ + /?\t\tこの情報を表示します。\n\n" IDS_LOGOFF_REMOTE, "リモート マシンのセッションを終了しています。" IDS_LOGOFF_LOCAL, "このマシンの現在のセッションを終了しています。" diff --git a/base/applications/magnify/lang/tr-TR.rc b/base/applications/magnify/lang/tr-TR.rc new file mode 100644 index 00000000000..39dec89bd02 --- /dev/null +++ b/base/applications/magnify/lang/tr-TR.rc @@ -0,0 +1,72 @@ +/* + * PROJECT: ReactOS Magnifier + * LICENSE: GPL - See COPYING in the top level directory + * FILE: base/applications/magnify/lang/tr-TR.rc + * PURPOSE: Turkish Language File for Magnifier + * TRANSLATOR: 2013 - Erdem Ersoy (eersoy93) + */ + +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + +IDC_MAGNIFIER MENU +BEGIN + POPUP "&Seçke" + BEGIN + MENUITEM "&Çıkış", IDM_EXIT + MENUITEM "&Ayarlar...", IDM_OPTIONS + MENUITEM SEPARATOR + MENUITEM "&Hakkında", IDM_ABOUT + END +END + +IDC_MAGNIFIER ACCELERATORS +BEGIN + "?", IDM_ABOUT, ASCII, ALT + "/", IDM_ABOUT, ASCII, ALT +END + +IDD_ABOUTBOX DIALOGEX 22, 17, 220, 75 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU +CAPTION "Hakkında" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + ICON IDI_ICON,IDC_MYICON,14,9,20,20 + LTEXT "Büyüteç: Sürüm 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX + LTEXT "Telif Hakkı: 2007 - Marc Piulachs (marc.piulachs@codexchange.net)",IDC_STATIC,48,24,125,22 + PUSHBUTTON "Tamam",IDOK,162,48,50,14 +END + +IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Büyüteç Ayarları" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Çıkış",IDOK,96,161,50,14 + PUSHBUTTON "Yardım",IDC_BUTTON_HELP,38,161,50,14 + LTEXT "Büyütme düzeyi:",IDC_STATIC,6,8,68,8 + COMBOBOX IDC_ZOOM,72,6,63,66,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + GROUPBOX "İzleme",IDC_STATIC,7,25,139,59 + GROUPBOX "Sunum",IDC_STATIC,7,87,139,57 + CONTROL "Fare imlecini takip et",IDC_FOLLOWMOUSECHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,42,114,10 + CONTROL "Düğme takımı odağını izle",IDC_FOLLOWKEYBOARDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,54,114,10 + CONTROL "Metin düzenlemesini izle",IDC_FOLLOWTEXTEDITINGCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,66,114,10 + CONTROL "Renkleri ters çevir",IDC_INVERTCOLORSCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,102,114,10 + CONTROL "Simge durumunda başlat",IDC_STARTMINIMIZEDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,114,114,10 + CONTROL "Büyüteci göster",IDC_SHOWMAGNIFIERCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,126,114,10 +END + +IDD_WARNINGDIALOG DIALOGEX 0, 0, 250, 97 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION +CAPTION "ReactOS Büyüteç" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Tamam",IDOK,193,76,50,14 + ICON IDI_ICON,IDC_STATIC,7,17,20,20 + LTEXT "Büyüteç, hafif görme engelli kullanıcıların en az çaba harcamaları için tasarlanmıştır. Görme engelli bir çok kullanıcı, günlük kullanım için bu aracı kullanmaya gereksinim duyacaktır.",IDC_STATIC,36,7,207,33 + CONTROL "Bunu bir daha gösterme",IDC_SHOWWARNINGCHECK, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,43,80,137,10 +END + +STRINGTABLE +BEGIN + IDS_APP_TITLE "Büyüteç" +END diff --git a/base/applications/magnify/rsrc.rc b/base/applications/magnify/rsrc.rc index fa009b52be7..adea857be93 100644 --- a/base/applications/magnify/rsrc.rc +++ b/base/applications/magnify/rsrc.rc @@ -46,6 +46,9 @@ #ifdef LANGUAGE_SV_SE #include "lang/sv-SE.rc" #endif +#ifdef LANGUAGE_TR_TR + #include "lang/tr-TR.rc" +#endif #ifdef LANGUAGE_UK_UA #include "lang/uk-UA.rc" #endif diff --git a/base/applications/mplay32/lang/tr-TR.rc b/base/applications/mplay32/lang/tr-TR.rc new file mode 100644 index 00000000000..25c867e8fef --- /dev/null +++ b/base/applications/mplay32/lang/tr-TR.rc @@ -0,0 +1,30 @@ +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + +IDR_MAINMENU MENU +BEGIN + POPUP "&Kütük" + BEGIN + MENUITEM "&Aç...", IDM_OPEN_FILE + MENUITEM "&Kapat", IDM_CLOSE_FILE + MENUITEM SEPARATOR + MENUITEM "&Çıkış", IDM_EXIT + END + POPUP "&Yardım" + BEGIN + MENUITEM "&Hakkında", IDM_ABOUT + END +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ALL_TYPES_FILTER "Tüm Desteklenen Dosyalar (*.wav, *.cda, *.mid, *.midi, *.avi)\0*.wav;*.cda;*.mid;*.midi;*.avi\0" + IDS_TOOLTIP_PLAY "Çal" + IDS_TOOLTIP_STOP "Durdur" + IDS_TOOLTIP_EJECT "Çıkar" + IDS_TOOLTIP_BACKWARD "Bir Önceki" + IDS_TOOLTIP_SEEKBACK "Geri Sar" + IDS_TOOLTIP_SEEKFORW "İleri Sar" + IDS_TOOLTIP_FORWARD "Bir Sonraki" + IDS_APPTITLE "ReactOS Çokluortam Oynatıcısı" + IDS_PLAY "Çal" +END diff --git a/base/applications/mplay32/rsrc.rc b/base/applications/mplay32/rsrc.rc index 1f05683a0cb..5fe2c465b66 100644 --- a/base/applications/mplay32/rsrc.rc +++ b/base/applications/mplay32/rsrc.rc @@ -51,6 +51,9 @@ #ifdef LANGUAGE_SV_SE #include "lang/sv-SE.rc" #endif +#ifdef LANGUAGE_TR_TR + #include "lang/tr-TR.rc" +#endif #ifdef LANGUAGE_UK_UA #include "lang/uk-UA.rc" #endif diff --git a/base/applications/mscutils/devmgmt/lang/ja-JP.rc b/base/applications/mscutils/devmgmt/lang/ja-JP.rc index 77c2c389acf..213a8205a0e 100644 --- a/base/applications/mscutils/devmgmt/lang/ja-JP.rc +++ b/base/applications/mscutils/devmgmt/lang/ja-JP.rc @@ -1,4 +1,4 @@ -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT IDR_MAINMENU MENU BEGIN @@ -14,12 +14,12 @@ BEGIN MENUITEM SEPARATOR MENUITEM "ヘルプ", IDC_PROGHELP, GRAYED END - POPUP "表 示" + POPUP "表示" BEGIN MENUITEM "デバイス (種類別)", IDC_DEVBYTYPE MENUITEM "デバイス (接続別)", IDC_DEVBYCONN - MENUITEM "リソ ース (種類別)", IDC_RESBYTYPE, GRAYED - MENUITEM "リソ ース (接続別)", IDC_RESBYCONN, GRAYED + MENUITEM "リソース (種類別)", IDC_RESBYTYPE, GRAYED + MENUITEM "リソース (接続別)", IDC_RESBYCONN, GRAYED MENUITEM SEPARATOR MENUITEM "Show hidden devices", IDC_SHOWHIDDEN END @@ -72,8 +72,8 @@ BEGIN IDS_HINT_EXIT " このプログラムを終了します。" IDS_HINT_REFRESH " サービスのリストを更新します。" IDS_HINT_PROP " 現在選択されているシートのプロパティを開きます。" - IDS_HINT_HELP " ヘルプ ウィンドウを表 示します。" - IDS_HINT_ABOUT " ReactOS デバイス マネージャについて表 示します。" + IDS_HINT_HELP " ヘルプ ウィンドウを表示します。" + IDS_HINT_ABOUT " ReactOS デバイス マネージャについて表示します。" IDS_HINT_SYS_RESTORE " このウィンドウを通常の大きさに復元します。" IDS_HINT_SYS_MOVE " このウィンドウを移動します。" diff --git a/base/applications/mscutils/eventvwr/lang/ja-JP.rc b/base/applications/mscutils/eventvwr/lang/ja-JP.rc index 66d123d0f5b..88f0588c53a 100644 --- a/base/applications/mscutils/eventvwr/lang/ja-JP.rc +++ b/base/applications/mscutils/eventvwr/lang/ja-JP.rc @@ -18,7 +18,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "終了(&X)", IDM_EXIT END - POPUP "表 示(&V)" + POPUP "表示(&V)" BEGIN MENUITEM "更新(&R)", IDM_REFRESH END @@ -78,7 +78,7 @@ BEGIN LTEXT "Static",IDC_EVENTCOMPUTERSTATIC,56,54,72,8 LTEXT "イベントID:",IDC_STATIC,133,15,36,8 LTEXT "Static",IDC_EVENTIDSTATIC,175,15,87,8 - LTEXT "ソ ース:",IDC_STATIC,133,28,36,8 + LTEXT "ソース:",IDC_STATIC,133,28,36,8 LTEXT "Static",IDC_EVENTSOURCESTATIC,175,28,87,8 LTEXT "種類:",IDC_STATIC,133,42,36,8 LTEXT "Static",IDC_EVENTTYPESTATIC,175,42,87,8 @@ -93,7 +93,7 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "イベント ビューア" - IDS_EVENTSTRINGIDNOTFOUND "イベント ID (%lu) (ソ ース %s 内) に関する説明が見つかりませんでした。 リモート コンピュータからメッセージを表 示するために必要なレジストリ情報またはメッセージ DLL ファイルがローカル コンピュータにない可能 性があります。" + IDS_EVENTSTRINGIDNOTFOUND "イベント ID (%lu) (ソース %s 内) に関する説明が見つかりませんでした。 リモート コンピュータからメッセージを表示するために必要なレジストリ情報またはメッセージ DLL ファイルがローカル コンピュータにない可能性があります。" IDS_EVENTLOG_ERROR_TYPE "エラー" IDS_EVENTLOG_WARNING_TYPE "警告" IDS_EVENTLOG_INFORMATION_TYPE "情報" diff --git a/base/applications/mscutils/servman/lang/ja-JP.rc b/base/applications/mscutils/servman/lang/ja-JP.rc index c749d90a176..d035e73fda6 100644 --- a/base/applications/mscutils/servman/lang/ja-JP.rc +++ b/base/applications/mscutils/servman/lang/ja-JP.rc @@ -26,7 +26,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "プロパティ...", ID_PROP, GRAYED END - POPUP "表 示" + POPUP "表示" BEGIN MENUITEM "大きいアイコン", ID_VIEW_LARGE MENUITEM "小さいアイコン", ID_VIEW_SMALL @@ -89,7 +89,7 @@ BEGIN PUSHBUTTON "一時停止", IDC_PAUSE , 130, 155, 54, 15, WS_DISABLED PUSHBUTTON "再開", IDC_RESUME, 192, 155, 54, 15, WS_DISABLED LTEXT "サービス名:", IDC_STATIC, 4, 11, 53, 11 - LTEXT "表 示名:", IDC_STATIC, 4, 29, 53, 11 + LTEXT "表示名:", IDC_STATIC, 4, 29, 53, 11 LTEXT "説明:", IDC_STATIC, 4, 51, 53, 11 LTEXT "実行ファイルのパス:", IDC_STATIC, 6, 73, 82, 9 LTEXT "スタートアップの種類:", IDC_STATIC, 6, 108, 53, 11 @@ -124,7 +124,7 @@ BEGIN EDITTEXT IDC_CREATE_DESC, 10, 97, 210, 48, WS_CHILD | WS_VISIBLE EDITTEXT IDC_CREATE_OPTIONS, 10, 162, 210, 13, WS_CHILD | WS_VISIBLE LTEXT "*サービス名 :", IDC_STATIC, 12, 12, 54, 9 - LTEXT "*表 示名 :", IDC_STATIC, 12, 33, 54, 9 + LTEXT "*表示名 :", IDC_STATIC, 12, 33, 54, 9 LTEXT "*実行ファイルのパス :", IDC_STATIC, 10, 51, 68, 9 LTEXT "説明 :", IDC_STATIC, 12, 86, 44, 9 PUSHBUTTON "OK", IDOK, 126, 192, 44, 13 @@ -258,14 +258,14 @@ BEGIN IDS_HINT_DELETE " 選択したサービスを削除します。" IDS_HINT_PROP " 現在選択されている項目のプロパティ シートを開きます。" - IDS_HINT_LARGE " アイテムを大きいアイコンで表 示します。" - IDS_HINT_SMALL " アイテムを小さいアイコンで表 示します。" - IDS_HINT_LIST " アイテムを一覧で表 示します。" - IDS_HINT_DETAILS " 各アイテムの情報をウィンドウに表 示します。" - IDS_HINT_CUST " 表 示をカスタマイズします。" + IDS_HINT_LARGE " アイテムを大きいアイコンで表示します。" + IDS_HINT_SMALL " アイテムを小さいアイコンで表示します。" + IDS_HINT_LIST " アイテムを一覧で表示します。" + IDS_HINT_DETAILS " 各アイテムの情報をウィンドウに表示します。" + IDS_HINT_CUST " 表示をカスタマイズします。" - IDS_HINT_HELP " ヘルプ ウィンドウを表 示します。" - IDS_HINT_ABOUT " ReactOS サービス マネージャについて表 示します。" + IDS_HINT_HELP " ヘルプ ウィンドウを表示します。" + IDS_HINT_ABOUT " ReactOS サービス マネージャについて表示します。" IDS_HINT_SYS_RESTORE " このウィンドウを通常の大きさに復元します。" IDS_HINT_SYS_MOVE " このウィンドウを移動します。" diff --git a/base/applications/mspaint/lang/ja-JP.rc b/base/applications/mspaint/lang/ja-JP.rc index 37a8b4b18fe..4da051d1ac3 100644 --- a/base/applications/mspaint/lang/ja-JP.rc +++ b/base/applications/mspaint/lang/ja-JP.rc @@ -17,8 +17,8 @@ BEGIN MENUITEM "上書き保存(&S)\tCtrl+S", IDM_FILESAVE MENUITEM "名前を付けて保存(&A)...", IDM_FILESAVEAS MENUITEM SEPARATOR - MENUITEM "背景に設定 (並べて表 示)", IDM_FILEASWALLPAPERPLANE - MENUITEM "背景に設定 (中央に表 示)", IDM_FILEASWALLPAPERCENTERED + MENUITEM "背景に設定 (並べて表示)", IDM_FILEASWALLPAPERPLANE + MENUITEM "背景に設定 (中央に表示)", IDM_FILEASWALLPAPERCENTERED MENUITEM "背景に設定 (拡大)", IDM_FILEASWALLPAPERSTRETCHED MENUITEM SEPARATOR MENUITEM "ペイントの終了(&Q)\tAlt+F4", IDM_FILEEXIT @@ -31,16 +31,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "切り取り\tCtrl+X", IDM_EDITCUT MENUITEM "コピー\tCtrl+C", IDM_EDITCOPY - MENUITEM "貼 り付け\tCtrl+V", IDM_EDITPASTE + MENUITEM "貼り付け\tCtrl+V", IDM_EDITPASTE MENUITEM "選択範囲の削除\tDel", IDM_EDITDELETESELECTION MENUITEM "選択範囲の挿入", IDM_EDITINVERTSELECTION MENUITEM "すべて選択\tCtrl+A", IDM_EDITSELECTALL MENUITEM SEPARATOR MENUITEM "ファイルへコピー", IDM_EDITCOPYTO - MENUITEM "ファイルから貼 り付け", IDM_EDITPASTEFROM + MENUITEM "ファイルから貼り付け", IDM_EDITPASTEFROM END - POPUP "表 示(&V)" + POPUP "表示(&V)" BEGIN MENUITEM "ツール ボックス\tCtrl+T", IDM_VIEWTOOLBOX, CHECKED MENUITEM "カラー パレット\tCtrl+L", IDM_VIEWCOLORPALETTE, CHECKED @@ -60,10 +60,10 @@ BEGIN MENUITEM "800%", IDM_VIEWZOOM800 END MENUITEM SEPARATOR - MENUITEM "グリッドを表 示\tCtrl+G", IDM_VIEWSHOWGRID - MENUITEM "実寸表 示", IDM_VIEWSHOWMINIATURE + MENUITEM "グリッドを表示\tCtrl+G", IDM_VIEWSHOWGRID + MENUITEM "実寸表示", IDM_VIEWSHOWMINIATURE END - MENUITEM "全画面表 示\tCtrl+F", IDM_VIEWFULLSCREEN + MENUITEM "全画面表示\tCtrl+F", IDM_VIEWFULLSCREEN END POPUP "画像(&I)" @@ -179,7 +179,7 @@ BEGIN IDS_PROGRAMNAME, "ペイント" IDS_WINDOWTITLE, "%s - ペイント" IDS_INFOTITLE, "ReactOS ペイント" - IDS_INFOTEXT, "ReactOS ペイントは GNU Lesser General Public License (LGPL) version 3 (詳細は www.gnu.org)の下で利用可能 です。" + IDS_INFOTEXT, "ReactOS ペイントは GNU Lesser General Public License (LGPL) version 3 (詳細は www.gnu.org)の下で利用可能です。" IDS_SAVEPROMPTTEXT, "%s の変更内容を保存しますか?" IDS_DEFAULTFILENAME, "無題.bmp" IDS_MINIATURETITLE, "縮小図" diff --git a/base/applications/mspaint/lang/tr-TR.rc b/base/applications/mspaint/lang/tr-TR.rc new file mode 100644 index 00000000000..3fff8d85231 --- /dev/null +++ b/base/applications/mspaint/lang/tr-TR.rc @@ -0,0 +1,206 @@ +/* + * PROJECT: PAINT for ReactOS + * LICENSE: unknown (LGPL assumed) + * FILE: base/applications/mspaint/lang/tr-TR.rc + * PURPOSE: Turkish Language resource file + * TRANSLATORS: 2013 - Erdem Ersoy (eersoy93) + */ + +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + +ID_MENU MENU +BEGIN + POPUP "&Kütük" + BEGIN + MENUITEM "&Yeni\tCtrl+N", IDM_FILENEW + MENUITEM "&Aç...\tCtrl+O", IDM_FILEOPEN + MENUITEM "&Kaydet\tCtrl+S", IDM_FILESAVE + MENUITEM "Ay&rı Kaydet...", IDM_FILESAVEAS + MENUITEM SEPARATOR + MENUITEM "Döşeyerek Duvar Kağıdı Yap", IDM_FILEASWALLPAPERPLANE + MENUITEM "Ortalayarak Duvar Kağıdı Yap", IDM_FILEASWALLPAPERCENTERED + MENUITEM "Uzatarak Duvar Kağıdı Yap", IDM_FILEASWALLPAPERSTRETCHED + MENUITEM SEPARATOR + MENUITEM "&Çıkış\tAlt+F4", IDM_FILEEXIT + END + + POPUP "&Düzen" + BEGIN + MENUITEM "Geri Al\tCtrl+Z", IDM_EDITUNDO + MENUITEM "Yinele\tCtrl+Y", IDM_EDITREDO + MENUITEM SEPARATOR + MENUITEM "Kes\tCtrl+X", IDM_EDITCUT + MENUITEM "Çoğalt\tCtrl+C", IDM_EDITCOPY + MENUITEM "Yapıştır\tCtrl+V", IDM_EDITPASTE + MENUITEM "Seçimi Sil\tDel", IDM_EDITDELETESELECTION + MENUITEM "Seçimi Evir", IDM_EDITINVERTSELECTION + MENUITEM "Hepsini Seç\tCtrl+A", IDM_EDITSELECTALL + MENUITEM SEPARATOR + MENUITEM "Seçimi Şuraya Kopyala...", IDM_EDITCOPYTO + MENUITEM "Şuradan Yapıştır...", IDM_EDITPASTEFROM + END + + POPUP "&Görünüm" + BEGIN + MENUITEM "Araç Çubuğu\tCtrl+T", IDM_VIEWTOOLBOX, CHECKED + MENUITEM "Renklik\tCtrl+L", IDM_VIEWCOLORPALETTE, CHECKED + MENUITEM "Durum Çubuğu", IDM_VIEWSTATUSBAR, CHECKED + MENUITEM "Metin Çubuğu", IDM_FORMATICONBAR, CHECKED, GRAYED + MENUITEM SEPARATOR + POPUP "Büyüt" + BEGIN + POPUP "Kullanıcı Tanımlı" + BEGIN + MENUITEM "%12,5", IDM_VIEWZOOM125 + MENUITEM "%25", IDM_VIEWZOOM25 + MENUITEM "%50", IDM_VIEWZOOM50 + MENUITEM "%100", IDM_VIEWZOOM100 + MENUITEM "%200", IDM_VIEWZOOM200 + MENUITEM "%400", IDM_VIEWZOOM400 + MENUITEM "%800", IDM_VIEWZOOM800 + END + MENUITEM SEPARATOR + MENUITEM "Kılavuzu Göster\tCtrl+G", IDM_VIEWSHOWGRID + MENUITEM "Küçüğünü Göster", IDM_VIEWSHOWMINIATURE + END + MENUITEM "Tam Ekran\tCtrl+F", IDM_VIEWFULLSCREEN + END + + POPUP "G&örüntü" + BEGIN + MENUITEM "Döndür ya da Çevir...\tCtrl+R", IDM_IMAGEROTATEMIRROR + MENUITEM "Boyutlandır...\tCtrl+W", IDM_IMAGECHANGESIZE + MENUITEM "Kırp", IDM_IMAGECROP + MENUITEM "Renkleri Evir...\tCtrl+I", IDM_IMAGEINVERTCOLORS + MENUITEM "Öznitelikler\tCtrl+E", IDM_IMAGEATTRIBUTES + MENUITEM "Resmi Temizle\tCtrl+Shft+N", IDM_IMAGEDELETEIMAGE + MENUITEM "Donuk Çiz", IDM_IMAGEDRAWOPAQUE + END + + POPUP "R&enkler" + BEGIN + MENUITEM "Renkliği Düzenle...", IDM_COLORSEDITPALETTE + END + + POPUP "&Yardım" + BEGIN + MENUITEM "Yardım Konuları", IDM_HELPHELPTOPICS + MENUITEM SEPARATOR + MENUITEM "Hakkında", IDM_HELPINFO + END +END + +ID_ACCELERATORS ACCELERATORS +BEGIN + "^N", IDM_FILENEW + "^O", IDM_FILEOPEN + "^S", IDM_FILESAVE + "^Z", IDM_EDITUNDO + "^Y", IDM_EDITREDO + "^X", IDM_EDITCUT + "^C", IDM_EDITCOPY + "^V", IDM_EDITPASTE + VK_DELETE, IDM_EDITDELETESELECTION, VIRTKEY + "^A", IDM_EDITSELECTALL + "^T", IDM_VIEWTOOLBOX + "^L", IDM_VIEWCOLORPALETTE + "^G", IDM_VIEWSHOWGRID + "^F", IDM_VIEWFULLSCREEN + "^R", IDM_IMAGEROTATEMIRROR + "^W", IDM_IMAGECHANGESIZE + "^I", IDM_IMAGEINVERTCOLORS + "^E", IDM_IMAGEATTRIBUTES + "N", IDM_IMAGEDELETEIMAGE, CONTROL, SHIFT, VIRTKEY +END + +IDD_MIRRORROTATE DIALOGEX 100, 100, 180, 100 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "Resmi Döndür ya da Çevir" +BEGIN + GROUPBOX "Döndür ya da Çevir", IDD_MIRRORROTATEGROUP, 6, 6, 112, 86 + AUTORADIOBUTTON "Yatay Çevir", IDD_MIRRORROTATERB1, 12, 18, 100, 10, WS_GROUP + AUTORADIOBUTTON "Dikey Çevir", IDD_MIRRORROTATERB2, 12, 30, 100, 10 + AUTORADIOBUTTON "Açıyla Çevir", IDD_MIRRORROTATERB3, 12, 42, 100, 10 + AUTORADIOBUTTON "90°", IDD_MIRRORROTATERB4, 42, 54, 50, 10, WS_GROUP | WS_DISABLED + AUTORADIOBUTTON "180°", IDD_MIRRORROTATERB5, 42, 66, 50, 10, WS_DISABLED + AUTORADIOBUTTON "270°", IDD_MIRRORROTATERB6, 42, 78, 50, 10, WS_DISABLED + DEFPUSHBUTTON "Tamam", IDOK, 125, 8, 48, 14 + PUSHBUTTON "Vazgeç", IDCANCEL, 125, 24, 48, 14 +END + +IDD_ATTRIBUTES DIALOGEX 100, 100, 225, 120 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "Öznitelikler" +BEGIN + EDITTEXT IDD_ATTRIBUTESEDIT1, 48, 40, 35, 12 + EDITTEXT IDD_ATTRIBUTESEDIT2, 128, 40, 35, 12 + LTEXT "En:", IDD_ATTRIBUTESTEXT1, 10, 40, 35, 10 + LTEXT "Boy:", IDD_ATTRIBUTESTEXT2, 90, 40, 35, 10 + LTEXT "Kütüğün Zamanı:", IDD_ATTRIBUTESTEXT3, 10, 5, 60, 10 + LTEXT "Kütüğün Boyutu:", IDD_ATTRIBUTESTEXT4, 10, 15, 60, 10 + LTEXT "Çözünürlük:", IDD_ATTRIBUTESTEXT5, 10, 25, 60, 10 + LTEXT "(Daha yok.)", IDD_ATTRIBUTESTEXT6, 60, 5, 90, 10 + LTEXT "(Daha yok.)", IDD_ATTRIBUTESTEXT7, 60, 15, 90, 10 + LTEXT "(Daha yok.)", IDD_ATTRIBUTESTEXT8, 60, 25, 90, 10 + GROUPBOX "Birim", IDD_ATTRIBUTESGROUP1, 6, 57, 158, 27 + AUTORADIOBUTTON "İnç", IDD_ATTRIBUTESRB1, 12, 69, 45, 10, WS_GROUP + AUTORADIOBUTTON "cm", IDD_ATTRIBUTESRB2, 62, 69, 45, 10 + AUTORADIOBUTTON "Nokta", IDD_ATTRIBUTESRB3, 112, 69, 45, 10 + GROUPBOX "Renkler", IDD_ATTRIBUTESGROUP2, 6, 88, 158, 27 + AUTORADIOBUTTON "Siyah-beyaz", IDD_ATTRIBUTESRB4, 12, 100, 70, 10, WS_GROUP + AUTORADIOBUTTON "Renkli", IDD_ATTRIBUTESRB5, 92, 100, 35, 10 + DEFPUSHBUTTON "Tamam", IDOK, 170, 8, 48, 14 + PUSHBUTTON "Vazgeç", IDCANCEL, 170, 24, 48, 14 + PUSHBUTTON "Öntanımlı", IDD_ATTRIBUTESSTANDARD, 170, 40, 48, 14 +END + +IDD_CHANGESIZE DIALOGEX 100, 100, 225, 80 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "Boyutlandır" +BEGIN + GROUPBOX "Boyutlandır", IDD_CHANGESIZEGROUP, 6, 6, 158, 66 + ICON IDI_HORZSTRETCH, IDD_CHANGESIZEICON1, 12, 18, 32, 32 + LTEXT "Yatay:", IDD_CHANGESIZETEXT1, 45, 24, 40, 10 + EDITTEXT IDD_CHANGESIZEEDIT1, 90, 23, 32, 12 + LTEXT "%", IDD_CHANGESIZETEXT2, 125, 24, 15, 10 + ICON IDI_VERTSTRETCH, IDD_CHANGESIZEICON2, 12, 43, 32, 32 + LTEXT "Dikey:", IDD_CHANGESIZETEXT3, 45, 49, 40, 10 + EDITTEXT IDD_CHANGESIZEEDIT2, 90, 48, 32, 12 + LTEXT "%", IDD_CHANGESIZETEXT4, 125, 49, 15, 10 + DEFPUSHBUTTON "Tamam", IDOK, 170, 8, 48, 14 + PUSHBUTTON "Vazgeç", IDCANCEL, 170, 24, 48, 14 +END + +STRINGTABLE +BEGIN + IDS_PROGRAMNAME, "Görüntü Düzenleyicisi" + IDS_WINDOWTITLE, "%s - Görüntü Düzenleyicisi" + IDS_INFOTITLE, "ReactOS için Görüntü Düzenleyicisi" + IDS_INFOTEXT, "ReactOS için Görüntü Düzenleyicisi GNU Kısıtlı Genel Kamu Lisansı'nın (LGPL) 3. sürümüyle lisanslıdır. (bk: www.gnu.org)" + IDS_SAVEPROMPTTEXT, "%s için yapılan değişiklikler kaydedilsin mi?" + IDS_DEFAULTFILENAME, "Adsız.bmp" + IDS_MINIATURETITLE, "Küçüğü" + IDS_TOOLTIP1, "Özgür Seçim" + IDS_TOOLTIP2, "Dikdörtgen Seçim" + IDS_TOOLTIP3, "Silgi" + IDS_TOOLTIP4, "Boya Kabı" + IDS_TOOLTIP5, "Renk Seçici" + IDS_TOOLTIP6, "Büyüteç" + IDS_TOOLTIP7, "Kalem" + IDS_TOOLTIP8, "Fırça" + IDS_TOOLTIP9, "Püskürteç" + IDS_TOOLTIP10, "Metin" + IDS_TOOLTIP11, "Çizgi" + IDS_TOOLTIP12, "Kıvrım" + IDS_TOOLTIP13, "Dikdörtgen" + IDS_TOOLTIP14, "Çokgen" + IDS_TOOLTIP15, "Söbek" + IDS_TOOLTIP16, "Yuvarlatılmış Dikdörtgen" + IDS_OPENFILTER, "Bit Eşlem Görüntüleri (*.bmp;*.dib)\1*.bmp;*.dib\1Tüm Kütükler (*.*)\1*.*\1" + IDS_SAVEFILTER, "24-bit Bit Eşlem Görüntüsü(*.bmp;*.dib)\1*.bmp;*.dib\1" + IDS_FILESIZE, "%d sekizlik" + IDS_PRINTRES, "Her metrekarede %d x %d nokta" +END diff --git a/base/applications/mspaint/rsrc.rc b/base/applications/mspaint/rsrc.rc index 07a069d5d7d..c79b7c7155b 100644 --- a/base/applications/mspaint/rsrc.rc +++ b/base/applications/mspaint/rsrc.rc @@ -86,6 +86,9 @@ #ifdef LANGUAGE_SV_SE #include "lang/sv-SE.rc" #endif +#ifdef LANGUAGE_TR_TR + #include "lang/tr-TR.rc" +#endif #ifdef LANGUAGE_UK_UA #include "lang/uk-UA.rc" #endif diff --git a/base/applications/mstsc/lang/ja-JP.rc b/base/applications/mstsc/lang/ja-JP.rc index f0c0ac9070b..3704c795a40 100644 --- a/base/applications/mstsc/lang/ja-JP.rc +++ b/base/applications/mstsc/lang/ja-JP.rc @@ -27,11 +27,11 @@ BEGIN GROUPBOX "色",IDC_STATIC,7,83,228,85 ICON "", IDC_REMICON, 15,19,20,20 ICON "", IDC_COLORSICON, 15,98,20,20 - LTEXT "リモート デスクトップの画面サイズを設定してください。スライダのつまみを右端に動かすと、全画面表 示になります",IDC_STATIC,53,22,175,21 + LTEXT "リモート デスクトップの画面サイズを設定してください。スライダのつまみを右端に動かすと、全画面表示になります",IDC_STATIC,53,22,175,21 CONTROL "", IDC_GEOSLIDER, "msctls_trackbar32", TBS_AUTOTICKS | WS_TABSTOP, 56, 42, 124, 17 COMBOBOX IDC_BPPCOMBO,56,102,128,80, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP CONTROL "",IDC_COLORIMAGE,"Static",SS_OWNERDRAW | SS_SUNKEN, 56,121,127,10 - LTEXT "注意: この設定はリモート コンピュータの設定で上書きされる可能 性があります。",IDC_STATIC,56,143,165,18 + LTEXT "注意: この設定はリモート コンピュータの設定で上書きされる可能性があります。",IDC_STATIC,56,143,165,18 LTEXT "小",IDC_STATIC,35,42,15,8 LTEXT "大",IDC_STATIC,189,42,17,8 LTEXT "", IDC_SETTINGS_RESOLUTION_TEXT, 56, 62, 120, 10, SS_CENTER @@ -57,7 +57,7 @@ BEGIN IDS_HIGHCOLOR16 "65,536 色 (16 ビット)" IDS_HIGHCOLOR24 "16,777,216 色 (24 ビット)" IDS_PIXEL "%lu x %lu ピクセル" - IDS_FULLSCREEN "全画面表 示" + IDS_FULLSCREEN "全画面表示" IDS_BROWSESERVER "<参照...>" IDS_HEADERTEXT1 "リモート デスクトップ" IDS_HEADERTEXT2 "接続" diff --git a/base/applications/network/wlanconf/lang/de-DE.rc b/base/applications/network/wlanconf/lang/de-DE.rc new file mode 100644 index 00000000000..df90cd547fa --- /dev/null +++ b/base/applications/network/wlanconf/lang/de-DE.rc @@ -0,0 +1,41 @@ +LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +BEGIN +IDS_USAGE, "\nEinen WLAN Adapter konfigurieren.\n\n\ +WLANCONF [-c SSID [-w WEP] [-a]] [-d] [-s]\n\n\ +\t-c SSID\t\teine Verbindung mit der angegebenen\n\ +\t\t\tSSID herstellen \n\ +\t-w WEP\t\tden zu benutzenden WEP-Schlüssel angeben\n\ +\t-a\t\tals ad-hoc-Netzwerk konfigurieren\n\ +\t-d\t\tvom aktuellen Access Point trennen\n\ +\t-s\t\t scannt nach verfügbaren Access Points\n\ +\t\t\tin der Nähe.\n\n\ +Werden keine Parameter angegeben, werden Informationen zur WLAN-Verbindung ausgegeben.\n" +/* === */ +IDS_NO_NETWORK, "Keine Netzwerke gefunden.\n" +IDS_NO_WLAN_ADAPTER, "Es konnte kein WLAN Adapter gefunden werden.\n" +IDS_SUCCESS, "Die Operation wurde erfolgreich abgeschlossen.\n" +IDS_WLAN_DISCONNECT, "\nWLAN getrennt\n" +/* === */ +IDS_MSG_WEP_ENABLED, "WEP aktiv: %s\n" +IDS_MSG_NETWORK_MODE, "Netzwerkmodus: %s\n" +IDS_MSG_CURRENT_WIRELESS, "\nAktuelle WLAN-Konfiguration:\n\n" +IDS_MSG_ENCRYPTED, "Verschlüsselt: %s\n" +IDS_MSG_NETWORK_TYPE, "Netzwerktyp: %s\n" +IDS_MSG_RSSI, "RSSI: %i dBm\n" +IDS_MSG_SUPPORT_RATE, "Unterstützte Geschwindigkeiten (Mbps): " +IDS_MSG_TRANSMISSION_POWER, "Sendeleistung: %d mW\n" +IDS_MSG_ANTENNA_COUNT, "Anzahl der Antennen: %d\n" +IDS_MSG_TRANSMIT_ANTENNA, "Sendeantenne: %d\n" +IDS_MSG_TRANSMIT_ANTENNA_ANY, "Sendeantenne: beliebig\n" +IDS_MSG_RECEIVE_ANTENNA, "Empfangsantenne: %d\n" +IDS_MSG_RECEIVE_ANTENNA_ANY, "Empfangsantenne: beliebig\n" +IDS_MSG_FRAGMENT_THRESHOLD, "Fragmentierungsschwelle: %d Bytes\n" +IDS_MSG_RTS_THRESHOLD, "RTS-Schwelle: %d Bytes\n" +/* === */ +IDS_YES, "Ja" +IDS_NO, "Nein" +IDS_ADHOC, "Adhoc" +IDS_INFRASTRUCTURE, "Infrastruktur" +END diff --git a/base/applications/network/wlanconf/lang/it-IT.rc b/base/applications/network/wlanconf/lang/it-IT.rc new file mode 100644 index 00000000000..d1cff018097 --- /dev/null +++ b/base/applications/network/wlanconf/lang/it-IT.rc @@ -0,0 +1,40 @@ +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN +IDS_USAGE, "\nConfigurazione adattatore WLAN.\n\n\ +WLANCONF [-c SSID [-w WEP] [-a]] [-d] [-s]\n\n\ +\t-c SSID\t\tConnesso al SSID,\n\ +\t-w WEP\t\tSpecifica una chiave WEP da usare.\n\ +\t-a\t\tSpecifica la rete di destinazione ad-hoc\n\ +\t-d\t\tDisconneti dall'AP corrente.\n\ +\t-s\t\tEsegue la scansione e visualizza un elenco di punti di accesso\n\ +\t\t\tin range.\n\n\ +Non passando nessun parametro verranno stampate le informazioni relative alla connessione WLAN corrente\n" +/* === */ +IDS_NO_NETWORK, "Nessuna rete trovata\n" +IDS_NO_WLAN_ADAPTER, "Impossibile trovare un adattatore WLAN sul sistema\n" +IDS_SUCCESS, "Operazione completata con successo.\n" +IDS_WLAN_DISCONNECT, "\nWLAN disconnesso\n" +/* === */ +IDS_MSG_WEP_ENABLED, "WEP abilitato: %s\n" +IDS_MSG_NETWORK_MODE, "Modalità di rete: %s\n" +IDS_MSG_CURRENT_WIRELESS, "\Informazioni correnti per la configurazione wireless:\n\n" +IDS_MSG_ENCRYPTED, "Crittografia: %s\n" +IDS_MSG_NETWORK_TYPE, "Tipologia rete: %s\n" +IDS_MSG_RSSI, "RSSI: %i dBm\n" +IDS_MSG_SUPPORT_RATE, "Tariffe supportate (Mbps): " +IDS_MSG_TRANSMISSION_POWER, "Potenza Trasmissione: %d mW\n" +IDS_MSG_ANTENNA_COUNT, "Numero Antenne: %d\n" +IDS_MSG_TRANSMIT_ANTENNA, "Trasmissione antenna: %d\n" +IDS_MSG_TRANSMIT_ANTENNA_ANY, "Trasmissione antenna: Qualsiasi\n" +IDS_MSG_RECEIVE_ANTENNA, "Ricezione Antenna: %d\n" +IDS_MSG_RECEIVE_ANTENNA_ANY, "Ricezione Antenna: Qualsiasi\n" +IDS_MSG_FRAGMENT_THRESHOLD, "Soglia di Frammentazione: %d bytes\n" +IDS_MSG_RTS_THRESHOLD, "Soglia RTS: %d bytes\n" +/* === */ +IDS_YES, "Si" +IDS_NO, "No" +IDS_ADHOC, "Adhoc" +IDS_INFRASTRUCTURE, "Infrastruttura" +END diff --git a/base/applications/network/wlanconf/wlanconf.rc b/base/applications/network/wlanconf/wlanconf.rc index f8ebcca9b6f..c1af29a6350 100644 --- a/base/applications/network/wlanconf/wlanconf.rc +++ b/base/applications/network/wlanconf/wlanconf.rc @@ -5,13 +5,21 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #define REACTOS_STR_FILE_DESCRIPTION "ReactOS WLAN Configuration Tool\0" -#define REACTOS_STR_INTERNAL_NAME "wlanconf\0" +#define REACTOS_STR_INTERNAL_NAME "wlanconf\0" #define REACTOS_STR_ORIGINAL_FILENAME "wlanconf.exe\0" #define REACTOS_STR_ORIGINAL_COPYRIGHT "Cameron Gutman (cameron.gutman@reactos.org)\0" #include // UTF-8 #pragma code_page(65001) + +#ifdef LANGUAGE_DE_DE + #include "lang/de-DE.rc" +#endif #ifdef LANGUAGE_EN_US #include "lang/en-US.rc" #endif +#ifdef LANGUAGE_IT_IT + #include "lang/it-IT.rc" +#endif + diff --git a/base/applications/notepad/lang/ja-JP.rc b/base/applications/notepad/lang/ja-JP.rc index 6e043b96ed7..a193df514c7 100644 --- a/base/applications/notepad/lang/ja-JP.rc +++ b/base/applications/notepad/lang/ja-JP.rc @@ -61,7 +61,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "切り取り(&T)\tCtrl+X", CMD_CUT MENUITEM "コピー(&C)\tCtrl+C", CMD_COPY - MENUITEM "貼 り付け(&P)\tCtrl+V", CMD_PASTE + MENUITEM "貼り付け(&P)\tCtrl+V", CMD_PASTE MENUITEM "削除(&D)\tDel", CMD_DELETE MENUITEM SEPARATOR MENUITEM "検索(&F)...\tCtrl+F", CMD_SEARCH @@ -77,7 +77,7 @@ BEGIN MENUITEM "右端で折り返す(&W)", CMD_WRAP MENUITEM "フォント(&F)...", CMD_FONT END - POPUP "表 示(&V)" + POPUP "表示(&V)" BEGIN MENUITEM "ステータス バー(&B)", CMD_STATUSBAR END diff --git a/base/applications/notepad/lang/tr-TR.rc b/base/applications/notepad/lang/tr-TR.rc index 4d429533418..453d8a09d2c 100644 --- a/base/applications/notepad/lang/tr-TR.rc +++ b/base/applications/notepad/lang/tr-TR.rc @@ -1,10 +1,8 @@ -/* +/* * Notepad (Turkish resources) * - * Copyright 1997,98 Marcel Baur - * Proofread 1998 by David Lee Lambert - * Copyright 2002 Sylvain Petreolle - * Çeviri 2012 Arda Tanrıkulu + * Copyright 2012 Arda Tanrıkulu + * Copyright 2013 Erdem Ersoy (eersoy93) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -43,81 +41,80 @@ END MAIN_MENU MENU BEGIN - POPUP "&Dosya" + POPUP "&Kütük" BEGIN - MENUITEM "&Yeni\tCtrl+N", CMD_NEW - MENUITEM "&Aç...\tCtrl+O", CMD_OPEN + MENUITEM "&Yeni\tCtrl+N", CMD_NEW + MENUITEM "&Aç...\tCtrl+O", CMD_OPEN MENUITEM "&Kaydet\tCtrl+S", CMD_SAVE - MENUITEM "&Farklı Kaydet...", CMD_SAVE_AS + MENUITEM "Ay&rı Kaydet...", CMD_SAVE_AS MENUITEM SEPARATOR MENUITEM "&Sayfa Yapısı...", CMD_PAGE_SETUP - MENUITEM "&Yazdır\tCtrl+P", CMD_PRINT - MENUITEM "&Yazıcı Ayarları...", CMD_PRINTER_SETUP + MENUITEM "Ya&zdır...\tCtrl+P", CMD_PRINT + MENUITEM "Yaz&ıcı Ayarları...", CMD_PRINTER_SETUP MENUITEM SEPARATOR - MENUITEM "&Çıkış", CMD_EXIT + MENUITEM "&Çıkış", CMD_EXIT END POPUP "&Düzen" BEGIN - MENUITEM "&Geri Al\tCtrl+Z", CMD_UNDO + MENUITEM "&Geri Al\tCtrl+Z", CMD_UNDO MENUITEM SEPARATOR MENUITEM "&Kes\tCtrl+X", CMD_CUT - MENUITEM "K&opyala\tCtrl+C", CMD_COPY - MENUITEM "Y&apıştır\tCtrl+V", CMD_PASTE - MENUITEM "&Sil\tDel", CMD_DELETE + MENUITEM "&Çoğalt\tCtrl+C", CMD_COPY + MENUITEM "&Yapıştır\tCtrl+V", CMD_PASTE + MENUITEM "&Sil\tDel", CMD_DELETE MENUITEM SEPARATOR - MENUITEM "&Bul...\tCtrl+F", CMD_SEARCH - MENUITEM "Son&rakini Bul\tF3", CMD_SEARCH_NEXT - MENUITEM "&Değiştir\tCtrl+H", CMD_REPLACE - MENUITEM "G&it...\tCtrl+G", CMD_GOTO + MENUITEM "&Ara...\tCtrl+F", CMD_SEARCH + MENUITEM "S&onrakini Ara\tF3", CMD_SEARCH_NEXT + MENUITEM "&Değiştir...\tCtrl+H",CMD_REPLACE + MENUITEM "G&it...\tCtrl+G", CMD_GOTO MENUITEM SEPARATOR MENUITEM "&Tümünü Seç\tCtrl+A", CMD_SELECT_ALL - MENUITEM "Saat/Tari&h\tF5", CMD_TIME_DATE + MENUITEM "&Zaman\tF5", CMD_TIME_DATE END POPUP "&Biçim" BEGIN - MENUITEM "&Sözcük Kaydır", CMD_WRAP - MENUITEM "&Yazı Tipi...", CMD_FONT + MENUITEM "&Satır Kaydır", CMD_WRAP + MENUITEM "&Yazı Türü...", CMD_FONT END POPUP "&Görünüm" BEGIN - MENUITEM "&Durum çubuğu", CMD_STATUSBAR + MENUITEM "&Durum Çubuğu", CMD_STATUSBAR END POPUP "&Yardım" BEGIN - MENUITEM "&Yardım Konuları", CMD_HELP_CONTENTS - MENUITEM "&Ara...", CMD_HELP_SEARCH - MENUITEM "&Yardımda yardım", CMD_HELP_ON_HELP + MENUITEM "&Yardım Konuları", CMD_HELP_CONTENTS + MENUITEM "Yardımda &Ara...", CMD_HELP_SEARCH + MENUITEM "Yardım &İçin Yardım", CMD_HELP_ON_HELP MENUITEM SEPARATOR - MENUITEM "&Not Defteri &Hakkında", CMD_ABOUT - MENUITEM "Bil&gi", CMD_ABOUT_WINE + MENUITEM "&Hakkında", CMD_ABOUT + MENUITEM "&Bilgi", CMD_ABOUT_WINE END END /* Dialog `Page setup' */ - 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ı" BEGIN -LTEXT "Üst&bilgi:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "Altbil&gi:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "Üst &Bilgi:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&Alt Bilgi:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP -GROUPBOX "&Kenar Boşlukları:", 0x144, 10, 43,160, 45 -LTEXT "S&ol:", 0x145, 20, 55, 30, 10, WS_CHILD +GROUPBOX "Kenar Payı:", 0x144, 10, 43,160, 45 +LTEXT "S&ol:", 0x145, 20, 55, 30, 10, WS_CHILD EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Üst:", 0x148, 20, 73, 30, 10, WS_CHILD +LTEXT "&Üst:", 0x148, 20, 73, 30, 10, WS_CHILD EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Sağ:", 0x14B, 100, 55, 30, 10, WS_CHILD +LTEXT "&Sağ:", 0x14B, 100, 55, 30, 10, WS_CHILD EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "A<:", 0x14E, 100, 73, 30, 10, WS_CHILD +LTEXT "A<:", 0x14E, 100, 73, 30, 10, WS_CHILD EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -DEFPUSHBUTTON "Tamam", IDOK, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "İptal", IDCANCEL, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Yardım", IDHELP, 180, 39, 40, 15, WS_TABSTOP +DEFPUSHBUTTON "&Tamam", IDOK, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "&Vazgeç", IDCANCEL, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Yardım", IDHELP, 180, 39, 40, 15, WS_TABSTOP END /* Dialog `Encoding' */ @@ -129,31 +126,31 @@ BEGIN COMBOBOX ID_ENCODING,54,0,156,80,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "K&odlama:",0x155,5,2,41,12 COMBOBOX ID_EOLN,54,18,156,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP -LTEXT "Sonhatlar:",0x156,5,20,41,12 +LTEXT "&Sonlanma:",0x156,5,20,41,12 END /* Dialog 'Go To' */ DIALOG_GOTO DIALOGEX 0,0,165,50 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" -CAPTION "Satıra git" +CAPTION "Satıra Git" BEGIN EDITTEXT ID_LINENUMBER,54,10,106,12,WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Satır No:",0x155,5,12,41,12,WS_CHILD | WS_TABSTOP | ES_NUMBER -DEFPUSHBUTTON "Tamam", IDOK, 75, 30, 40, 15, WS_CHILD | WS_TABSTOP -PUSHBUTTON "İptal", IDCANCEL, 120, 30, 40, 15, WS_CHILD | WS_TABSTOP +LTEXT "Satır No:",0x155,5,12,41,12,WS_CHILD | WS_TABSTOP | ES_NUMBER +DEFPUSHBUTTON "&Tamam", IDOK, 75, 30, 40, 15, WS_CHILD | WS_TABSTOP +PUSHBUTTON "&Vazgeç", IDCANCEL, 120, 30, 40, 15, WS_CHILD | WS_TABSTOP END IDD_ABOUTBOX DIALOGEX DISCARDABLE 22,16,284,170 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Not Defteri Hakkında" +CAPTION "ReactOS Metin Düzenleyicisi Hakkında" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "ReactOS Not Defteri v1.0\r\nCopyright 1997,98 Marcel Baur \r\nCopyright 2000 Mike McCormack \r\nCopyright 2002 Sylvain Petreolle \r\nCopyright 2002 Andriy Palamarchuk\r\n", + CONTROL "ReactOS Metin Düzenleyicisi - Sürüm: 1.0\r\nTelif Hakkı: 1997,98 Marcel Baur (mbaur@g26.ethz.ch)\r\nTelif Hakkı: 2000 Mike McCormack (Mike_McCormack@looksmart.com.au)\r\nTelif Hakkı: 2002 Sylvain Petreolle (spetreolle@yahoo.fr)\r\nTelif Hakkı: 2002 Andriy Palamarchuk\r\n", -1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,46,7,232,39 CONTROL " ", -1,"Static",0x50000000,8,48,272,11 - DEFPUSHBUTTON "Kapat",IDOK,114,149,44,15,WS_GROUP + DEFPUSHBUTTON "&Tamam",IDOK,114,149,44,15,WS_GROUP ICON IDI_NPICON,-1,12,9,20,30 EDITTEXT IDC_LICENSE,8,64,272,81,ES_MULTILINE | ES_READONLY | WS_VSCROLL @@ -161,7 +158,7 @@ END STRINGTABLE DISCARDABLE BEGIN - STRING_LICENSE, "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." + STRING_LICENSE, "ÖNEMLİ: Aşağıdaki metin özgün metnin resmi olmayan çevirisidir. Çeviri metniyle özgün metin arasında ayrım olabilir. Özgün metin çeviri metninin altındadır.\r\n\r\n***\r\n\r\nBu yazılım özgürdür, yani bu yazılım Özgür Yazılım Vakfı'nın yayınladığı GNU Genel Kamu Lisansı'nın 2. sürümü veya daha sonraki sürümleri altında yeniden dağıtabilir veya değiştirebilirsiniz.\r\n\r\nBu yazılım, kullanışlı olabileceği umuduyla dağıtılmıştır, ancak özellikle SATILABİLİRLİK ve BELİRLİ BİR AMACA UYGUNLUK açısından olmak üzere bu yazılımın hiçbir güvencesi yoktur. Daha fazla bilgi için GNU Genel Kamu Lisansı'na bakınız.\r\n\r\nBu yazılımla birlikte GNU Genel Kamu Lisansı'nın bir sûretine de iye olmanız gerekir, eğer yoksa Özgür Yazılım Vakfı A.Ş.'ne (51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 ABD) yazınız. \r\n\r\n***\r\n\r\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." END STRINGTABLE DISCARDABLE @@ -173,29 +170,29 @@ STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ -STRING_NOTEPAD, "Not Defteri" +STRING_NOTEPAD, "Metin Düzenleyicisi" STRING_ERROR, "HATA" STRING_WARNING, "UYARI" STRING_INFO, "Bilgi" STRING_UNTITLED, "Adsız" -STRING_ALL_FILES, "Tüm dosyalar (*.*)" -STRING_TEXT_FILES_TXT, "Metin dosyaları (*.txt)" +STRING_ALL_FILES, "Tüm Kütükler (*.*)" +STRING_TEXT_FILES_TXT, "Metin Belgeleri (*.txt)" -STRING_TOOLARGE, "'%s' dosyası Not Defteri için çok büyük.\n\nBu dosyayı düzenlemek için başka bir düzenleyici kullanın." -STRING_NOTEXT, "Hiçbirşey yazmadınız." -STRING_DOESNOTEXIST, "'%s' dosyası bulunamıyor.\n\nYeni bir dosya yaratmak ister misiniz?" -STRING_NOTSAVED, " dosyasındaki metin değişmiş.\n\nDeğişiklikleri kaydetmek istiyor musunuz?" -STRING_NOTFOUND, "'%s' bulunamıyor." -STRING_OUT_OF_MEMORY, "Bu işlemi tamamlamak için yetersiz bellek. Kullanılabilen belleği arttırmak için bir veya daha fazla uygulamadan çıkıp yeniden deneyin." -STRING_CANNOTFIND "'%s' bulunamıyor" +STRING_TOOLARGE, "'%s' kütüğü Metin Düzenleyicisi için çok büyük. Bu kütüğü düzenlemek için başka bir metin düzenleyicisi kullanınız." +STRING_NOTEXT, "Hiçbir şey yazmadınız. Lütfen bir şeyler yazıp yeniden deneyiniz." +STRING_DOESNOTEXIST, "'%s' kütüğü mevcut değil. Yeni bir kütük oluşturmak ister misiniz?" +STRING_NOTSAVED, "'%s' kütüğündeki metin değiştirilmiş. Değişiklikleri kaydetmek istiyor musunuz?" +STRING_NOTFOUND, "'%s' kütüğü bulunamadı." +STRING_OUT_OF_MEMORY, "Bu işlemi tamamlamak için gereken bellek yetersiz. Kullanılabilen belleği arttırmak için bir veya daha fazla uygulamadan çıkıp bu işlemi yeniden deneyiniz." +STRING_CANNOTFIND "'%s' bulunamadı." STRING_ANSI, "ANSI" STRING_UNICODE, "Unicode" -STRING_UNICODE_BE, "Unicode (big endian)" +STRING_UNICODE_BE, "Unicode (Big Endian)" STRING_UTF8, "UTF-8" STRING_CRLF, "Windows" -STRING_LF, "Unix" +STRING_LF, "UNIX" STRING_CR, "Mac" -STRING_LINE_COLUMN, "St %d, Stn %d" +STRING_LINE_COLUMN, "%d. Satır, %d. Sütun" END diff --git a/base/applications/regedit/lang/it-IT.rc b/base/applications/regedit/lang/it-IT.rc index cc4d1509581..f356be56b01 100644 --- a/base/applications/regedit/lang/it-IT.rc +++ b/base/applications/regedit/lang/it-IT.rc @@ -64,7 +64,7 @@ BEGIN ID_REGISTRY_CONNECTNETWORKREGISTRY MENUITEM "&Disconnetti da Registro di rete...", - ID_REGISTRY_DISCONNECTNETWORKREGISTRY,GRAYED + ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED MENUITEM SEPARATOR MENUITEM "&Stampa\tCtrl+P", ID_REGISTRY_PRINT, GRAYED MENUITEM SEPARATOR @@ -227,7 +227,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | CAPTION "Modifica DWORD" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Name:",IDC_STATIC,6,6,134,8 + LTEXT "&Nome:",IDC_STATIC,6,6,134,8 EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY LTEXT "&Dati:",IDC_STATIC,6,35,161,8 EDITTEXT IDC_VALUE_DATA,6,46,116,12,ES_AUTOHSCROLL @@ -242,43 +242,43 @@ END IDD_EDIT_RESOURCE_LIST DIALOGEX 32, 24, 170, 120 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Resource List" +CAPTION "Lista Risorse" FONT 8, "MS Shell Dlg" { CONTROL "", IDC_RESOURCE_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 10, 150, 75 DEFPUSHBUTTON "OK", IDOK, 27, 100, 50, 14 - PUSHBUTTON "Show...", IDC_SHOW_RESOURCE, 93, 100, 50, 14, WS_DISABLED + PUSHBUTTON "Visualizza...", IDC_SHOW_RESOURCE, 93, 100, 50, 14, WS_DISABLED } IDD_EDIT_RESOURCE DIALOGEX 6, 18, 281, 283 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Resources" +CAPTION "Risorse" FONT 8, "MS Shell Dlg" { LTEXT "DMA:", IDC_STATIC, 10, 5, 20, 8 CONTROL "", IDC_DMA_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 15, 261, 31 - LTEXT "Interrupt:", IDC_STATIC, 10, 48, 35, 8 + LTEXT "Interruzione:", IDC_STATIC, 10, 48, 35, 8 CONTROL "", IDC_IRQ_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 58, 261, 31 - LTEXT "Memory:", IDC_STATIC, 10, 91, 32, 8 + LTEXT "Memoria:", IDC_STATIC, 10, 91, 32, 8 CONTROL "", IDC_MEMORY_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 101, 261, 31 - LTEXT "Port:", IDC_STATIC, 10, 134, 38, 8 + LTEXT "Porta:", IDC_STATIC, 10, 134, 38, 8 CONTROL "", IDC_PORT_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 144, 261, 31 - LTEXT "Device specific data:", IDC_STATIC, 10, 177, 80, 8 + LTEXT "Dati specifici del dispositivo", IDC_STATIC, 10, 177, 80, 8 CONTROL "", IDC_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 188, 261, 31 - GROUPBOX "Usage", IDC_STATIC, 10, 219, 125, 39 - LTEXT "Undetermined", IDC_UNDETERMINED, 18, 230, 46, 8, WS_DISABLED - LTEXT "Shared", IDC_SHARED, 18, 240, 48, 8, WS_DISABLED - LTEXT "Device exclusive", IDC_DEVICE_EXCLUSIVE, 72, 230, 58, 8, WS_DISABLED - LTEXT "Driver exclusive", IDC_DRIVER_EXCLUSIVE, 72, 240, 54, 8, WS_DISABLED - RTEXT "Interface Type:", IDC_STATIC, 144, 220, 58, 8 + GROUPBOX "Utilizzo", IDC_STATIC, 10, 219, 125, 39 + LTEXT "Indeterminato", IDC_UNDETERMINED, 18, 230, 46, 8, WS_DISABLED + LTEXT "Condividi", IDC_SHARED, 18, 240, 48, 8, WS_DISABLED + LTEXT "Device esclusivo", IDC_DEVICE_EXCLUSIVE, 72, 230, 58, 8, WS_DISABLED + LTEXT "Driver esclusivo", IDC_DRIVER_EXCLUSIVE, 72, 240, 54, 8, WS_DISABLED + RTEXT "Tipo di interfaccia:", IDC_STATIC, 144, 220, 58, 8 LTEXT "", IDC_INTERFACETYPE, 205, 220, 66, 8 RTEXT "Bus Nummer:", IDC_STATIC, 151, 230, 51, 8 LTEXT "", IDC_BUSNUMBER, 205, 230, 66, 8 - RTEXT "Version:", IDC_STATIC, 151, 240, 51, 8 + RTEXT "Versione:", IDC_STATIC, 151, 240, 51, 8 LTEXT "", IDC_VERSION, 205, 240, 66, 8 - RTEXT "Revision:", IDC_STATIC, 151, 250, 51, 8 + RTEXT "Revisione:", IDC_STATIC, 151, 250, 51, 8 LTEXT "", IDC_REVISION, 205, 250, 66, 8 DEFPUSHBUTTON "OK",IDOK, 92, 263, 40, 14 PUSHBUTTON "&Data...", IDC_SHOW_RESOURCE_DATA, 148, 263, 40, 14, WS_DISABLED @@ -306,7 +306,7 @@ END STRINGTABLE DISCARDABLE BEGIN ID_REGISTRY_MENU "Contiene i comandi per lavorare su tutto il Registro" - ID_EDIT_MENU "Contiene i comandi per editare valori o chiavi" + ID_EDIT_MENU "Contiene i comandi per modificare valori o chiavi" ID_VIEW_MENU "Contiene i comandi per personalizzare la finestra del Registro" ID_FAVOURITES_MENU "Contiene i comandi per accedere alle chiavi usate frequentemente" ID_HELP_MENU "Contiene i comandi per visualizzare la Guida e informazioni sull'editor del Registro" @@ -324,9 +324,9 @@ BEGIN ID_REGISTRY_EXPORTREGISTRYFILE "Esporta tutto o parte del Registro in un file di testo" ID_REGISTRY_LOADHIVE - "Loads a hive file into the registry" + "Carica un file hive nel Registro di sistema" ID_REGISTRY_UNLOADHIVE - "Unloads a hive from the registry" + "Espelle un hive dal Registro di sistema" ID_REGISTRY_CONNECTNETWORKREGISTRY "Si connette al Registro di un computer remoto" ID_REGISTRY_DISCONNECTNETWORKREGISTRY @@ -370,23 +370,23 @@ BEGIN IDS_ERR_DELETEVALUE "Impossibile cancellare tutti i valori indicati!" IDS_ERR_RENVAL_CAPTION "Errore nel rinominare il valore" IDS_ERR_RENVAL_TOEMPTY "Impossibile rinominare %s. Il nome indicato è vuoto. Riprovate con un altro nome." - IDS_QUERY_IMPORT_HIVE_CAPTION "Confirm Key Restoration" - IDS_QUERY_IMPORT_HIVE_MSG "A key will be restored on top of the currently selected key.\nAll values and subkeys of this key will be deleted.\nDo you want to continue the operation?" + IDS_QUERY_IMPORT_HIVE_CAPTION "Conferma ripristino della chiave" + IDS_QUERY_IMPORT_HIVE_MSG "Una chiave sarà ripristinata in cima alla chiave correntemente selezionata.\n Tutti i valori e le sottochiavi di questa chiave verranno eliminati.\n Si desidera continuare l'operazione?" IDS_NEW_KEY "Nuova chiave #%d" IDS_NEW_VALUE "Nuovo valore #%d" END STRINGTABLE DISCARDABLE BEGIN - IDS_BINARY_EMPTY "(valore binario di lunghezza nulla)" + IDS_BINARY_EMPTY "(valore binario di lunghezza nulla)" IDS_DEFAULT_VALUE_NAME "(predefinito)" IDS_VALUE_NOT_SET "(valore non impostato)" IDS_UNKNOWN_TYPE "Tipo sconosciuto: (0x%lx)" IDS_MY_COMPUTER "Il mio Computer" IDS_IMPORT_REG_FILE "Importa file di Registro" IDS_EXPORT_REG_FILE "Esporta file di Registro" - IDS_LOAD_HIVE "Load Hive" - IDS_UNLOAD_HIVE "Unload Hive" + IDS_LOAD_HIVE "Carica Hive" + IDS_UNLOAD_HIVE "Scarica Hive" IDS_INVALID_DWORD "(valore DWORD non valido)" END @@ -436,48 +436,48 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_IMPORT_PROMPT "Adding information can unintentionally change or delete values and cause components to stop working correctly.\nIf you do not trust the source of this information in '%s', do not add it to registry.\n\nAre you sure you want to continue?" - IDS_IMPORT_OK "The keys and values contained in '%s' have been successfully added to the registry." - IDS_IMPORT_ERROR "Cannot import '%s': Error opening the file. There may be a disk, file system error or file may not exist." - IDS_EXPORT_ERROR "Cannot export '%s': Error creating or writing to the file. There may be a disk or file system error." + IDS_IMPORT_PROMPT "Aggiungendo informazioni si possono involontariamente modificare o eliminare i valori e causare il giusto funzionamente dei componenti.\n Se non si considera attendibile la fonte di queste informazioni in '% s', non aggiungere al Registro di sistema.\n\n Si desidera continuare? " + IDS_IMPORT_OK "Le chiavi e i valori contenuti in '% s' sono stati correttamente aggiunti al Registro di sistema." + IDS_IMPORT_ERROR "Impossibile importare '% s': Errore durante l'apertura del file. Ci può essere un disco, file cdanneggiati o il file non esiste." + IDS_EXPORT_ERROR "Impossibile esportare '% s': Errore durante la creazione o la scrittura del file. Ci può essere un disco o un file di sistema danneggiato." END STRINGTABLE DISCARDABLE BEGIN IDS_BUSNUMBER "Bus Number" - IDS_INTERFACE "Interface" - IDS_DMA_CHANNEL "Channel" - IDS_DMA_PORT "Port" - IDS_INTERRUPT_VECTOR "Vector" - IDS_INTERRUPT_LEVEL "Level" - IDS_INTERRUPT_AFFINITY "Affinity" - IDS_INTERRUPT_TYPE "Type" - IDS_MEMORY_ADDRESS "Physical Address" - IDS_MEMORY_LENGTH "Length" - IDS_MEMORY_ACCESS "Access" - IDS_PORT_ADDRESS "Physical Address" - IDS_PORT_LENGTH "Length" - IDS_PORT_ACCESS "Access" - IDS_SPECIFIC_RESERVED1 "Reserved 1" - IDS_SPECIFIC_RESERVED2 "Reserved 2" - IDS_SPECIFIC_DATASIZE "Data Size" + IDS_INTERFACE "Interfaccia" + IDS_DMA_CHANNEL "Canale" + IDS_DMA_PORT "Porta" + IDS_INTERRUPT_VECTOR "Vettore" + IDS_INTERRUPT_LEVEL "Livello" + IDS_INTERRUPT_AFFINITY "Affinità" + IDS_INTERRUPT_TYPE "Tipo" + IDS_MEMORY_ADDRESS "Indirizzo fisico" + IDS_MEMORY_LENGTH "Lunghezza" + IDS_MEMORY_ACCESS "Accesso" + IDS_PORT_ADDRESS "Indirizzo fisico" + IDS_PORT_LENGTH "Lunghezza" + IDS_PORT_ACCESS "Accesso" + IDS_SPECIFIC_RESERVED1 "Riservato 1" + IDS_SPECIFIC_RESERVED2 "Riservato 2" + IDS_SPECIFIC_DATASIZE "Lunghezza dati" END STRINGTABLE DISCARDABLE BEGIN - IDS_PORT_PORT_IO "Port" - IDS_PORT_MEMORY_IO "Memory" - IDS_INTERRUPT_EDGE_SENSITIVE "Edge Sensitive" - IDS_INTERRUPT_LEVEL_SENSITIVE "Level Sensitive" - IDS_MEMORY_READ_ONLY "Read Only" - IDS_MEMORY_WRITE_ONLY "Write Only" - IDS_MEMORY_READ_WRITE "Read / Write" + IDS_PORT_PORT_IO "Porta" + IDS_PORT_MEMORY_IO "Memoria" + IDS_INTERRUPT_EDGE_SENSITIVE "Sensibile al fronte" + IDS_INTERRUPT_LEVEL_SENSITIVE "Sensibile al livello" + IDS_MEMORY_READ_ONLY "Solo lettura" + IDS_MEMORY_WRITE_ONLY "Solo scrittura" + IDS_MEMORY_READ_WRITE "Leggi / Scrivi" END STRINGTABLE DISCARDABLE BEGIN - IDS_BUS_UNDEFINED "Undefined" - IDS_BUS_INTERNAL "Internal" + IDS_BUS_UNDEFINED "Indefinito" + IDS_BUS_INTERNAL "Interno" IDS_BUS_ISA "ISA" IDS_BUS_EISA "EISA" IDS_BUS_MICROCHANNEL "MicroChannel" @@ -489,11 +489,11 @@ BEGIN IDS_BUS_CBUS "C-Bus" IDS_BUS_MPIBUS "MPI-Bus" IDS_BUS_MPSABUS "MPSA-Bus" - IDS_BUS_PROCESSORINTERNAL "Processor Internal" + IDS_BUS_PROCESSORINTERNAL "Processore Interno" IDS_BUS_INTERNALPOWERBUS "Internal Power Bus" IDS_BUS_PNPISABUS "PnP-ISA Bus" IDS_BUS_PNPBUS "PnP Bus" - IDS_BUS_UNKNOWNTYPE "Unknown Interface Type" + IDS_BUS_UNKNOWNTYPE "Tipologia interfaccia sconosciuta" END /*****************************************************************/ @@ -513,15 +513,18 @@ BEGIN EDITTEXT IDC_EXPORT_BRANCH_TEXT,30,34,335,12 END +// +// Dialog resources +// IDD_LOADHIVE DIALOGEX DISCARDABLE 0, 0, 193, 34 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Load Hive" +CAPTION "Carica Hive" FONT 8, "Ms Shell Dlg" { - LTEXT "&Key:", IDC_STATIC, 4, 4, 15, 8, SS_LEFT + LTEXT "&Chiave:", IDC_STATIC, 4, 4, 15, 8, SS_LEFT EDITTEXT IDC_EDIT_KEY, 23, 2, 167, 13 DEFPUSHBUTTON "OK", IDOK, 140, 17, 50, 14 - PUSHBUTTON "Cancel", IDCANCEL, 89, 17, 50, 14 + PUSHBUTTON "Annulla", IDCANCEL, 89, 17, 50, 14 } IDD_ADDFAVORITES DIALOGEX DISCARDABLE 0, 0, 186, 46 diff --git a/base/applications/regedit/lang/ja-JP.rc b/base/applications/regedit/lang/ja-JP.rc index 7e2fb12ba1a..49390f63c5f 100644 --- a/base/applications/regedit/lang/ja-JP.rc +++ b/base/applications/regedit/lang/ja-JP.rc @@ -164,7 +164,7 @@ BEGIN BEGIN MENUITEM "切り取り(&C)", ID_HEXEDIT_CUT MENUITEM "コピー(&C)", ID_HEXEDIT_COPY - MENUITEM "貼 り付け(&P)", ID_HEXEDIT_PASTE + MENUITEM "貼り付け(&P)", ID_HEXEDIT_PASTE MENUITEM "削除(&D)", ID_HEXEDIT_DELETE MENUITEM SEPARATOR MENUITEM "すべて選択(&A)", ID_HEXEDIT_SELECT_ALL diff --git a/base/applications/regedit/rsrc.rc b/base/applications/regedit/rsrc.rc index 18c7452196f..7805baa78c6 100644 --- a/base/applications/regedit/rsrc.rc +++ b/base/applications/regedit/rsrc.rc @@ -25,6 +25,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL /* include localised resources */ // UTF-8 #pragma code_page(65001) + #ifdef LANGUAGE_BG_BG #include "lang/bg-BG.rc" #endif diff --git a/base/applications/shutdown/lang/it-IT.rc b/base/applications/shutdown/lang/it-IT.rc index 3396e0bf775..ea1a5611718 100644 --- a/base/applications/shutdown/lang/it-IT.rc +++ b/base/applications/shutdown/lang/it-IT.rc @@ -3,27 +3,27 @@ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL /* Dialog */ IDD_GUI DIALOGEX DISCARDABLE 0, 0, 240, 255 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Remote Shutdown" +CAPTION "Accesso remoto" FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "&OK",IDC_OK,125,232,50,14 PUSHBUTTON "&Cancel",IDC_CANCEL,178,232,50,14 CTEXT "Co&mputers:", IDC_STATIC,9,9,35,36 LISTBOX IDC_COMPUTER_LIST,8,19,162,55 - PUSHBUTTON "&Add...",IDC_ADD_SYSTEM,179,19,50,14 - PUSHBUTTON "&Remove",IDC_REMOVE_SYSTEM,179,36,50,14,WS_DISABLED - PUSHBUTTON "&Browse...",IDC_BROWSE_SYSTEM,179,53,50,14 - CTEXT "Which action do you want these computers to execute?", IDC_ACTION,14,81,20,14 + PUSHBUTTON "&Aggiungi...",IDC_ADD_SYSTEM,179,19,50,14 + PUSHBUTTON "&Rimuovi...",IDC_REMOVE_SYSTEM,179,36,50,14,WS_DISABLED + PUSHBUTTON "&Naviga...",IDC_BROWSE_SYSTEM,179,53,50,14 + CTEXT "quale azione si vuole eseguire?", IDC_ACTION,14,81,20,14 COMBOBOX IDC_ACTION_TYPE,37,79,129,14,WS_TABSTOP | CBS_DROPDOWN - CHECKBOX "Warn users",IDC_WARN_USERS,178,79,50,14,BS_AUTOCHECKBOX | WS_TABSTOP - CTEXT "Display warning for",IDC_SHOW_WARN_ONE,11,99,65,14 + CHECKBOX "Avvio all'utente",IDC_WARN_USERS,178,79,50,14,BS_AUTOCHECKBOX | WS_TABSTOP + CTEXT "Visualizza avviso per",IDC_SHOW_WARN_ONE,11,99,65,14 EDITTEXT IDC_SHOW_WARN,78,97,41,14 - CTEXT "second(s)",IDC_SHOW_WARN_TWO,124,99,32,10 - GROUPBOX "Shutdown Event Tracker",IDC_STATIC,5,114,224,114 - CTEXT "Reason:",IDC_STATIC,16,130,27,8 - CHECKBOX "Planned",IDC_PLANNED,175,130,40,12,BS_AUTOCHECKBOX | WS_TABSTOP + CTEXT "secondi(s)",IDC_SHOW_WARN_TWO,124,99,32,10 + GROUPBOX "Individuazione evento di arresto",IDC_STATIC,5,114,224,114 + CTEXT "Ragione:",IDC_STATIC,16,130,27,8 + CHECKBOX "Progettato",IDC_PLANNED,175,130,40,12,BS_AUTOCHECKBOX | WS_TABSTOP COMBOBOX IDC_REASON_CODE,17,142,198,13,WS_TABSTOP | CBS_DROPDOWN - CTEXT "Comm&ent:",IDC_COMMENT_CAPTION,17,159,30,8 + CTEXT "Comm&ento:",IDC_COMMENT_CAPTION,17,159,30,8 EDITTEXT IDC_COMMENT_TEXT,17,171,198,50,WS_VSCROLL END @@ -35,69 +35,69 @@ BEGIN Usage: shutdown [/?] [/i | /l | /s | /r | /g | /a | /p | /h | /e] [/f]\n\ [/m \\\\computer][/t xxx][/d [p|u:]xx:yy [/c ""comment""]]\n\ \n\ - No arguments or /? Display this help.\n\ - /i Show the graphical user interface (GUI). This option must be the\n\ - first one.\n\ - /l Log off on the local system only. Cannot be used with /m or /d.\n\ - /s Shutdown the computer.\n\ - /r Restart the computer.\n\ - /g Restart the computer and restart all the registered applications.\n\ - /a Cancel a delayed shutdown. Can only be used during the delay\n\ - period.\n\ - /p Shutdown the local computer without any timeout or warning. Can be\n\ - used with /d or /f.\n\ - /h Hibernate the local computer. Usable with /f.\n\ - /e Document the reason for the unexpected computer shutdown.\n\ - /m \\\\computer Specify the target computer (UNC/IP address).\n\ - /t xxx Set the timeout period to xxx seconds before shutting down.\n\ - The valid range starts from 0 to 315360000 (10 years),\n\ - 30 being the default value.\n\ - /c ""comment"" Comment on the reason for shutdown or restart.\n\ - 512 characters maximum allowed.\n\ - /f Force running applications to close without warning users. If you\n\ - do not specify any other parameter, this option will also log off.\n\ - /d [p|u:]xx:yy Give the reason code for the shutdown or the restart.\n\ - p indicates that the shutdown or the restart is planned.\n\ - u indicates that the reason is defined by the user.\n\ - If neither p nor u are specified, the shutdown or the restart are\n\ - not planned.\n\ - xx is the major reason code (positive integer smaller than 256).\n\ - yy is the minor reason code (positive integer smaller than 65536).\n" + Non ci sono argomenti o/? Visualizza aiuti.\n\ + /i Mostra l'interfaccia utente grafica (GUI). Questa opzione deve essere la \n\ + prima.\n\ + /l Disconnessione dal sistema locale. Non può essere utilizzata con /m or /d.\n\ + /s Chiusura del computer.\n\ + /r Riavvio del computer.\n\ + /g Riavvio del computer e riavvio di tutte le applicazioni registrate.\n\ + /a cancellare un arresto ritardato. Può essere utilizzato solo durante il periodo\n\ + di ritardo.\n\ + /p Spegnere il computer locale senza alcun timeout o avviso. Può essere\n\ + utilizzato con /d or /f.\n\ + /h Sospensione del computer locale. Utilizzabile con /f.\n\ + /e Documento e il motivo dell'arresto del computer inatteso.\n\ + /m \\\\computer Specificare la destinazione del computer (UNC/IP address).\n\ + /t xxx Imposta il periodo di timeout di xxx secondi prima di spegnersi.\n\ + L'intervallo valido inizia 0-315360000 (10 anni),\n\ + 30 è il valore di default.\n\ + /c ""comment"" Commento sul motivo per cui spegnere o riavviare.\n\ + 512 caratteri massimi consentiti.\n\ + /f Forzare la chiusura delle applicazioni in esecuzione senza che avvertire gli utenti. Se\n\ + non è specificato un'altro parametro, questa opzione è valida anche per la disconnessione.\n\ + /d [p|u:]xx:yy Indicare il codice motivo per l'arresto o il riavvio.\n\ + p indica che l'arresto o il riavvio è previsto.\n\ + u indica che il motivo è definito dall'utente.\n\ + Se nè p nè u vengono specificati, l'arresto o il riavvio non sono\n\ + pianificati.\n\ + xx è il codice maggiore (numero intero positivo inferiore a 256).\n\ + yy è il codice minore (numero intero positivo inferiore a 65536).\n" - IDS_ERROR_SHUTDOWN_REBOOT, "ERROR: Unable to shutdown and restart at the same time.\n" - IDS_ERROR_TIMEOUT, "ERROR: Timeout value of %u is out of bounds (0-315360000).\n" - IDS_ERROR_ABORT, "ERROR: Unable to abort the shutdown of the system.\n" - IDS_ERROR_LOGOFF, "ERROR: Unable to logoff the system.\n" - IDS_ERROR_SHUTDOWN, "ERROR: Unable to shutdown the system.\n" - IDS_ERROR_RESTART, "ERROR: Unable to restart the system.\n" - IDS_ERROR_MAX_COMMENT_LENGTH, "ERROR: Comment length exceeds maximum character limit set by the system.\n" - IDS_ERROR_HIBERNATE, "ERROR: Unable to send system into hibernation mode.\n" - IDS_ERROR_HIBERNATE_LOCAL, "ERROR: Hibernation mode cannot be started remotely.\n" - IDS_ERROR_HIBERNATE_ENABLED, "ERROR: Hibernation mode is not enabled.\n" - IDS_ERROR_DIALOG_CAPTION, "Remote Shutdown" - IDS_ERROR_DIALOG_INIT, "Unable to display the graphical user interface." + IDS_ERROR_SHUTDOWN_REBOOT, "ERROR: Impossibile arrestare e riavviare al tempo stesso.\n" + IDS_ERROR_TIMEOUT, "ERROR: Il valore di timeout di u% è fuori dai limiti (0-315360000) \n" + IDS_ERROR_ABORT, "ERROR: Impossibile interrompere l'arresto del sistema \n." + IDS_ERROR_LOGOFF, "ERROR: Impossibile disconnettersi dal sistema \n" + IDS_ERROR_SHUTDOWN, "ERROR: Impossibile arrestare il sistema \n." + IDS_ERROR_RESTART, "ERROR: Impossibile riavviare il sistema \n." + IDS_ERROR_MAX_COMMENT_LENGTH, "ERROR: Lunghezza commento supera il limite massimo di caratteri impostato dal sistema \n" + IDS_ERROR_HIBERNATE, "ERROR: Impossibile avviare il sistema in modalità di sospensione. \n" + IDS_ERROR_HIBERNATE_LOCAL, "ERROR: Modalitài sospensione non può essere avviata in modalità remota \n" + IDS_ERROR_HIBERNATE_ENABLED, "ERROR: Modalità di sospensione non è abilitata \n" + IDS_ERROR_DIALOG_CAPTION, "Arresto improviso" + IDS_ERROR_DIALOG_INIT, "Impossibile visualizzare l'interfaccia utente grafica." END /* Remote shutdown action strings */ STRINGTABLE DISCARDABLE BEGIN - IDS_ACTION_SHUTDOWN, "Shutdown the system" - IDS_ACTION_RESTART, "Restart the system" - IDS_ACTION_UNEXPECTED_SHUTDOWN, "Annotate the unexpected shutdown" + IDS_ACTION_SHUTDOWN, "Esci dal sistema" + IDS_ACTION_RESTART, "Riavvia il sistema" + IDS_ACTION_UNEXPECTED_SHUTDOWN, "Arresto improviso" END /* Remote shutdown reason strings */ STRINGTABLE DISCARDABLE BEGIN - IDS_REASON_OTHER, "Other" - IDS_REASON_HARDWARE_MAINTENANCE, "Hardware: Maintenance" - IDS_REASON_HARDWARE_INSTALL, "Hardware: Installation" - IDS_REASON_OS_RECOVER, "Operating System: Recovery" - IDS_REASON_OS_RECONFIGURE, "Operating System: Reconfigure" - IDS_REASON_APP_MAINTENANCE, "Application: Maintenance" - IDS_REASON_APP_INSTALL, "Application: Installation" - IDS_REASON_APP_UNRESPONSIVE, "Application: Unresponsive" - IDS_REASON_APP_UNSTABLE, "Application: Unstable" - IDS_REASON_SECURITY, "Security Issue" - IDS_REASON_NETWORK, "Loss of network connectivity" + IDS_REASON_OTHER, "Altro" + IDS_REASON_HARDWARE_MAINTENANCE, "Hardware: Manutenzione" + IDS_REASON_HARDWARE_INSTALL, "Hardware: Installazione" + IDS_REASON_OS_RECOVER, "Sistema Operativo System: Recupero" + IDS_REASON_OS_RECONFIGURE, "Sistema Operativo: Riconfigurazione" + IDS_REASON_APP_MAINTENANCE, "Applicazione: Manutenzione" + IDS_REASON_APP_INSTALL, "Applicazione: Installazione" + IDS_REASON_APP_UNRESPONSIVE, "Applicazione: Non Risponde" + IDS_REASON_APP_UNSTABLE, "Applicazione: Instabile" + IDS_REASON_SECURITY, "Problema di sicurezza" + IDS_REASON_NETWORK, "Connetività di rete assente" END diff --git a/base/applications/sndrec32/lang/en-US.rc b/base/applications/sndrec32/lang/en-US.rc index 60179d7dbef..1491ed75180 100644 --- a/base/applications/sndrec32/lang/en-US.rc +++ b/base/applications/sndrec32/lang/en-US.rc @@ -36,13 +36,13 @@ BEGIN END END -STRINGTABLE +STRINGTABLE BEGIN IDS_APP_TITLE "Sound recorder" IDC_REACTOS_SNDREC32 "REACTOS_SNDREC32" END -STRINGTABLE +STRINGTABLE BEGIN IDS_STRPOS "Position: %.2f s" IDS_STRDUR "Lenght: %.2f s" diff --git a/base/applications/sndrec32/lang/tr-TR.rc b/base/applications/sndrec32/lang/tr-TR.rc new file mode 100644 index 00000000000..cc24ae968ed --- /dev/null +++ b/base/applications/sndrec32/lang/tr-TR.rc @@ -0,0 +1,54 @@ +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + +IDC_REACTOS_SNDREC32 ACCELERATORS +BEGIN + "?", IDM_ABOUT, ASCII, ALT + "/", IDM_ABOUT, ASCII, ALT +END + +IDD_ABOUTBOX DIALOGEX 0, 0, 196, 75 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Ses Kaydedicisi Hakkında" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + ICON IDI_SNDREC32,-1,19,14,21,20 + LTEXT "ReactOS Ses Kaydedicisi, sürüm 1.0",IDC_STATIC,56,16,114,8,SS_NOPREFIX + LTEXT "Tekif Hakkı - 2009",IDC_STATIC,55,25,114,8 + DEFPUSHBUTTON "&Tamam",IDOK,139,54,50,14,WS_GROUP +END + +IDR_MENU1 MENU +BEGIN + POPUP "&Kütük" + BEGIN + MENUITEM "&Yeni", ID_NEW + MENUITEM "&Aç...", ID_FILE_OPEN + MENUITEM "&Kaydet", ID_FILE_SAVE, GRAYED + MENUITEM "Ay&rı Kaydet...", ID_FILE_SAVEAS, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Çıkış", ID_EXIT + END + MENUITEM "Yapılacak", 0 + MENUITEM "Yapılacak_2", 0 + POPUP "&Yardım" + BEGIN + MENUITEM "&Hakkında", ID__ABOUT + END +END + +STRINGTABLE +BEGIN + IDS_APP_TITLE "Ses Kaydedicisi" + IDC_REACTOS_SNDREC32 "REACTOS_SNDREC32" +END + +STRINGTABLE +BEGIN + IDS_STRPOS "Konum: %.2f s" + IDS_STRDUR "Uzunluk: %.2f s" + IDS_STRBUF "Nitelik: %.2f KB" + IDS_STRFMT "%.1f kHz, %u bitlik" + IDS_STRMONO "Tek Yol" + IDS_STRSTEREO "Çift Yol" + IDS_STRCHAN "%s" +END diff --git a/base/applications/sndrec32/rsrc.rc b/base/applications/sndrec32/rsrc.rc index 1a7a23a0e1a..41d7cc1679d 100644 --- a/base/applications/sndrec32/rsrc.rc +++ b/base/applications/sndrec32/rsrc.rc @@ -47,14 +47,17 @@ IDB_BITMAP2_STOP_DIS BITMAP "resources/but_stop_dis.bmp" #ifdef LANGUAGE_PL_PL #include "lang/pl-PL.rc" #endif +#ifdef LANGUAGE_RO_RO + #include "lang/ro-RO.rc" +#endif #ifdef LANGUAGE_SK_SK #include "lang/sk-SK.rc" #endif #ifdef LANGUAGE_SV_SE #include "lang/sv-SE.rc" #endif -#ifdef LANGUAGE_RO_RO - #include "lang/ro-RO.rc" +#ifdef LANGUAGE_TR_TR + #include "lang/tr-TR.rc" #endif #ifdef LANGUAGE_UK_UA #include "lang/uk-UA.rc" diff --git a/base/applications/sndvol32/lang/ja-JP.rc b/base/applications/sndvol32/lang/ja-JP.rc index 33f3f48d21f..4d6d248874d 100644 --- a/base/applications/sndvol32/lang/ja-JP.rc +++ b/base/applications/sndvol32/lang/ja-JP.rc @@ -35,7 +35,7 @@ BEGIN PUSHBUTTON "録音(&R)", IDC_RECORDING, 13,61,47,8, BS_AUTORADIOBUTTON PUSHBUTTON "その他(&O):", IDC_OTHER, 13,80,42,8, BS_AUTORADIOBUTTON | WS_DISABLED COMBOBOX IDC_LINE, 55,80,155,50, CBS_DROPDOWNLIST | WS_TABSTOP | WS_DISABLED - LTEXT "表 示するコントロール:", IDC_LABELCONTROLS, 7, 109, 162, 8 + LTEXT "表示するコントロール:", IDC_LABELCONTROLS, 7, 109, 162, 8 CONTROL "", IDC_CONTROLS, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | WS_TABSTOP | WS_BORDER, 7, 122, 211, 96 PUSHBUTTON "OK", IDOK, 114,226,50,14 diff --git a/base/applications/taskmgr/lang/ja-JP.rc b/base/applications/taskmgr/lang/ja-JP.rc index 119d399e3f0..69b13de1654 100644 --- a/base/applications/taskmgr/lang/ja-JP.rc +++ b/base/applications/taskmgr/lang/ja-JP.rc @@ -10,16 +10,16 @@ BEGIN END POPUP "オプション(&O)" BEGIN - MENUITEM "常に手前に表 示(&A)", ID_OPTIONS_ALWAYSONTOP + MENUITEM "常に手前に表示(&A)", ID_OPTIONS_ALWAYSONTOP , CHECKED MENUITEM "未使用時に最小化(&M)", ID_OPTIONS_MINIMIZEONUSE , CHECKED MENUITEM "最小化時に隠す(&H)", ID_OPTIONS_HIDEWHENMINIMIZED , CHECKED - MENUITEM "16 ビット タスクの表 示(&S)", ID_OPTIONS_SHOW16BITTASKS + MENUITEM "16 ビット タスクの表示(&S)", ID_OPTIONS_SHOW16BITTASKS , CHECKED END - POPUP "表 示(&V)" + POPUP "表示(&V)" BEGIN MENUITEM "最新の状態に更新(&R)", ID_VIEW_REFRESH POPUP "更新の頻度(&U)" @@ -43,16 +43,16 @@ BEGIN MENUITEM "CPU ごとに 1 グラフ(&P)", ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU , CHECKED END - MENUITEM "カーネル時間を表 示する(&S)", ID_VIEW_SHOWKERNELTIMES + MENUITEM "カーネル時間を表示する(&S)", ID_VIEW_SHOWKERNELTIMES END POPUP "ウィンドウ(&W)" BEGIN - MENUITEM "上下に並べて表 示(&H)", ID_WINDOWS_TILEHORIZONTALLY - MENUITEM "左右に並べて表 示(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "上下に並べて表示(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "左右に並べて表示(&V)", ID_WINDOWS_TILEVERTICALLY MENUITEM "最小化(&M)", ID_WINDOWS_MINIMIZE MENUITEM "最大化(&X)", ID_WINDOWS_MAXIMIZE - MENUITEM "重ねて表 示(&C)", ID_WINDOWS_CASCADE - MENUITEM "手前に表 示(&B)", ID_WINDOWS_BRINGTOFRONT + MENUITEM "重ねて表示(&C)", ID_WINDOWS_CASCADE + MENUITEM "手前に表示(&B)", ID_WINDOWS_BRINGTOFRONT END POPUP "ヘルプ(&H)" BEGIN @@ -64,12 +64,12 @@ END IDR_WINDOWSMENU MENU DISCARDABLE BEGIN - MENUITEM "上下に並べて表 示(&H)", ID_WINDOWS_TILEHORIZONTALLY - MENUITEM "左右に並べて表 示(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "上下に並べて表示(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "左右に並べて表示(&V)", ID_WINDOWS_TILEVERTICALLY MENUITEM "最小化(&M)", ID_WINDOWS_MINIMIZE MENUITEM "最大化(&X)", ID_WINDOWS_MAXIMIZE - MENUITEM "重ねて表 示(&C)", ID_WINDOWS_CASCADE - MENUITEM "手前に表 示(&B)", ID_WINDOWS_BRINGTOFRONT + MENUITEM "重ねて表示(&C)", ID_WINDOWS_CASCADE + MENUITEM "手前に表示(&B)", ID_WINDOWS_BRINGTOFRONT END IDR_APPLICATION_PAGE_CONTEXT1 MENU DISCARDABLE @@ -89,16 +89,16 @@ BEGIN POPUP "DUMMY" BEGIN MENUITEM "切り替え(&S)", ID_APPLICATION_PAGE_SWITCHTO - MENUITEM "手前に表 示(&B)", ID_WINDOWS_BRINGTOFRONT + MENUITEM "手前に表示(&B)", ID_WINDOWS_BRINGTOFRONT MENUITEM SEPARATOR - MENUITEM "上下に並べて表 示(&H)", ID_WINDOWS_TILEHORIZONTALLY - MENUITEM "左右に並べて表 示(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "上下に並べて表示(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "左右に並べて表示(&V)", ID_WINDOWS_TILEVERTICALLY MENUITEM "最小化(&M)", ID_WINDOWS_MINIMIZE MENUITEM "最大化(&X)", ID_WINDOWS_MAXIMIZE - MENUITEM "重ねて表 示(&C)", ID_WINDOWS_CASCADE + MENUITEM "重ねて表示(&C)", ID_WINDOWS_CASCADE MENUITEM SEPARATOR MENUITEM "タスクの終了(&E)", ID_APPLICATION_PAGE_ENDTASK - MENUITEM "プロセスの表 示(&G)", ID_APPLICATION_PAGE_GOTOPROCESS + MENUITEM "プロセスの表示(&G)", ID_APPLICATION_PAGE_GOTOPROCESS END END @@ -110,7 +110,7 @@ BEGIN MENUITEM "元のサイズに戻す(&R)", ID_RESTORE MENUITEM "閉じる(&C)", ID_FILE_EXIT MENUITEM SEPARATOR - MENUITEM "常に手前に表 示(&A)", ID_OPTIONS_ALWAYSONTOP + MENUITEM "常に手前に表示(&A)", ID_OPTIONS_ALWAYSONTOP END END @@ -180,7 +180,7 @@ BEGIN LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "プロセスの終了(&E)",IDC_ENDPROCESS,171,189,69,14 - CONTROL "全ユーザーのプロセスを表 示する(&S)",IDC_SHOWALLPROCESSES, + CONTROL "全ユーザーのプロセスを表示する(&S)",IDC_SHOWALLPROCESSES, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,191,111,10 END @@ -233,8 +233,8 @@ BEGIN ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP GROUPBOX "CPU 使用率の履歴",IDC_CPU_USAGE_HISTORY_FRAME,74,5,168,54,0,WS_EX_TRANSPARENT GROUPBOX "メモリ使用量の履歴",IDC_MEMORY_USAGE_HISTORY_FRAME,74,63,168,54,0,WS_EX_TRANSPARENT - PUSHBUTTON "CPU 使用率の表 示",IDC_CPU_USAGE_GRAPH,12,17,47,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE - PUSHBUTTON "メモリ使用量の表 示",IDC_MEM_USAGE_GRAPH,12,75,47,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE + PUSHBUTTON "CPU 使用率の表示",IDC_CPU_USAGE_GRAPH,12,17,47,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE + PUSHBUTTON "メモリ使用量の表示",IDC_MEM_USAGE_GRAPH,12,75,47,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE PUSHBUTTON "CPU 使用率の履歴",IDC_CPU_USAGE_HISTORY_GRAPH,81,17, 153,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE PUSHBUTTON "メモリ使用量の履歴",IDC_MEM_USAGE_HISTORY_GRAPH,81,75, @@ -334,7 +334,7 @@ FONT 9, "MS UI Gothic" BEGIN DEFPUSHBUTTON "OK",IDOK,84,178,50,14 PUSHBUTTON "キャンセル",IDCANCEL,138,178,50,14 - LTEXT "タスク マネージャの [プロセス] ページに表 示する列を選択します。", + LTEXT "タスク マネージャの [プロセス] ページに表示する列を選択します。", IDC_STATIC,7,7,181,17 CONTROL "イメージ名(&I)",IDC_IMAGENAME,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,7,28,56,10 @@ -517,41 +517,41 @@ END STRINGTABLE DISCARDABLE BEGIN ID_FILE_NEW "新しいプログラムを実行します" - ID_OPTIONS_ALWAYSONTOP "最小化されない限り、常にタスク マネージャがほかのすべてのウィンドウよりも手前に表 示されます" + ID_OPTIONS_ALWAYSONTOP "最小化されない限り、常にタスク マネージャがほかのすべてのウィンドウよりも手前に表示されます" ID_OPTIONS_MINIMIZEONUSE "[切り替え] 操作を実行すると、タスク マネージャが最小化されます" ID_OPTIONS_HIDEWHENMINIMIZED "最小化されたときに、タスク マネージャを隠します" ID_VIEW_REFRESH "[更新の頻度] の設定にかかわらず、今すぐタスク マネージャを更新します" - ID_VIEW_LARGE "大きいアイコンを使ってタスクを表 示します" - ID_VIEW_SMALL "小さいアイコンを使ってタスクを表 示します" - ID_VIEW_DETAILS "各タスクの情報を表 示します" - ID_VIEW_UPDATESPEED_HIGH "毎秒 2 回表 示を更新します" - ID_VIEW_UPDATESPEED_NORMAL "2 秒に 1 回表 示を更新します" - ID_VIEW_UPDATESPEED_LOW "4 秒に 1 回表 示を更新します" + ID_VIEW_LARGE "大きいアイコンを使ってタスクを表示します" + ID_VIEW_SMALL "小さいアイコンを使ってタスクを表示します" + ID_VIEW_DETAILS "各タスクの情報を表示します" + ID_VIEW_UPDATESPEED_HIGH "毎秒 2 回表示を更新します" + ID_VIEW_UPDATESPEED_NORMAL "2 秒に 1 回表示を更新します" + ID_VIEW_UPDATESPEED_LOW "4 秒に 1 回表示を更新します" END STRINGTABLE DISCARDABLE BEGIN - ID_VIEW_UPDATESPEED_PAUSED "表 示を自動的に更新しません" + ID_VIEW_UPDATESPEED_PAUSED "表示を自動的に更新しません" ID_WINDOWS_TILEHORIZONTALLY - "デスクトップ上でウィンドウを重ならないように上下に並べて表 示します" - ID_WINDOWS_TILEVERTICALLY "デスクトップ上でウィンドウを重ならないように左右に並べて表 示します" + "デスクトップ上でウィンドウを重ならないように上下に並べて表示します" + ID_WINDOWS_TILEVERTICALLY "デスクトップ上でウィンドウを重ならないように左右に並べて表示します" ID_WINDOWS_MINIMIZE "ウィンドウを最小化します" ID_WINDOWS_MAXIMIZE "ウィンドウを最大化します" - ID_WINDOWS_CASCADE "デスクトップ上でウィンドウを重ねて表 示します" - ID_WINDOWS_BRINGTOFRONT "ウィンドウを手前に表 示しますが、切り替えません。" - ID_HELP_TOPICS "タスク マネージャのヘルプ トピックを表 示します" - ID_HELP_ABOUT "プログラム情報、バージョン番号、著作権を表 示します" + ID_WINDOWS_CASCADE "デスクトップ上でウィンドウを重ねて表示します" + ID_WINDOWS_BRINGTOFRONT "ウィンドウを手前に表示しますが、切り替えません。" + ID_HELP_TOPICS "タスク マネージャのヘルプ トピックを表示します" + ID_HELP_ABOUT "プログラム情報、バージョン番号、著作権を表示します" ID_FILE_EXIT "タスク マネージャ アプリケーションを終了します" ID_OPTIONS_SHOW16BITTASKS - "16 ビット タスクを、関連付けられた ntvdm.exe の下に表 示します" - ID_VIEW_SELECTCOLUMNS "[プロセス] ページに表 示する列を選択します" - ID_VIEW_SHOWKERNELTIMES "カーネル時間をパフォーマンス グラフ上に表 示します" + "16 ビット タスクを、関連付けられた ntvdm.exe の下に表示します" + ID_VIEW_SELECTCOLUMNS "[プロセス] ページに表示する列を選択します" + ID_VIEW_SHOWKERNELTIMES "カーネル時間をパフォーマンス グラフ上に表示します" ID_VIEW_CPUHISTORY_ONEGRAPHALL - "1 つの履歴グラフで CPU 使用率の合計を表 示します" - ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU "CPU 使用率の履歴を CPU ごとにグラフで表 示します" + "1 つの履歴グラフで CPU 使用率の合計を表示します" + ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU "CPU 使用率の履歴を CPU ごとにグラフで表示します" ID_APPLICATION_PAGE_SWITCHTO - "タスクを手前に表 示し、フォーカスを切り替えます" + "タスクを手前に表示し、フォーカスを切り替えます" END STRINGTABLE DISCARDABLE @@ -611,7 +611,7 @@ BEGIN IDS_TAB_IOWRITESBYTES "I/O 書き込みバイト数" IDS_TAB_IOOTHERBYTES "I/O その他のバイト数" IDS_MENU_SELECTCOLUMNS "列の選択(&S)..." - IDS_MENU_16BITTASK "16 ビット タスクの表 示(&S)" + IDS_MENU_16BITTASK "16 ビット タスクの表示(&S)" IDS_MENU_WINDOWS "ウィンドウ(&W)" IDS_MENU_LARGEICONS "大きいアイコン(&G)" IDS_MENU_SMALLICONS "小さいアイコン(&M)" @@ -619,19 +619,19 @@ BEGIN IDS_MENU_ONEGRAPHALLCPUS "すべての CPU で 1 グラフ(&O)" IDS_MENU_ONEGRAPHPERCPU "CPU ごとに 1 グラフ(&P)" IDS_MENU_CPUHISTORY "CPU 履歴(&C)" - IDS_MENU_SHOWKERNELTIMES "カーネル時間を表 示する(&S)" + IDS_MENU_SHOWKERNELTIMES "カーネル時間を表示する(&S)" IDS_CREATENEWTASK "新しいタスクの作成" - IDS_CREATENEWTASK_DESC "実行するプログラム名、または開くフォルダやドキュメント名、インターネット リソ ース名を入力してください。" + IDS_CREATENEWTASK_DESC "実行するプログラム名、または開くフォルダやドキュメント名、インターネット リソース名を入力してください。" IDS_MSG_ACCESSPROCESSAFF "プロセスの関係へのアクセスまたは設定ができません" IDS_MSG_PROCESSONEPRO "プロセスは、少なくとも 1 つのプロセッサと関係を持たなければなりません。" IDS_MSG_INVALIDOPTION "無効なオプション" IDS_MSG_UNABLEDEBUGPROCESS "デバッガを添付できません" - IDS_MSG_WARNINGDEBUG "警告: このプロセスをデバッグすると、データが失われる可能 性があります。\nデバッガを添付しますか?" + IDS_MSG_WARNINGDEBUG "警告: このプロセスをデバッグすると、データが失われる可能性があります。\nデバッガを添付しますか?" IDS_MSG_TASKMGRWARNING "タスク マネージャの警告" - IDS_MSG_WARNINGTERMINATING "警告: プロセスを終了すると、データが失われたり、システムが\n不安定になったりするなどの、予 期しない結果になることがあります。\nプロセスを終了する前に、状態またはデータを保存するかどうかの\n確認メッセージは表 示されません。プロセスを終了しますか?" + IDS_MSG_WARNINGTERMINATING "警告: プロセスを終了すると、データが失われたり、システムが\n不安定になったりするなどの、予期しない結果になることがあります。\nプロセスを終了する前に、状態またはデータを保存するかどうかの\n確認メッセージは表示されません。プロセスを終了しますか?" IDS_MSG_UNABLETERMINATEPRO "プロセスを終了できません" IDS_MSG_UNABLECHANGEPRIORITY "優先度を変更できません" - IDS_MSG_WARNINGCHANGEPRIORITY "警告: このプロセスの優先度クラスを変更すると、システムが不安定に\nなるなど、予 期しない結果になることがあります。\n優先度クラスを変更しますか?" + IDS_MSG_WARNINGCHANGEPRIORITY "警告: このプロセスの優先度クラスを変更すると、システムが不安定に\nなるなど、予期しない結果になることがあります。\n優先度クラスを変更しますか?" IDS_MSG_TRAYICONCPUUSAGE "CPU 使用率: %d%%" IDS_STATUS_MEMUSAGE "メモリ使用量: %dKB / %dKB" IDS_STATUS_CPUUSAGE "CPU 使用率: %3d%%" diff --git a/base/applications/wordpad/En.rc b/base/applications/wordpad/En.rc index 4e05b677ff6..5b3d73187de 100644 --- a/base/applications/wordpad/En.rc +++ b/base/applications/wordpad/En.rc @@ -173,7 +173,7 @@ END IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Tabs" -FONT 8, "MS SHell DLg" +FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Tab stops", -1, 10, 10, 120, 90 COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE diff --git a/base/applications/wordpad/Tr.rc b/base/applications/wordpad/Tr.rc index 6831ae3b2a4..05722f4abea 100644 --- a/base/applications/wordpad/Tr.rc +++ b/base/applications/wordpad/Tr.rc @@ -1,7 +1,8 @@ /* * Turkish Resources for Wordpad * - * Copyright 2006 Fatih Ac + * Copyright 2006 Fatih Aşıcı + * Copyright 2013 Erdem Ersoy (eersoy93) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,78 +21,78 @@ #include "wordpad.h" -LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT +LANGUAGE LANG_TURKISH, SUBLANG_NEUTRAL IDM_MAINMENU MENU BEGIN - POPUP "&Dosya" + POPUP "&Kütük" BEGIN MENUITEM "&Yeni...\tCtrl+N", ID_FILE_NEW - MENUITEM "&A...\tCtrl+O", ID_FILE_OPEN + MENUITEM "&Aç...\tCtrl+O", ID_FILE_OPEN MENUITEM "&Kaydet\tCtrl+S", ID_FILE_SAVE - MENUITEM "&Farkl Kaydet...", ID_FILE_SAVEAS + MENUITEM "Ay&rı Kaydet...", ID_FILE_SAVEAS MENUITEM SEPARATOR - MENUITEM "&Print...\tCtrl+P", ID_PRINT - MENUITEM "Print previe&w...", ID_PREVIEW - MENUITEM "Pag&e setup...", ID_PRINTSETUP + MENUITEM "Ya&zdır...\tCtrl+P", ID_PRINT + MENUITEM "&Baskı Önizleme...", ID_PREVIEW + MENUITEM "&Sayfa Yapısı...", ID_PRINTSETUP MENUITEM SEPARATOR - MENUITEM "&k", ID_FILE_EXIT + MENUITEM "&Çıkış", ID_FILE_EXIT END - POPUP "&Dzen" + POPUP "&Düzen" BEGIN MENUITEM "&Geri Al\tCtrl+Z", ID_EDIT_UNDO MENUITEM "&Yinele\tCtrl+Y", ID_EDIT_REDO MENUITEM SEPARATOR - MENUITEM "Ke&s\tCtrl+X", ID_EDIT_CUT - MENUITEM "&Kopyala\tCtrl+C", ID_EDIT_COPY - MENUITEM "Ya&ptr\tCtrl+V", ID_EDIT_PASTE + MENUITEM "&Kes\tCtrl+X", ID_EDIT_CUT + MENUITEM "&Çoğalt\tCtrl+C", ID_EDIT_COPY + MENUITEM "Ya&pıştır\tCtrl+V", ID_EDIT_PASTE MENUITEM "&Sil\tDel", ID_EDIT_CLEAR - MENUITEM "&Tmn se\tCtrl+A", ID_EDIT_SELECTALL + MENUITEM "&Tümünü Seç\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Find...\tCtrl+F", ID_FIND - MENUITEM "Find &next\tF3", ID_FIND_NEXT - MENUITEM "&Replace...\tCtrl+H", ID_REPLACE + MENUITEM "&Ara\tCtrl+F", ID_FIND + MENUITEM "S&onrakini Ara\tF3", ID_FIND_NEXT + MENUITEM "&Değiştir...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR - MENUITEM "Salt-&okunur", ID_EDIT_READONLY - MENUITEM "&Deimi", ID_EDIT_MODIFIED + MENUITEM "Sa< Okunur", ID_EDIT_READONLY + MENUITEM "D&eğiştirilmiş", ID_EDIT_MODIFIED MENUITEM SEPARATOR - POPUP "D&ierleri" + POPUP "D&iğer Seçenekler" BEGIN - MENUITEM "Seim &bilgisi", ID_EDIT_SELECTIONINFO - MENUITEM "Karakter bi&imi", ID_EDIT_CHARFORMAT - MENUITEM "&ntanml kar. biimi", ID_EDIT_DEFCHARFORMAT - MENUITEM "Paragra&f biimi", ID_EDIT_PARAFORMAT - MENUITEM "&Metni al", ID_EDIT_GETTEXT + MENUITEM "&Seçim Bilgisi", ID_EDIT_SELECTIONINFO + MENUITEM "&Damga Biçimi", ID_EDIT_CHARFORMAT + MENUITEM "&Öntanımlı Damga Biçimi", ID_EDIT_DEFCHARFORMAT + MENUITEM "&Paragraf Biçimi", ID_EDIT_PARAFORMAT + MENUITEM "&Metni Al", ID_EDIT_GETTEXT END END - POPUP "&View" + POPUP "&Görünüm" BEGIN - MENUITEM "&Toolbar", ID_TOGGLE_TOOLBAR - MENUITEM "&Formatbar", ID_TOGGLE_FORMATBAR - MENUITEM "&Ruler", ID_TOGGLE_RULER - MENUITEM "&Statusbar", ID_TOGGLE_STATUSBAR + MENUITEM "&Araç Çubuğu", ID_TOGGLE_TOOLBAR + MENUITEM "&Biçim Çubuğu", ID_TOGGLE_FORMATBAR + MENUITEM "&Çizgilik", ID_TOGGLE_RULER + MENUITEM "&Durum Çubuğu", ID_TOGGLE_STATUSBAR MENUITEM SEPARATOR - MENUITEM "&Options...", ID_VIEWPROPERTIES + MENUITEM "A&yarlar...", ID_VIEWPROPERTIES END - POPUP "&Insert" + POPUP "&Ekle" BEGIN - MENUITEM "&Date and time...", ID_DATETIME + MENUITEM "&Tarih veya Saat...",ID_DATETIME END - POPUP "&Biim" + POPUP "&Biçim" BEGIN - MENUITEM "&Font...", ID_FONTSETTINGS - MENUITEM "&Bullet points", ID_BULLET - MENUITEM "&Paragraph...", ID_PARAFORMAT - MENUITEM "&Tabs...", ID_TABSTOPS + MENUITEM "&Yazı Türü...", ID_FONTSETTINGS + MENUITEM "&Madde İmi", ID_BULLET + MENUITEM "&Paragraf...", ID_PARAFORMAT + MENUITEM "&Sekmeler...", ID_TABSTOPS POPUP "&Arkaplan" BEGIN - MENUITEM "S&istem\tCtrl+1", ID_BACK_1 - MENUITEM "&Sarmtrak\tCtrl+2", ID_BACK_2 + MENUITEM "&Dizge Rengi\tCtrl+1", ID_BACK_1 + MENUITEM "&Sarımtırak\tCtrl+2", ID_BACK_2 END END - POPUP "&Help" + POPUP "&Yardım" BEGIN - MENUITEM "&About Wine Wordpad", ID_ABOUT + MENUITEM "&Hakkında", ID_ABOUT END END @@ -99,12 +100,12 @@ IDM_POPUP MENU BEGIN POPUP "" BEGIN - MENUITEM "Ke&s", ID_EDIT_CUT - MENUITEM "&Kopyala", ID_EDIT_COPY - MENUITEM "Ya&ptr", ID_EDIT_PASTE + MENUITEM "&Kes", ID_EDIT_CUT + MENUITEM "&Çoğalt", ID_EDIT_COPY + MENUITEM "&Yapıştır", ID_EDIT_PASTE MENUITEM SEPARATOR - MENUITEM "&Bullet points", ID_BULLET - MENUITEM "&Paragraph...", ID_PARAFORMAT + MENUITEM "&Madde İmi", ID_BULLET + MENUITEM "&Paragraf...", ID_PARAFORMAT END END @@ -112,22 +113,154 @@ IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN - MENUITEM "Siyah", ID_COLOR_BLACK - MENUITEM "Koyu Krmz",ID_COLOR_MAROON - MENUITEM "Yeil", ID_COLOR_GREEN - MENUITEM "Koyu Sar", ID_COLOR_OLIVE - MENUITEM "Koyu Mavi", ID_COLOR_NAVY - MENUITEM "Mor", ID_COLOR_PURPLE - MENUITEM "Deniz Mavisi",ID_COLOR_TEAL - MENUITEM "Gri", ID_COLOR_GRAY - MENUITEM "Gm", ID_COLOR_SILVER - MENUITEM "Krmz", ID_COLOR_RED - MENUITEM "Parlak Yeil",ID_COLOR_LIME - MENUITEM "Sar", ID_COLOR_YELLOW - MENUITEM "Mavi", ID_COLOR_BLUE - MENUITEM "Pembe", ID_COLOR_FUCHSIA - MENUITEM "Turkuaz", ID_COLOR_AQUA - MENUITEM "Beyaz", ID_COLOR_WHITE - MENUITEM "Automatic", ID_COLOR_AUTOMATIC + MENUITEM "Kara", ID_COLOR_BLACK + MENUITEM "Vişne Çürüğü", ID_COLOR_MAROON + MENUITEM "Yeşil", ID_COLOR_GREEN + MENUITEM "Zeytinyağı", ID_COLOR_OLIVE + MENUITEM "Deniz Mavisi", ID_COLOR_NAVY + MENUITEM "Mor", ID_COLOR_PURPLE + MENUITEM "Çamurcun", ID_COLOR_TEAL + MENUITEM "Kül Rengi", ID_COLOR_GRAY + MENUITEM "Gümüş", ID_COLOR_SILVER + MENUITEM "Al", ID_COLOR_RED + MENUITEM "Misket limonu", ID_COLOR_LIME + MENUITEM "Sarı", ID_COLOR_YELLOW + MENUITEM "Mavi", ID_COLOR_BLUE + MENUITEM "Küpe Çiçeği", ID_COLOR_FUCHSIA + MENUITEM "Turkuaz", ID_COLOR_AQUA + MENUITEM "Beyaz", ID_COLOR_WHITE + MENUITEM "Dizge Rengi", ID_COLOR_AUTOMATIC END END + +IDD_DATETIME DIALOG 30, 20, 130, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Zaman" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Var Olan Biçimler:",-1,3,2,100,15 + LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY + PUSHBUTTON "&Tamam",IDOK,87,12,40,12 + PUSHBUTTON "&Vazgeç",IDCANCEL,87,26,40,12 +END + +IDD_NEWFILE DIALOG 30, 20, 140, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Yeni" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Yeni belge türü:",-1,3,2,100,15 + LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT + PUSHBUTTON "&Tamam",IDOK,97,12,40,12 + PUSHBUTTON "&Vazgeç",IDCANCEL,97,26,40,12 +END + +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Paragraf Düzeni" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Pay", -1, 10, 10, 120, 68 + LTEXT "Sol", -1, 15, 22, 40, 13 + EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 + LTEXT "Sağ", -1, 15, 40, 40, 13 + EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 + LTEXT "İlk satır", -1, 15, 58, 40, 13 + EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 + LTEXT "Hizâlama", -1, 15, 87, 40, 13 + COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST + PUSHBUTTON "&Tamam", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Vazgeç", IDCANCEL, 137, 33, 50, 15 +END + +IDD_TABSTOPS DIALOG 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Sekmeler" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Sekme Durakları", -1, 10, 10, 120, 90 + COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE + DEFPUSHBUTTON "&Ekle", ID_TAB_ADD, 20, 80, 45, 15 + PUSHBUTTON "&Sil", ID_TAB_DEL, 72, 80, 45, 15 + PUSHBUTTON "&Tamam", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Vazgeç", IDCANCEL, 137, 33, 50, 15 + PUSHBUTTON "&Hepsini Sil", ID_TAB_EMPTY, 137, 51, 50, 15 +END + +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 +STYLE DS_SYSMODAL +CAPTION "" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Satır Kaydırma", -1, 10, 10, 130, 85 + RADIOBUTTON "&Kaydırma yok", IDC_PAGEFMT_WN, 18, 25, 117, 15 + RADIOBUTTON "&Pencere kenarlığına kadar", IDC_PAGEFMT_WW, 18, 45, 117, 15 + RADIOBUTTON "&Çizgiliğe kadar", IDC_PAGEFMT_WM, 18, 65, 117, 15 + GROUPBOX "Çubuklar", -1, 150, 10, 120, 85 + CHECKBOX "&Araç Çubuğu", IDC_PAGEFMT_TB, 160, 20, 80, 15 + CHECKBOX "&Biçim Çubuğu", IDC_PAGEFMT_FB, 160, 38, 80, 15 + CHECKBOX "Ç&izgilik", IDC_PAGEFMT_RU, 160, 56, 80, 15 + CHECKBOX "&Durum Çubuğu", IDC_PAGEFMT_SB, 160, 74, 80, 15 + LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 +END + +STRINGTABLE +BEGIN + STRING_ALL_FILES, "Tüm Kütükler (*.*)" + STRING_TEXT_FILES_TXT, "Metin Belgeleri (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "Unicode Metin Belgeleri (*.txt)" + STRING_RICHTEXT_FILES_RTF, "Zengin Metin Belgeleri (*.rtf)" + STRING_NEWFILE_RICHTEXT, "Zengin Metin Belgesi" + STRING_NEWFILE_TXT, "Metin Belgesi" + STRING_NEWFILE_TXT_UNICODE, "Unicode Metin Belgesi" + STRING_PRINTER_FILES_PRN, "Yazıcı Dosyaları (*.PRN)" +END + +STRINGTABLE +BEGIN + STRING_ALIGN_LEFT, "Sol" + STRING_ALIGN_RIGHT, "Sağ" + STRING_ALIGN_CENTER, "Orta" +END + +STRINGTABLE +BEGIN + STRING_VIEWPROPS_TITLE, "Ayarlar" + STRING_VIEWPROPS_TEXT, "Metin" + STRING_VIEWPROPS_RICHTEXT, "Zengin Metin" +END + +STRINGTABLE +BEGIN + STRING_PREVIEW_PRINT, "Yazdır" + STRING_PREVIEW_NEXTPAGE, "Sonraki Sayfa" + STRING_PREVIEW_PREVPAGE, "Önceki Sayfa" + STRING_PREVIEW_TWOPAGES, "İkili" + STRING_PREVIEW_ONEPAGE, "Tekli" + STRING_PREVIEW_ZOOMIN, "Yakınlaştır" + STRING_PREVIEW_ZOOMOUT, "Uzaklaştır" + STRING_PREVIEW_CLOSE, "Tamam" + STRING_PREVIEW_PAGE, "Sayfa" + STRING_PREVIEW_PAGES, "Sayfalar" + STRING_UNITS_CM, "cm" + STRING_UNITS_IN, "in" + STRING_UNITS_INCH, "inç" + STRING_UNITS_PT, "pt" +END + +STRINGTABLE +BEGIN + STRING_DEFAULT_FILENAME, "Adsız" + STRING_PROMPT_SAVE_CHANGES, "'%s' için değişiklikler kaydedilsin mi?" + STRING_SEARCH_FINISHED, "Belge araması tamamlandı." + STRING_LOAD_RICHED_FAILED, "Zengin metin kitaplığının yüklenmesi başarısız oldu." + STRING_SAVE_LOSEFORMATTING, "Eğer düz metin belgesi olarak kaydedilirse yapılan tüm değişiklikler kaybolacak. Devam etmek istiyor musunuz?" + STRING_INVALID_NUMBER, "Geçersiz sayı biçimi." + STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE içeren belgeler desteklenmiyor." + STRING_WRITE_FAILED, "Belgenin kaydedilmesi başarısız oldu." + STRING_WRITE_ACCESS_DENIED, "Bu kütüğü kaydetme yetkiniz yok." + STRING_OPEN_FAILED, "Belgenin açılması başarısız oldu." + STRING_OPEN_ACCESS_DENIED, "Bu kütüğü açma yetkiniz yok." + STRING_PRINTING_NOT_IMPLEMENTED, "Yazdırma seçeneği daha tamamlanmadı." + STRING_MAX_TAB_STOPS, "En fazla 32 adet sekme durağı ekleyebilirsiniz." +END diff --git a/base/applications/wordpad/rsrc.rc b/base/applications/wordpad/rsrc.rc index d4357bfe1fe..0ed7ac21288 100644 --- a/base/applications/wordpad/rsrc.rc +++ b/base/applications/wordpad/rsrc.rc @@ -77,9 +77,6 @@ IDC_ZOOM CURSOR "zoom.cur" #ifdef LANGUAGE_PL_PL #include "Pl.rc" #endif -#ifdef LANGUAGE_TR_TR - #include "Tr.rc" -#endif /* UTF-8 */ #ifdef LANGUAGE_DA_DK @@ -124,6 +121,9 @@ IDC_ZOOM CURSOR "zoom.cur" #ifdef LANGUAGE_SV_SE #include "Sv.rc" #endif +#ifdef LANGUAGE_TR_TR + #include "Tr.rc" +#endif #ifdef LANGUAGE_UK_UA #include "Uk.rc" #endif diff --git a/dll/win32/urlmon/version.rc b/base/applications/write/Tr.rc similarity index 72% rename from dll/win32/urlmon/version.rc rename to base/applications/write/Tr.rc index 10cc7216ccd..4a2fb2e6f2c 100644 --- a/dll/win32/urlmon/version.rc +++ b/base/applications/write/Tr.rc @@ -1,7 +1,7 @@ /* - * Copyright 2005 + * Turkish language support * - * Stefan Leichter + * Copyright (C) 2013 Erdem Ersoy (eersoy93) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,10 +18,11 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#define WINE_FILENAME_STR "urlmon.dll" -#define WINE_FILEVERSION 6,0,2800,1485 -#define WINE_FILEVERSION_STR "6.0.2800.1485" -#define WINE_PRODUCTVERSION 6,0,2800,1485 -#define WINE_PRODUCTVERSION_STR "6.0.2800.1485" +#include "resources.h" -#include "wine/wine_common_ver.rc" +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + +STRINGTABLE +{ + IDS_FAILED, "Zengin Metin Düzenleyicisi'nin açılması başarısız oldu." +} diff --git a/base/applications/write/rsrc.rc b/base/applications/write/rsrc.rc index ec3e0649318..11ec57618f8 100644 --- a/base/applications/write/rsrc.rc +++ b/base/applications/write/rsrc.rc @@ -84,6 +84,9 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #ifdef LANGUAGE_SR_SP #include "Sr.rc" #endif +#ifdef LANGUAGE_TR_TR + #include "Tr.rc" +#endif #ifdef LANGUAGE_UK_UA #include "Uk.rc" #endif diff --git a/base/shell/cmd/copy.c b/base/shell/cmd/copy.c index e39bcde2e5f..c558a4f673f 100644 --- a/base/shell/cmd/copy.c +++ b/base/shell/cmd/copy.c @@ -377,11 +377,15 @@ INT cmd_copy(LPTSTR param) if (size > 512) { + TCHAR *old_evar = evar; evar = cmd_realloc(evar,size * sizeof(TCHAR) ); if (evar!=NULL) size = GetEnvironmentVariable (_T("COPYCMD"), evar, size); else + { size=0; + evar = old_evar; + } } /* check see if we did get any env variable */ diff --git a/base/shell/cmd/echo.c b/base/shell/cmd/echo.c index 272dba95995..5cf90fd1ce0 100644 --- a/base/shell/cmd/echo.c +++ b/base/shell/cmd/echo.c @@ -83,7 +83,7 @@ INT CommandEcho (LPTSTR param) { /* skip the first character */ ConOutPuts(param + 1); - ConOutPuts(_T("\n")); + ConOutPuts(_T("\r\n")); } return 0; } diff --git a/base/shell/cmd/filecomp.c b/base/shell/cmd/filecomp.c index 42513c963a0..4015dcf43b4 100644 --- a/base/shell/cmd/filecomp.c +++ b/base/shell/cmd/filecomp.c @@ -491,10 +491,16 @@ int __cdecl compare(const void *arg1,const void *arg2) INT ret; File1 = cmd_alloc(sizeof(FileName)); - File2 = cmd_alloc(sizeof(FileName)); - if(!File1 || !File2) + if (!File1) return 0; + File2 = cmd_alloc(sizeof(FileName)); + if(!File2) + { + cmd_free(File1); + return 0; + } + memcpy(File1,arg1,sizeof(FileName)); memcpy(File2,arg2,sizeof(FileName)); @@ -660,14 +666,16 @@ VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor) /* aseemble a list of all files names */ do { + FileName * oldFileList = FileList; + if(!_tcscmp (file.cFileName, _T(".")) || !_tcscmp (file.cFileName, _T(".."))) continue; /* Don't show files when they are doing 'cd' or 'rd' */ if(!ShowAll && - file.dwFileAttributes != 0xFFFFFFFF && - !(file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + file.dwFileAttributes != 0xFFFFFFFF && + !(file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { continue; } @@ -677,6 +685,8 @@ VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor) if(FileList == NULL) { + /* Don't leak old buffer */ + cmd_free(oldFileList); /* Assemble the orginal string and return */ _tcscpy(strOut,szOrginal); FindClose(hFile); @@ -688,7 +698,7 @@ VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor) } while(FindNextFile(hFile,&file)); - FindClose(hFile); + FindClose(hFile); /* Check the size of the list to see if we found any matches */ diff --git a/base/system/regsvr32/lang/ja-JP.rc b/base/system/regsvr32/lang/ja-JP.rc index 368c8a0e9c0..3ee41f26d1e 100644 --- a/base/system/regsvr32/lang/ja-JP.rc +++ b/base/system/regsvr32/lang/ja-JP.rc @@ -4,9 +4,9 @@ BEGIN IDS_UsageMessage, "%s\n\n使用法: regsvr32 [/u] [/s] [/c] [/n] [/i[:コマンド ライン]] DLL名\n\ /u - サーバーを登録解除する\n\ -/s - サイレント; メッセージ ボックスを表 示しない\n\ -/c - コンソ ール出力\n\ -/i - 省略可能 な [コマンド ライン] を引数として DllInstall を呼び出す; /u と併用した場合は dll uninstall を呼び出す\n\ +/s - サイレント; メッセージ ボックスを表示しない\n\ +/c - コンソール出力\n\ +/i - 省略可能な [コマンド ライン] を引数として DllInstall を呼び出す; /u と併用した場合は dll uninstall を呼び出す\n\ /n - DllRegisterServer を呼び出さない; このオプションは /i と併用する必要がある" IDS_NoDllSpecified, "DLL 名が指定されていません。" @@ -18,7 +18,7 @@ IDS_SwitchN_NoI, "フラグを認識できません: /n を指定する場 IDS_DllNotLoaded, "LoadLibrary('%s') に失敗しました。\nGetLastError は 0x%08x を返しました。" IDS_MissingEntry, "%s を読み込みましたが、%s エントリ ポイントが見つかりませんでした。\n\n\ -%s はエクスポートされていないか、%s の不正なバージョンがメモリ上にある可能 性があります。検出や削除をするため、PView の使用を検討してください。" +%s はエクスポートされていないか、%s の不正なバージョンがメモリ上にある可能性があります。検出や削除をするため、PView の使用を検討してください。" IDS_FailureMessage, "%s (%s の) に失敗しました。\n返ってきたコード: 0x%08x" diff --git a/base/system/services/database.c b/base/system/services/database.c index 0c2a50d5e81..0714a56e573 100644 --- a/base/system/services/database.c +++ b/base/system/services/database.c @@ -19,9 +19,9 @@ /* * Uncomment the line below to start services - * using the SERVICE_START_PENDING state + * using the SERVICE_START_PENDING state. */ -// #define USE_SERVICE_START_PENDING +#define USE_SERVICE_START_PENDING /* * Uncomment the line below to use asynchronous IO operations @@ -38,6 +38,7 @@ LIST_ENTRY ServiceListHead; static RTL_RESOURCE DatabaseLock; static DWORD ResumeCount = 1; +/* The critical section synchronizes service controls commands */ static CRITICAL_SECTION ControlServiceCriticalSection; static DWORD PipeTimeout = 30000; /* 30 Seconds */ @@ -359,7 +360,7 @@ ScmGetServiceEntryByResumeCount(DWORD dwResumeCount) DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName, - PSERVICE *lpServiceRecord) + PSERVICE* lpServiceRecord) { PSERVICE lpService = NULL; @@ -772,13 +773,11 @@ ScmCheckDriver(PSERVICE Service) if (Service->Status.dwServiceType == SERVICE_KERNEL_DRIVER) { - RtlInitUnicodeString(&DirName, - L"\\Driver"); + RtlInitUnicodeString(&DirName, L"\\Driver"); } - else + else // if (Service->Status.dwServiceType == SERVICE_FILE_SYSTEM_DRIVER) { - RtlInitUnicodeString(&DirName, - L"\\FileSystem"); + RtlInitUnicodeString(&DirName, L"\\FileSystem"); } InitializeObjectAttributes(&ObjectAttributes, @@ -796,7 +795,7 @@ ScmCheckDriver(PSERVICE Service) } BufferLength = sizeof(OBJECT_DIRECTORY_INFORMATION) + - 2 * MAX_PATH * sizeof(WCHAR); + 2 * MAX_PATH * sizeof(WCHAR); DirInfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, BufferLength); @@ -1096,7 +1095,7 @@ Done: static DWORD ScmSendStartCommand(PSERVICE Service, DWORD argc, - LPWSTR *argv) + LPWSTR* argv) { PSCM_CONTROL_PACKET ControlPacket; SCM_REPLY_PACKET ReplyPacket; @@ -1496,7 +1495,7 @@ ScmWaitForServiceConnect(PSERVICE Service) static DWORD ScmStartUserModeService(PSERVICE Service, DWORD argc, - LPWSTR *argv) + LPWSTR* argv) { PROCESS_INFORMATION ProcessInformation; STARTUPINFOW StartupInfo; @@ -1512,6 +1511,7 @@ ScmStartUserModeService(PSERVICE Service, return ScmSendStartCommand(Service, argc, argv); } + /* Otherwise start its process */ ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = sizeof(StartupInfo); ZeroMemory(&ProcessInformation, sizeof(ProcessInformation)); @@ -1551,9 +1551,7 @@ ScmStartUserModeService(PSERVICE Service, if (dwError == ERROR_SUCCESS) { /* Send start command */ - dwError = ScmSendStartCommand(Service, - argc, - argv); + dwError = ScmSendStartCommand(Service, argc, argv); } else { @@ -1569,24 +1567,22 @@ ScmStartUserModeService(PSERVICE Service, } -DWORD -ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv) +static DWORD +ScmLoadService(PSERVICE Service, + DWORD argc, + LPWSTR* argv) { PSERVICE_GROUP Group = Service->lpGroup; DWORD dwError = ERROR_SUCCESS; LPCWSTR ErrorLogStrings[2]; WCHAR szErrorBuffer[32]; - DPRINT("ScmStartService() called\n"); - + DPRINT("ScmLoadService() called\n"); DPRINT("Start Service %p (%S)\n", Service, Service->lpServiceName); - EnterCriticalSection(&ControlServiceCriticalSection); - if (Service->Status.dwCurrentState != SERVICE_STOPPED) { DPRINT("Service %S is already running!\n", Service->lpServiceName); - LeaveCriticalSection(&ControlServiceCriticalSection); return ERROR_SERVICE_ALREADY_RUNNING; } @@ -1602,7 +1598,7 @@ ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv) Service->Status.dwCurrentState = SERVICE_RUNNING; } } - else + else // if (Service->Status.dwServiceType & (SERVICE_WIN32 | SERVICE_INTERACTIVE_PROCESS)) { /* Start user-mode service */ dwError = ScmCreateOrReferenceServiceImage(Service); @@ -1625,9 +1621,7 @@ ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv) } } - LeaveCriticalSection(&ControlServiceCriticalSection); - - DPRINT("ScmStartService() done (Error %lu)\n", dwError); + DPRINT("ScmLoadService() done (Error %lu)\n", dwError); if (dwError == ERROR_SUCCESS) { @@ -1677,18 +1671,81 @@ ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv) } +DWORD +ScmStartService(PSERVICE Service, + DWORD argc, + LPWSTR* argv) +{ + DWORD dwError = ERROR_SUCCESS; + SC_RPC_LOCK Lock = NULL; + + DPRINT("ScmStartService() called\n"); + DPRINT("Start Service %p (%S)\n", Service, Service->lpServiceName); + + /* Acquire the service control critical section, to synchronize starts */ + EnterCriticalSection(&ControlServiceCriticalSection); + + /* + * Acquire the user service start lock while the service is starting, if + * needed (i.e. if we are not starting it during the initialization phase). + * If we don't success, bail out. + */ + if (!ScmInitialize) + { + dwError = ScmAcquireServiceStartLock(TRUE, &Lock); + if (dwError != ERROR_SUCCESS) goto done; + } + + /* Really start the service */ + dwError = ScmLoadService(Service, argc, argv); + + /* Release the service start lock, if needed, and the critical section */ + if (Lock) ScmReleaseServiceStartLock(&Lock); + +done: + LeaveCriticalSection(&ControlServiceCriticalSection); + + DPRINT("ScmStartService() done (Error %lu)\n", dwError); + + return dwError; +} + + VOID ScmAutoStartServices(VOID) { + DWORD dwError = ERROR_SUCCESS; + SC_RPC_LOCK Lock = NULL; + PLIST_ENTRY GroupEntry; PLIST_ENTRY ServiceEntry; PSERVICE_GROUP CurrentGroup; PSERVICE CurrentService; WCHAR szSafeBootServicePath[MAX_PATH]; - DWORD dwError; HKEY hKey; ULONG i; + /* Acquire the service control critical section, to synchronize starts */ + EnterCriticalSection(&ControlServiceCriticalSection); + + /* + * Acquire the user service start lock while the service is starting, if + * needed (i.e. if we are not starting it during the initialization phase). + * If we don't success, bail out. + */ + if (!ScmInitialize) + { + /* + * Actually this code is never executed since we are called + * at initialization time, so that ScmInitialize == TRUE. + * But keep the code here if someday we are called later on + * for whatever reason... + */ + dwError = ScmAcquireServiceStartLock(TRUE, &Lock); + if (dwError != ERROR_SUCCESS) goto done; + } + + /* Clear 'ServiceVisited' flag (or set if not to start in Safe Mode) */ ServiceEntry = ServiceListHead.Flink; while (ServiceEntry != &ServiceListHead) @@ -1779,7 +1836,7 @@ ScmAutoStartServices(VOID) (CurrentService->dwTag == CurrentGroup->TagArray[i])) { CurrentService->ServiceVisited = TRUE; - ScmStartService(CurrentService, 0, NULL); + ScmLoadService(CurrentService, 0, NULL); } ServiceEntry = ServiceEntry->Flink; @@ -1797,7 +1854,7 @@ ScmAutoStartServices(VOID) (CurrentService->ServiceVisited == FALSE)) { CurrentService->ServiceVisited = TRUE; - ScmStartService(CurrentService, 0, NULL); + ScmLoadService(CurrentService, 0, NULL); } ServiceEntry = ServiceEntry->Flink; @@ -1817,7 +1874,7 @@ ScmAutoStartServices(VOID) (CurrentService->ServiceVisited == FALSE)) { CurrentService->ServiceVisited = TRUE; - ScmStartService(CurrentService, 0, NULL); + ScmLoadService(CurrentService, 0, NULL); } ServiceEntry = ServiceEntry->Flink; @@ -1834,7 +1891,7 @@ ScmAutoStartServices(VOID) (CurrentService->ServiceVisited == FALSE)) { CurrentService->ServiceVisited = TRUE; - ScmStartService(CurrentService, 0, NULL); + ScmLoadService(CurrentService, 0, NULL); } ServiceEntry = ServiceEntry->Flink; @@ -1848,6 +1905,13 @@ ScmAutoStartServices(VOID) CurrentService->ServiceVisited = FALSE; ServiceEntry = ServiceEntry->Flink; } + + + /* Release the service start lock, if needed, and the critical section */ + if (Lock) ScmReleaseServiceStartLock(&Lock); + +done: + LeaveCriticalSection(&ControlServiceCriticalSection); } diff --git a/base/system/services/rpcserver.c b/base/system/services/rpcserver.c index 4c877d27b00..110e55d2fa8 100644 --- a/base/system/services/rpcserver.c +++ b/base/system/services/rpcserver.c @@ -2895,7 +2895,6 @@ DWORD RStartServiceW( DWORD dwError = ERROR_SUCCESS; PSERVICE_HANDLE hSvc; PSERVICE lpService = NULL; - SC_RPC_LOCK Lock = NULL; #ifndef NDEBUG DWORD i; @@ -2941,17 +2940,9 @@ DWORD RStartServiceW( if (lpService->bDeleted) return ERROR_SERVICE_MARKED_FOR_DELETE; - /* Acquire the service start lock until the service has been started */ - dwError = ScmAcquireServiceStartLock(TRUE, &Lock); - if (dwError != ERROR_SUCCESS) - return dwError; - /* Start the service */ dwError = ScmStartService(lpService, argc, (LPWSTR*)argv); - /* Release the service start lock */ - ScmReleaseServiceStartLock(&Lock); - return dwError; } @@ -4171,7 +4162,6 @@ DWORD RStartServiceA( DWORD dwError = ERROR_SUCCESS; PSERVICE_HANDLE hSvc; PSERVICE lpService = NULL; - SC_RPC_LOCK Lock = NULL; LPWSTR *lpVector = NULL; DWORD i; DWORD dwLength; @@ -4244,17 +4234,9 @@ DWORD RStartServiceA( } } - /* Acquire the service start lock until the service has been started */ - dwError = ScmAcquireServiceStartLock(TRUE, &Lock); - if (dwError != ERROR_SUCCESS) - goto done; - /* Start the service */ dwError = ScmStartService(lpService, argc, lpVector); - /* Release the service start lock */ - ScmReleaseServiceStartLock(&Lock); - done: /* Free the Unicode argument vector */ if (lpVector != NULL) diff --git a/base/system/services/services.c b/base/system/services/services.c index 2edb6e75887..5385a6beb9f 100644 --- a/base/system/services/services.c +++ b/base/system/services/services.c @@ -22,6 +22,12 @@ int WINAPI RegisterServicesProcess(DWORD ServicesProcessId); #define PIPE_BUFSIZE 1024 #define PIPE_TIMEOUT 1000 +/* Defined in include/reactos/services/services.h */ +// #define SCM_START_EVENT L"SvcctrlStartEvent_A3752DX" +#define SCM_AUTOSTARTCOMPLETE_EVENT L"SC_AutoStartComplete" +#define LSA_RPC_SERVER_ACTIVE L"LSA_RPC_SERVER_ACTIVE" + +BOOL ScmInitialize = FALSE; BOOL ScmShutdown = FALSE; static HANDLE hScmShutdownEvent = NULL; @@ -77,35 +83,38 @@ ScmLogError(DWORD dwEventId, BOOL -ScmCreateStartEvent(PHANDLE StartEvent) +ScmCreateControlEvent(PHANDLE Event, + LPCWSTR Name, + DWORD dwDesiredAccess) { + /* + * This function creates a generic non-inheritable event + * and return a handle to the caller. The caller must + * close this handle afterwards. + */ + HANDLE hEvent; - hEvent = CreateEventW(NULL, - TRUE, - FALSE, - L"SvcctrlStartEvent_A3752DX"); + hEvent = CreateEventW(NULL, TRUE, FALSE, Name); if (hEvent == NULL) { if (GetLastError() == ERROR_ALREADY_EXISTS) { - hEvent = OpenEventW(EVENT_ALL_ACCESS, - FALSE, - L"SvcctrlStartEvent_A3752DX"); - if (hEvent == NULL) - { - return FALSE; - } - } - else - { - return FALSE; + hEvent = OpenEventW(dwDesiredAccess, FALSE, Name); } } - *StartEvent = hEvent; - - return TRUE; + if (hEvent) + { + DPRINT("SERVICES: Created event %S with handle %x\n", Name, hEvent); + *Event = hEvent; + return TRUE; + } + else + { + DPRINT1("SERVICES: Failed to create event %S (Error %lu)\n", Name, GetLastError()); + return FALSE; + } } @@ -113,35 +122,21 @@ VOID ScmWaitForLsa(VOID) { HANDLE hEvent; - DWORD dwError; - hEvent = CreateEventW(NULL, - TRUE, - FALSE, - L"LSA_RPC_SERVER_ACTIVE"); - if (hEvent == NULL) + if (!ScmCreateControlEvent(&hEvent, + LSA_RPC_SERVER_ACTIVE, + SYNCHRONIZE)) { - dwError = GetLastError(); - DPRINT1("Failed to create the notication event (Error %lu)\n", dwError); - - if (dwError == ERROR_ALREADY_EXISTS) - { - hEvent = OpenEventW(SYNCHRONIZE, - FALSE, - L"LSA_RPC_SERVER_ACTIVE"); - if (hEvent == NULL) - { - DPRINT1("Could not open the notification event (Error %lu)\n", GetLastError()); - return; - } - } + DPRINT1("Failed to create the notification event (Error %lu)\n", GetLastError()); } + else + { + DPRINT("Wait for the LSA server!\n"); + WaitForSingleObject(hEvent, INFINITE); + DPRINT("LSA server running!\n"); - DPRINT("Wait for the LSA server!\n"); - WaitForSingleObject(hEvent, INFINITE); - DPRINT("LSA server running!\n"); - - CloseHandle(hEvent); + CloseHandle(hEvent); + } DPRINT("ScmWaitForLsa() done\n"); } @@ -351,23 +346,38 @@ wWinMain(HINSTANCE hInstance, int nShowCmd) { HANDLE hScmStartEvent = NULL; + HANDLE hScmAutoStartCompleteEvent = NULL; SC_RPC_LOCK Lock = NULL; BOOL bCanDeleteNamedPipeCriticalSection = FALSE; DWORD dwError; DPRINT("SERVICES: Service Control Manager\n"); - /* Create start event */ - if (!ScmCreateStartEvent(&hScmStartEvent)) + /* We are initializing ourselves */ + ScmInitialize = TRUE; + + /* Create the start event */ + if (!ScmCreateControlEvent(&hScmStartEvent, + SCM_START_EVENT, + EVENT_ALL_ACCESS)) { - DPRINT1("SERVICES: Failed to create start event\n"); + DPRINT1("SERVICES: Failed to create the start event\n"); goto done; } + DPRINT("SERVICES: Created start event with handle %p.\n", hScmStartEvent); - DPRINT("SERVICES: created start event with handle %p.\n", hScmStartEvent); + /* Create the auto-start complete event */ + if (!ScmCreateControlEvent(&hScmAutoStartCompleteEvent, + SCM_AUTOSTARTCOMPLETE_EVENT, + EVENT_ALL_ACCESS)) + { + DPRINT1("SERVICES: Failed to create the auto-start complete event\n"); + goto done; + } + DPRINT("SERVICES: created auto-start complete event with handle %p.\n", hScmAutoStartCompleteEvent); /* Create the shutdown event */ - hScmShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + hScmShutdownEvent = CreateEventW(NULL, TRUE, FALSE, NULL); if (hScmShutdownEvent == NULL) { DPRINT1("SERVICES: Failed to create shutdown event\n"); @@ -385,7 +395,7 @@ wWinMain(HINSTANCE hInstance, /* Read the control set values */ if (!ScmGetControlSetValues()) { - DPRINT1("SERVICES: failed to read the control set values\n"); + DPRINT1("SERVICES: Failed to read the control set values\n"); goto done; } @@ -393,50 +403,59 @@ wWinMain(HINSTANCE hInstance, dwError = ScmCreateServiceDatabase(); if (dwError != ERROR_SUCCESS) { - DPRINT1("SERVICES: failed to create SCM database (Error %lu)\n", dwError); + DPRINT1("SERVICES: Failed to create SCM database (Error %lu)\n", dwError); goto done; } + /* Wait for the LSA server */ + ScmWaitForLsa(); + /* Update the services database */ ScmGetBootAndSystemDriverState(); - /* Register the Service Control Manager process with CSRSS */ + /* Register the Service Control Manager process with the ReactOS Subsystem */ if (!RegisterServicesProcess(GetCurrentProcessId())) { DPRINT1("SERVICES: Could not register SCM process\n"); goto done; } - /* Acquire the service start lock until autostart services have been started */ + /* + * Acquire the user service start lock until + * auto-start services have been started. + */ dwError = ScmAcquireServiceStartLock(TRUE, &Lock); if (dwError != ERROR_SUCCESS) { - DPRINT1("SERVICES: failed to acquire the service start lock (Error %lu)\n", dwError); + DPRINT1("SERVICES: Failed to acquire the service start lock (Error %lu)\n", dwError); goto done; } /* Start the RPC server */ ScmStartRpcServer(); - DPRINT("SERVICES: Initialized.\n"); - /* Signal start event */ SetEvent(hScmStartEvent); + DPRINT("SERVICES: Initialized.\n"); + /* Register event handler (used for system shutdown) */ SetConsoleCtrlHandler(ShutdownHandlerRoutine, TRUE); - /* Wait for the LSA server */ - ScmWaitForLsa(); - /* Start auto-start services */ ScmAutoStartServices(); + /* Signal auto-start complete event */ + SetEvent(hScmAutoStartCompleteEvent); + /* FIXME: more to do ? */ /* Release the service start lock */ ScmReleaseServiceStartLock(&Lock); + /* Initialization finished */ + ScmInitialize = FALSE; + DPRINT("SERVICES: Running.\n"); /* Wait until the shutdown event gets signaled */ @@ -451,6 +470,10 @@ done: if (hScmShutdownEvent != NULL) CloseHandle(hScmShutdownEvent); + /* Close the auto-start complete event */ + if (hScmAutoStartCompleteEvent != NULL) + CloseHandle(hScmAutoStartCompleteEvent); + /* Close the start event */ if (hScmStartEvent != NULL) CloseHandle(hScmStartEvent); @@ -458,7 +481,6 @@ done: DPRINT("SERVICES: Finished.\n"); ExitThread(0); - return 0; } diff --git a/base/system/services/services.h b/base/system/services/services.h index 8e13a3e342a..20afb30c08d 100644 --- a/base/system/services/services.h +++ b/base/system/services/services.h @@ -86,6 +86,7 @@ typedef struct _START_LOCK extern LIST_ENTRY ServiceListHead; extern LIST_ENTRY GroupListHead; extern LIST_ENTRY ImageListHead; +extern BOOL ScmInitialize; extern BOOL ScmShutdown; diff --git a/boot/bootdata/CMakeLists.txt b/boot/bootdata/CMakeLists.txt index 3d03e9ba622..611d1a079b4 100644 --- a/boot/bootdata/CMakeLists.txt +++ b/boot/bootdata/CMakeLists.txt @@ -3,10 +3,10 @@ add_subdirectory(packages) #common hives add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/txtsetup.sif DESTINATION reactos NO_CAB FOR bootcd regtest) -add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivecls.inf DESTINATION reactos NO_CAB NAME_ON_CD hivecls.inf FOR bootcd regtest) -add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivedef.inf DESTINATION reactos NO_CAB NAME_ON_CD hivedef.inf FOR bootcd regtest) -add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivesft.inf DESTINATION reactos NO_CAB NAME_ON_CD hivesft.inf FOR bootcd regtest) -add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivesys.inf DESTINATION reactos NO_CAB NAME_ON_CD hivesys.inf FOR bootcd regtest) +add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivecls.inf DESTINATION reactos NO_CAB FOR bootcd regtest) +add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivedef.inf DESTINATION reactos NO_CAB FOR bootcd regtest) +add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivesft.inf DESTINATION reactos NO_CAB FOR bootcd regtest) +add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivesys.inf DESTINATION reactos NO_CAB FOR bootcd regtest) # livecd hives list(APPEND CD_HIVES diff --git a/boot/bootdata/hivedef.inf b/boot/bootdata/hivedef.inf index de0fec46bc8..25a1601e282 100644 --- a/boot/bootdata/hivedef.inf +++ b/boot/bootdata/hivedef.inf @@ -92,6 +92,8 @@ HKCU,"Control Panel\Desktop\WindowMetrics","MenuWidth",2,"18" HKCU,"Control Panel\Desktop\WindowMetrics","MenuHeight",2,"18" HKCU,"Control Panel\Desktop\WindowMetrics","BorderWidth",2,"1" HKCU,"Control Panel\Desktop\WindowMetrics","Shell Icon Size",2,"32" +HKCU,"Control Panel\Desktop\WindowMetrics","IconSpacing",2,"75" +HKCU,"Control Panel\Desktop\WindowMetrics","IconVerticalspacing",2,"75" HKCU, "Control Panel\Desktop\WindowMetrics","CaptionFont",0x00000001,f5,ff,ff,ff,00,00,00,\ 00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,6d,\ 00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ diff --git a/boot/freeldr/freeldr/CMakeLists.txt b/boot/freeldr/freeldr/CMakeLists.txt index cc65e0e6330..924a75d71cc 100644 --- a/boot/freeldr/freeldr/CMakeLists.txt +++ b/boot/freeldr/freeldr/CMakeLists.txt @@ -135,6 +135,7 @@ elseif(ARCH STREQUAL "amd64") arch/i386/hwapm.c arch/i386/hwdisk.c arch/i386/hwpci.c + arch/i386/i386bug.c arch/i386/i386rtl.c arch/i386/i386disk.c arch/i386/i386vid.c diff --git a/boot/freeldr/freeldr/arch/amd64/entry.S b/boot/freeldr/freeldr/arch/amd64/entry.S index 9390520ff2b..9379008f9de 100644 --- a/boot/freeldr/freeldr/arch/amd64/entry.S +++ b/boot/freeldr/freeldr/arch/amd64/entry.S @@ -52,6 +52,15 @@ stop: nop +PUBLIC Reboot +Reboot: + /* Set the function ID */ + mov bx, FNID_Reboot + + /* Switch to real mode (We don't return) */ + jmp SwitchToReal + + /* Internal function for realmode calls * bx must be set to the ID of the realmode function to call. */ PUBLIC CallRealMode diff --git a/boot/freeldr/freeldr/arch/amd64/winldr.c b/boot/freeldr/freeldr/arch/amd64/winldr.c index 68d8569b189..72a014734da 100644 --- a/boot/freeldr/freeldr/arch/amd64/winldr.c +++ b/boot/freeldr/freeldr/arch/amd64/winldr.c @@ -269,6 +269,7 @@ Amd64SetupGdt(PVOID GdtBase, ULONG64 TssBase) { PKGDTENTRY64 Entry; KDESCRIPTOR GdtDesc; + TRACE("Amd64SetupGdt(GdtBase = %p, TssBase = %p)\n", GdtBase, TssBase); /* Setup KGDT64_NULL */ Entry = KiGetGdtEntry(GdtBase, KGDT64_NULL); @@ -308,20 +309,22 @@ Amd64SetupGdt(PVOID GdtBase, ULONG64 TssBase) /* Set the new Gdt */ __lgdt(&GdtDesc.Limit); - TRACE("Gdtr.Base = %p, num = %ld\n", GdtDesc.Base, NUM_GDT); - + TRACE("Leave Amd64SetupGdt()\n"); } VOID Amd64SetupIdt(PVOID IdtBase) { KDESCRIPTOR IdtDesc, OldIdt; + ULONG Size; + TRACE("Amd64SetupIdt(IdtBase = %p)\n", IdtBase); /* Get old IDT */ - __sidt(&OldIdt); + __sidt(&OldIdt.Limit); /* Copy the old IDT */ - RtlCopyMemory(IdtBase, (PVOID)OldIdt.Base, OldIdt.Limit + 1); + Size = min(OldIdt.Limit + 1, NUM_IDT * sizeof(KIDTENTRY)); + //RtlCopyMemory(IdtBase, (PVOID)OldIdt.Base, Size); /* Setup the new IDT descriptor */ IdtDesc.Base = IdtBase; @@ -329,8 +332,7 @@ Amd64SetupIdt(PVOID IdtBase) /* Set the new IDT */ __lidt(&IdtDesc.Limit); - TRACE("Idtr.Base = %p\n", IdtDesc.Base); - + TRACE("Leave Amd64SetupIdt()\n"); } VOID @@ -354,7 +356,7 @@ WinLdrSetProcessorContext(void) Amd64SetupGdt(GdtIdt, KSEG0_BASE | (TssBasePage << MM_PAGE_SHIFT)); /* Copy old Idt and set idtr */ - Amd64SetupIdt((PVOID)((ULONG64)GdtIdt + 2048)); // HACK! + Amd64SetupIdt((PVOID)((ULONG64)GdtIdt + NUM_GDT * sizeof(KGDTENTRY))); /* LDT is unused */ // __lldt(0); @@ -390,7 +392,7 @@ void WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock) TssBasePage = Tss >> MM_PAGE_SHIFT; /* Allocate space for new GDT + IDT */ - BlockSize = NUM_GDT*sizeof(KGDTENTRY) + NUM_IDT*sizeof(KIDTENTRY);//FIXME: Use GDT/IDT limits here? + BlockSize = NUM_GDT * sizeof(KGDTENTRY) + NUM_IDT * sizeof(KIDTENTRY); NumPages = (BlockSize + MM_PAGE_SIZE - 1) >> MM_PAGE_SHIFT; GdtIdt = (PKGDTENTRY)MmAllocateMemoryWithType(NumPages * MM_PAGE_SIZE, LoaderMemoryData); if (GdtIdt == NULL) diff --git a/boot/freeldr/freeldr/debug.c b/boot/freeldr/freeldr/debug.c index 5ac8e10fbd0..e86060c73a2 100644 --- a/boot/freeldr/freeldr/debug.c +++ b/boot/freeldr/freeldr/debug.c @@ -24,6 +24,8 @@ #if DBG && !defined(_M_ARM) //#define DEBUG_ALL +//#define DEBUG_WARN +//#define DEBUG_ERR //#define DEBUG_INIFILE //#define DEBUG_REACTOS //#define DEBUG_CUSTOM @@ -49,7 +51,12 @@ ULONG DebugPort = RS232; //ULONG DebugPort = SCREEN; //ULONG DebugPort = BOCHS; //ULONG DebugPort = SCREEN|BOCHS; +#ifdef _WINKD_ +/* COM1 is the WinDbg port */ +ULONG ComPort = COM2; +#else ULONG ComPort = COM1; +#endif //ULONG BaudRate = 19200; ULONG BaudRate = 115200; @@ -59,6 +66,10 @@ VOID DebugInit(VOID) { #if defined (DEBUG_ALL) memset(DbgChannels, MAX_LEVEL, DBG_CHANNELS_COUNT); +#elif defined (DEBUG_WARN) + memset(DbgChannels, WARN_LEVEL|FIXME_LEVEL|ERR_LEVEL, DBG_CHANNELS_COUNT); +#elif defined (DEBUG_ERR) + memset(DbgChannels, ERR_LEVEL, DBG_CHANNELS_COUNT); #else memset(DbgChannels, 0, DBG_CHANNELS_COUNT); #endif diff --git a/boot/freeldr/freeldr/include/mm.h b/boot/freeldr/freeldr/include/mm.h index bc7687a71ca..4be199c0fe0 100644 --- a/boot/freeldr/freeldr/include/mm.h +++ b/boot/freeldr/freeldr/include/mm.h @@ -23,8 +23,13 @@ extern char __ImageBase; #ifdef __GNUC__ #define FREELDR_SECTION_COUNT 3 #else +#ifdef _M_AMD64 +/* .text and .pdata */ +#define FREELDR_SECTION_COUNT 2 +#else #define FREELDR_SECTION_COUNT 1 #endif +#endif typedef struct _FREELDR_MEMORY_DESCRIPTOR { diff --git a/boot/freeldr/freeldr/mm/meminit.c b/boot/freeldr/freeldr/mm/meminit.c index b9e8877c872..a36da8b42ca 100644 --- a/boot/freeldr/freeldr/mm/meminit.c +++ b/boot/freeldr/freeldr/mm/meminit.c @@ -174,7 +174,7 @@ MmCheckFreeldrImageFile() NtHeaders = RtlImageNtHeader(&__ImageBase); if (!NtHeaders) { - ERR("Coult not get NtHeaders!\n"); + ERR("Could not get NtHeaders!\n"); return FALSE; } @@ -184,8 +184,14 @@ MmCheckFreeldrImageFile() (FileHeader->NumberOfSections != FREELDR_SECTION_COUNT) || (FileHeader->PointerToSymbolTable != 0) || (FileHeader->NumberOfSymbols != 0) || - (FileHeader->SizeOfOptionalHeader != 0xE0)) + (FileHeader->SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER))) { + ERR("FreeLdr FileHeader is invalid.\n"); + BugCheckInfo[0] = FileHeader->Machine; + BugCheckInfo[1] = FileHeader->NumberOfSections; + BugCheckInfo[2] = FileHeader->PointerToSymbolTable; + BugCheckInfo[3] = FileHeader->NumberOfSymbols; + BugCheckInfo[4] = FileHeader->SizeOfOptionalHeader; return FALSE; } @@ -197,6 +203,12 @@ MmCheckFreeldrImageFile() (OptionalHeader->SizeOfImage > MAX_FREELDR_PE_SIZE) || (OptionalHeader->SectionAlignment != OptionalHeader->FileAlignment)) { + ERR("FreeLdr OptionalHeader is invalid.\n"); + BugCheckInfo[0] = 0x80000000 | (OptionalHeader->Subsystem << 16) | OptionalHeader->Magic; + BugCheckInfo[1] = OptionalHeader->ImageBase; + BugCheckInfo[2] = OptionalHeader->SizeOfImage; + BugCheckInfo[3] = OptionalHeader->SectionAlignment; + BugCheckInfo[4] = OptionalHeader->FileAlignment; return FALSE; } diff --git a/cmake/CMakeMacros.cmake b/cmake/CMakeMacros.cmake index ba7f4a73418..8a08e1a7147 100644 --- a/cmake/CMakeMacros.cmake +++ b/cmake/CMakeMacros.cmake @@ -422,3 +422,13 @@ function(get_defines OUTPUT_VAR) endforeach() set(${OUTPUT_VAR} ${__tmp_var} PARENT_SCOPE) endfunction() + +if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) + function(add_object_library _target) + add_library(${_target} OBJECT ${ARGN}) + endfunction() +else() + function(add_object_library _target) + add_library(${_target} ${ARGN}) + endfunction() +endif() diff --git a/cmake/config.cmake b/cmake/config.cmake index d3a6f26b644..13a566a2229 100644 --- a/cmake/config.cmake +++ b/cmake/config.cmake @@ -46,10 +46,12 @@ if(MSVC) endif() else() - set(KDBG TRUE CACHE BOOL -"Whether to compile in the integrated kernel debugger.") - set(_WINKD_ FALSE CACHE BOOL -"Whether to compile with the KD protocol.") + if(CMAKE_BUILD_TYPE STREQUAL "Release") + set(KDBG FALSE CACHE BOOL "Whether to compile in the integrated kernel debugger.") + else() + set(KDBG TRUE CACHE BOOL "Whether to compile in the integrated kernel debugger.") + endif() + set(_WINKD_ FALSE CACHE BOOL "Whether to compile with the KD protocol.") endif() set(_ELF_ FALSE CACHE BOOL diff --git a/cmake/gcc.cmake b/cmake/gcc.cmake index 35ca75ad22b..c3d2e0b7cbb 100644 --- a/cmake/gcc.cmake +++ b/cmake/gcc.cmake @@ -91,6 +91,12 @@ elseif(ARCH STREQUAL "amd64") add_compile_flags("-mpreferred-stack-boundary=4") endif() +# PSEH +if(GCC_VERSION VERSION_GREATER 4.7) + set(USE_PSEH3 1) + add_definitions(-D_USE_PSEH3=1) +endif() + # Other if(ARCH STREQUAL "amd64") add_definitions(-U_X86_ -UWIN32) diff --git a/dll/cpl/access/lang/ja-JP.rc b/dll/cpl/access/lang/ja-JP.rc index 32cd78797db..adf3ed105f7 100644 --- a/dll/cpl/access/lang/ja-JP.rc +++ b/dll/cpl/access/lang/ja-JP.rc @@ -7,21 +7,21 @@ CAPTION "キーボード" FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN GROUPBOX "固定キー機能",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) - LTEXT "固定キー機能 を使うと、キーを同時に押さなくても、Shift、Ctrl、Alt キーの機能 が使えます。",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) - AUTOCHECKBOX "固定キー機能 を使う(&U)",IDC_STICKY_BOX,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 + LTEXT "固定キー機能を使うと、キーを同時に押さなくても、Shift、Ctrl、Alt キーの機能が使えます。",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + AUTOCHECKBOX "固定キー機能を使う(&U)",IDC_STICKY_BOX,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "設定(&S)",IDC_STICKY_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(5)+2,PROPSHEETPADDING(15),14 GROUPBOX "フィルタ キー機能",-1,PROPSHEETPADDING(1),LABELLINE(8)+5,PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(7)+2 - LTEXT "フィルタ キー機能 を使うと、速いキー入力や繰り返されたキー入力を無視したり、繰り返し入力の間隔を長くしたりすることができます。",-1,PROPSHEETPADDING(2),LABELLINE(10)-3,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) - AUTOCHECKBOX "フィルタ キー機能 を使う(&F)",IDC_FILTER_BOX,PROPSHEETPADDING(2),LABELLINE(13)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 + LTEXT "フィルタ キー機能を使うと、速いキー入力や繰り返されたキー入力を無視したり、繰り返し入力の間隔を長くしたりすることができます。",-1,PROPSHEETPADDING(2),LABELLINE(10)-3,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + AUTOCHECKBOX "フィルタ キー機能を使う(&F)",IDC_FILTER_BOX,PROPSHEETPADDING(2),LABELLINE(13)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "設定(&E)",IDC_FILTER_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(13)+2,PROPSHEETPADDING(15),14 GROUPBOX "切り替えキー機能",-1,PROPSHEETPADDING(1),LABELLINE(16)+3,PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) - LTEXT "切り替えキー機能 を使うと、CapsLock、NumLock、ScrollLock キーを押したときに音を鳴らします。",-1,PROPSHEETPADDING(2),LABELLINE(18)-3,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(2) - AUTOCHECKBOX "切り替えキー機能 を使う(&T)",IDC_TOGGLE_BOX,PROPSHEETPADDING(2),LABELLINE(20)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 + LTEXT "切り替えキー機能を使うと、CapsLock、NumLock、ScrollLock キーを押したときに音を鳴らします。",-1,PROPSHEETPADDING(2),LABELLINE(18)-3,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(2) + AUTOCHECKBOX "切り替えキー機能を使う(&T)",IDC_TOGGLE_BOX,PROPSHEETPADDING(2),LABELLINE(20)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "設定(&N)",IDC_TOGGLE_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(20)+2,PROPSHEETPADDING(15),14 - AUTOCHECKBOX "プログラムで追加のキーボード ヘルプを表 示する(&W)",IDC_KEYBOARD_EXTRA,PROPSHEETPADDING(1),LABELLINE(23)+3,PROPSHEETWIDTH-PROPSHEETPADDING(2),14 + AUTOCHECKBOX "プログラムで追加のキーボード ヘルプを表示する(&W)",IDC_KEYBOARD_EXTRA,PROPSHEETPADDING(1),LABELLINE(23)+3,PROPSHEETWIDTH-PROPSHEETPADDING(2),14 END @@ -37,7 +37,7 @@ BEGIN COMBOBOX IDC_SENTRY_COMBO, PROPSHEETPADDING(2), LABELLINE(9), PROPSHEETWIDTH-PROPSHEETPADDING(4), LABELLINE(6), CBS_DROPDOWNLIST | WS_VSCROLL | WS_VISIBLE | WS_TABSTOP GROUPBOX "サウンド解説",-1,PROPSHEETPADDING(1),LABELLINE(12)+5,PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(7)+2 - LTEXT "プログラムが音を鳴らすとき、鳴らす音について解説を表 示します。",-1,PROPSHEETPADDING(2),LABELLINE(14)-3,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + LTEXT "プログラムが音を鳴らすとき、鳴らす音について解説を表示します。",-1,PROPSHEETPADDING(2),LABELLINE(14)-3,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) AUTOCHECKBOX "サウンド解説(&H)",IDC_SSHOW_BOX,PROPSHEETPADDING(2),LABELLINE(16)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),14 END @@ -48,7 +48,7 @@ CAPTION "画面" FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN GROUPBOX "ハイコントラスト",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) - LTEXT "この機能 を使うと、画面表 示に読みやすい配色とフォントを使います。",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + LTEXT "この機能を使うと、画面表示に読みやすい配色とフォントを使います。",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) AUTOCHECKBOX "ハイコントラストを使う(&U)",IDC_CONTRAST_BOX,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "設定(&S)",IDC_CONTRAST_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(5)+2,PROPSHEETPADDING(15),14 @@ -72,8 +72,8 @@ CAPTION "マウス" FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN GROUPBOX "マウス キー機能",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) - LTEXT "マウス キー機能 を使うと、テンキーを使ってマウス ポインタを操作できます。",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) - AUTOCHECKBOX "マウス キー機能 (&M)",IDC_MOUSE_BOX,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 + LTEXT "マウス キー機能を使うと、テンキーを使ってマウス ポインタを操作できます。",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + AUTOCHECKBOX "マウス キー機能(&M)",IDC_MOUSE_BOX,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "設定(&S)",IDC_MOUSE_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(5)+2,PROPSHEETPADDING(15),14 END @@ -292,7 +292,7 @@ END STRINGTABLE BEGIN IDS_CPLSYSTEMNAME "ユーザー補助" - IDS_CPLSYSTEMDESCRIPTION "視覚、聴覚、四肢の状態に合わせて、ユーザーを補助する機能 を調整します。" + IDS_CPLSYSTEMDESCRIPTION "視覚、聴覚、四肢の状態に合わせて、ユーザーを補助する機能を調整します。" IDS_SENTRY_NONE "[None]" IDS_SENTRY_TITLE "Flash the titlebar" diff --git a/dll/cpl/sysdm/lang/ja-JP.rc b/dll/cpl/sysdm/lang/ja-JP.rc index 0aa1b3f7981..1ea54056856 100644 --- a/dll/cpl/sysdm/lang/ja-JP.rc +++ b/dll/cpl/sysdm/lang/ja-JP.rc @@ -18,7 +18,7 @@ BEGIN LTEXT "", IDC_MACHINELINE4, 130, 171, 118, 9 LTEXT "", IDC_MACHINELINE5, 130, 180, 118, 9 CONTROL "ReactOS ホームページへ行く", IDC_ROSHOMEPAGE_LINK, "SysLink", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 200, 140, 10 - PUSHBUTTON "ライセンスを表 示(&L)...", IDC_LICENCE, 170, 199, 78, 13 + PUSHBUTTON "ライセンスを表示(&L)...", IDC_LICENCE, 170, 199, 78, 13 END @@ -29,7 +29,7 @@ FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN GROUPBOX "デバイス マネージャ", IDC_STATIC, 6, 7, 244, 61 ICON IDI_DEVMGR, IDC_STATIC, 12, 18, 23, 21, SS_ICON - LTEXT "デバイスマネージャはコンピュータに装着されているすべてのハードウェアを表 示 します。各デバイスのプロパティを変更するにはデバイスマネージャを使用 してください。", IDC_STATIC, 42, 18, 204, 24 + LTEXT "デバイスマネージャはコンピュータに装着されているすべてのハードウェアを表示 します。各デバイスのプロパティを変更するにはデバイスマネージャを使用 してください。", IDC_STATIC, 42, 18, 204, 24 PUSHBUTTON "デバイス マネージャ(&D)...", IDC_HARDWARE_DEVICE_MANAGER, 154, 48, 90, 15 GROUPBOX "ハードウェア ウィザード", IDC_STATIC, 6, 79, 244, 61 @@ -39,7 +39,7 @@ BEGIN GROUPBOX "ハードウェア プロファイル", IDC_STATIC, 6, 149, 244, 61 ICON IDI_HARDPROF, IDC_STATIC, 12, 160, 23, 21, SS_ICON - LTEXT "ハードウェアプロファイルは別のハードウェアの構 成を設定し、格納する方法を 提供します。", IDC_STATIC, 42, 160, 204, 24 + LTEXT "ハードウェアプロファイルは別のハードウェアの構成を設定し、格納する方法を 提供します。", IDC_STATIC, 42, 160, 204, 24 PUSHBUTTON "ハードウェア プロファイル(&W)...", IDC_HARDWARE_PROFILE, 154, 190, 90, 15 END @@ -86,8 +86,8 @@ CAPTION "ハードウェア プロファイル" FONT 9, "MS UI Gothic" BEGIN ICON IDI_HARDPROF, IDC_STATIC, 8, 11, 18, 20, SS_ICON - LTEXT "異なるハードウェア構 成に合わせたハードウェア プロファイルをセットアップできます。 起動時に使用するプロファイルを選択できます。", IDC_STATIC, 46, 11, 188, 25 - LTEXT "利用可能 なハードウェア プロファイル:", IDC_STATIC, 8, 41, 120, 8 + LTEXT "異なるハードウェア構成に合わせたハードウェア プロファイルをセットアップできます。 起動時に使用するプロファイルを選択できます。", IDC_STATIC, 46, 11, 188, 25 + LTEXT "利用可能なハードウェア プロファイル:", IDC_STATIC, 8, 41, 120, 8 LISTBOX IDC_HRDPROFLSTBOX, 8, 52, 215, 54, LBS_NOTIFY PUSHBUTTON "", IDC_HRDPROFUP, 232, 59, 15, 14, BS_ICON | WS_DISABLED PUSHBUTTON "", IDC_HRDPROFDWN, 232, 79, 15, 14, BS_ICON | WS_DISABLED @@ -169,11 +169,11 @@ BEGIN GROUPBOX "システムの起動", IDC_STATIC, 7, 12, 238, 95 LTEXT "既定のオペレーティング システム(&S):", IDC_STATIC, 14, 26, 100, 8 COMBOBOX IDC_STRECOSCOMBO, 14, 37, 224, 46, CBS_DROPDOWNLIST - AUTOCHECKBOX "オペレーティング システムの一覧を表 示する時間(&T):", IDC_STRECLIST, 14, 56, 160, 8 + AUTOCHECKBOX "オペレーティング システムの一覧を表示する時間(&T):", IDC_STRECLIST, 14, 56, 160, 8 EDITTEXT IDC_STRRECLISTEDIT, 185, 54, 30, 12, ES_NUMBER CONTROL "", IDC_STRRECLISTUPDWN, "msctls_updown32", UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_CHILD | WS_VISIBLE, 0, 0, 8, 13 LTEXT "秒", IDC_STATIC, 223, 56, 18, 8 - AUTOCHECKBOX "必要なときに修復オプションを表 示する時間(&D):", IDC_STRRECREC, 14, 70, 170, 8 + AUTOCHECKBOX "必要なときに修復オプションを表示する時間(&D):", IDC_STRRECREC, 14, 70, 170, 8 EDITTEXT IDC_STRRECRECEDIT, 185, 68, 30, 12, ES_NUMBER CONTROL "", IDC_STRRECRECUPDWN, "msctls_updown32", UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_CHILD | WS_VISIBLE, 0, 0, 8, 13 LTEXT "秒", IDC_STATIC, 223, 70, 18, 8 diff --git a/dll/cpl/telephon/lang/ja-JP.rc b/dll/cpl/telephon/lang/ja-JP.rc index 356fc2117a2..4f715db656a 100644 --- a/dll/cpl/telephon/lang/ja-JP.rc +++ b/dll/cpl/telephon/lang/ja-JP.rc @@ -3,5 +3,5 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_CPLSYSTEMNAME "電話とモデムのオプション" - IDS_CPLSYSTEMDESCRIPTION "電話のダイヤル情報とモデムのプロパティを構 成します。" + IDS_CPLSYSTEMDESCRIPTION "電話のダイヤル情報とモデムのプロパティを構成します。" END diff --git a/dll/cpl/timedate/lang/it-IT.rc b/dll/cpl/timedate/lang/it-IT.rc index bca07521721..f54ebdfd93b 100644 --- a/dll/cpl/timedate/lang/it-IT.rc +++ b/dll/cpl/timedate/lang/it-IT.rc @@ -15,7 +15,7 @@ BEGIN CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 11, 37, 108, 80, WS_EX_CLIENTEDGE - GROUPBOX "&Time", -1, 132, 2, 113, 125 + GROUPBOX "&Ora", -1, 132, 2, 113, 125 CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32", DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 144, 105, 90, 12 @@ -50,7 +50,7 @@ BEGIN PUSHBUTTON "Aggiorna ora", IDC_UPDATEBUTTON, 187, 22, 49, 14 LTEXT "", IDC_SUCSYNC, 12, 54, 214, 23 LTEXT "", IDC_NEXTSYNC, 12, 96, 137, 12 - LTEXT "La sincronizzazione pu avvenire solo quando il computer connesso a Internet.", -1, 12, 114, 225, 25 + LTEXT "La sincronizzazione può avvenire solo quando il computer è connesso a Internet.", -1, 12, 114, 225, 25 END @@ -61,7 +61,7 @@ BEGIN IDS_TIMEZONETEXT "Fuso orario corrente: %s" IDS_TIMEZONEINVALID "Non valido" IDS_TIMEZONEUNKNOWN "Sconosciuto" - IDS_INETTIMESUCSYNC "L'ora stata sincronizzata correttamente con %s %s alle %s" + IDS_INETTIMESUCSYNC "L'ora è stata sincronizzata correttamente con %s %s alle %s" IDS_INETTIMENEXTSYNC "Prossima sincronizzazione: %s alle %s" IDS_INETTIMESYNCING "Sincronizzazione ora con %s" IDS_INETTIMEERROR "E' stato rilevato un errore mentre ReactOS si stava sincronizzando con %s" diff --git a/dll/cpl/timedate/rsrc.rc b/dll/cpl/timedate/rsrc.rc index 99b6ddee2ab..099879b900c 100644 --- a/dll/cpl/timedate/rsrc.rc +++ b/dll/cpl/timedate/rsrc.rc @@ -31,9 +31,6 @@ #ifdef LANGUAGE_ID_ID #include "lang/id-ID.rc" #endif -#ifdef LANGUAGE_IT_IT - #include "lang/it-IT.rc" -#endif #ifdef LANGUAGE_JA_JP #include "lang/ja-JP.rc" #endif @@ -58,9 +55,13 @@ // UTF-8 #pragma code_page(65001) + #ifdef LANGUAGE_HE_IL #include "lang/he-IL.rc" #endif +#ifdef LANGUAGE_IT_IT + #include "lang/it-IT.rc" +#endif #ifdef LANGUAGE_PL_PL #include "lang/pl-PL.rc" #endif diff --git a/dll/directx/ddraw/CMakeLists.txt b/dll/directx/ddraw/CMakeLists.txt new file mode 100644 index 00000000000..1d69eee2381 --- /dev/null +++ b/dll/directx/ddraw/CMakeLists.txt @@ -0,0 +1,61 @@ + +spec2def(ddraw.dll ddraw.spec ADD_IMPORTLIB) + +list(APPEND SOURCE + cleanup.c + main.c + startup.c + Clipper/clipper_main.c + Clipper/clipper_stubs.c + Color/color_stubs.c + d3d/DirectD3D_main.c + Ddraw/callbacks_dd_hel.c + Ddraw/ddraw_displaymode.c + Ddraw/ddraw_main.c + Ddraw/ddraw_setcooperativelevel.c + Ddraw/ddraw_stubs.c + Ddraw/GetCaps.c + Ddraw/GetDeviceIdentifier.c + Gamma/gamma_stubs.c + Kernel/kernel_stubs.c + Palette/createpalette.c + Palette/palette.c + Surface/callbacks_surf_hel.c + Surface/createsurface.c + Surface/surface_main.c + Surface/surface_stubs.c + Videoport/videoport_stubs.c + Vtable/DirectD3D_Vtable.c + Vtable/DirectD3D2_Vtable.c + Vtable/DirectD3D3_Vtable.c + Vtable/DirectD3D7_Vtable.c + Vtable/DirectDraw_Vtable.c + Vtable/DirectDraw2_Vtable.c + Vtable/DirectDraw4_Vtable.c + Vtable/DirectDraw7_Vtable.c + Vtable/DirectDrawSurface_Vtable.c + Vtable/DirectDrawSurface2_Vtable.c + Vtable/DirectDrawSurface3_Vtable.c + Vtable/DirectDrawSurface4_Vtable.c + Vtable/DirectDrawSurface7_Vtable.c +) + +add_library(ddraw SHARED ${SOURCE}) + +set_module_type(ddraw win32dll) + +target_link_libraries(ddraw + uuid + dxguid + ${PSEH_LIB} +) + +add_importlibs(ddraw + advapi32 + gdi32 + user32 + msvcrt + kernel32 + ntdll) + +add_cd_file(TARGET ddraw DESTINATION reactos/system32 FOR all) \ No newline at end of file diff --git a/dll/directx/ksproxy/output_pin.cpp b/dll/directx/ksproxy/output_pin.cpp index a272542be52..79a4b04498b 100644 --- a/dll/directx/ksproxy/output_pin.cpp +++ b/dll/directx/ksproxy/output_pin.cpp @@ -1676,7 +1676,7 @@ COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) assert(m_hPin != INVALID_HANDLE_VALUE); // get all supported sets - if (m_Plugins.size() == 0) + if (m_Plugins.empty()) { if (GetSupportedSets(&pGuid, &NumGuids)) { diff --git a/dll/ntdll/def/ntdll.spec b/dll/ntdll/def/ntdll.spec index b9d3a3016aa..d212ecffc45 100644 --- a/dll/ntdll/def/ntdll.spec +++ b/dll/ntdll/def/ntdll.spec @@ -442,7 +442,7 @@ @ stdcall RtlAddVectoredExceptionHandler(long ptr) ;@ stdcall RtlAddressInSectionTable @ stdcall RtlAdjustPrivilege(long long long ptr) -@ stdcall RtlAllocateActivationContextStack(ptr) ; CHEKME +@ stdcall RtlAllocateActivationContextStack(ptr) ; CHECKME @ stdcall RtlAllocateAndInitializeSid(ptr long long long long long long long long long ptr) @ stdcall RtlAllocateHandle(ptr ptr) @ stdcall RtlAllocateHeap(ptr long ptr) @@ -635,7 +635,7 @@ @ stdcall RtlFormatCurrentUserKeyPath(ptr) @ stdcall RtlFormatMessage(ptr long long long long ptr ptr long) ;@ stdcall RtlFormatMessageEx -;@ stdcall RtlFreeActivationContextStack +@ stdcall RtlFreeActivationContextStack(ptr) @ stdcall RtlFreeAnsiString(long) @ stdcall RtlFreeHandle(ptr ptr) @ stdcall RtlFreeHeap(long long long) diff --git a/dll/ntdll/ldr/ldrinit.c b/dll/ntdll/ldr/ldrinit.c index 8b6540242ac..5e222532ce6 100644 --- a/dll/ntdll/ldr/ldrinit.c +++ b/dll/ntdll/ldr/ldrinit.c @@ -508,7 +508,7 @@ LdrpInitializeThread(IN PCONTEXT Context) /* Allocate an Activation Context Stack */ DPRINT("ActivationContextStack %p\n", NtCurrentTeb()->ActivationContextStackPointer); - Status = RtlAllocateActivationContextStack((PVOID*)&NtCurrentTeb()->ActivationContextStackPointer); + Status = RtlAllocateActivationContextStack(&NtCurrentTeb()->ActivationContextStackPointer); if (!NT_SUCCESS(Status)) { DPRINT1("Warning: Unable to allocate ActivationContextStack\n"); @@ -1709,7 +1709,7 @@ LdrpInitializeProcess(IN PCONTEXT Context, } /* Allocate an Activation Context Stack */ - Status = RtlAllocateActivationContextStack((PVOID *)&Teb->ActivationContextStackPointer); + Status = RtlAllocateActivationContextStack(&Teb->ActivationContextStackPointer); if (!NT_SUCCESS(Status)) return Status; // FIXME: Loader private heap is missing diff --git a/dll/opengl/opengl32/CMakeLists.txt b/dll/opengl/opengl32/CMakeLists.txt index 57e906b8e60..4fb60910f8b 100644 --- a/dll/opengl/opengl32/CMakeLists.txt +++ b/dll/opengl/opengl32/CMakeLists.txt @@ -1,5 +1,4 @@ - spec2def(opengl32.dll opengl32.spec ADD_IMPORTLIB) add_definitions( @@ -16,19 +15,8 @@ list(APPEND SOURCE ${CMAKE_CURRENT_BINARY_DIR}/opengl32.def) add_library(opengl32 SHARED ${SOURCE}) - +target_link_libraries(opengl32 wine) set_module_type(opengl32 win32dll UNICODE) - -add_importlibs(opengl32 - msvcrt - gdi32 - user32 - advapi32 - glu32 - kernel32 - ntdll) - +add_importlibs(opengl32 gdi32 user32 advapi32 msvcrt kernel32 ntdll) add_pch(opengl32 opengl32.h) - add_cd_file(TARGET opengl32 DESTINATION reactos/system32 FOR all) - diff --git a/dll/opengl/opengl32/font.c b/dll/opengl/opengl32/font.c index 4f67b572e27..800b80143c4 100644 --- a/dll/opengl/opengl32/font.c +++ b/dll/opengl/opengl32/font.c @@ -1,1155 +1,565 @@ -/**************************************************************************** -* Copyright (C) 1991-2004 SciTech Software, Inc. All rights reserved. -* -* Permission is hereby granted, free of charge, to any person obtaining a -* copy of this software and associated documentation files (the "Software"), -* to deal in the Software without restriction, including without limitation -* the rights to use, copy, modify, merge, publish, distribute, sublicense, -* and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included -* in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -* SCITECH SOFTWARE INC BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF -* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -****************************************************************************/ +/* Window-specific OpenGL functions implementation. + * + * Copyright (c) 1999 Lionel Ulmer + * Copyright (c) 2005 Raphael Junqueira + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ -#include "opengl32.h" +#include #include +#include -#define LINE_BUF_QUANT 4000 -#define VERT_BUF_QUANT 4000 +#include +#include +#include -static HFONT hNewFont, hOldFont; -static FLOAT ScaleFactor; -static FLOAT* LineBuf; -static DWORD LineBufSize; -static DWORD LineBufIndex; -static FLOAT* VertBuf; -static DWORD VertBufSize; -static DWORD VertBufIndex; -static GLenum TessErrorOccurred; +#include "wine/debug.h" -/***************************************************************************** -* AppendToLineBuf -* -* Appends one floating-point value to the global LineBuf array. Return value -* is non-zero for success, zero for failure. -*****************************************************************************/ +WINE_DEFAULT_DEBUG_CHANNEL(wgl); -INT AppendToLineBuf(FLOAT value) +/*********************************************************************** + * wglUseFontBitmaps_common + */ +static BOOL wglUseFontBitmaps_common( HDC hdc, DWORD first, DWORD count, DWORD listBase, BOOL unicode ) { - if (LineBufIndex >= LineBufSize) - { - FLOAT* f; - LineBufSize += LINE_BUF_QUANT; - - f = (FLOAT*) HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, LineBuf, (LineBufSize) * sizeof(FLOAT)); - if (!f) - return 0; - LineBuf = f; - } - LineBuf[LineBufIndex++] = value; - return 1; -} - -/***************************************************************************** -* AppendToVertBuf -* -* Appends one floating-point value to the global VertBuf array. Return value -* is non-zero for success, zero for failure. -* -* Note that we can't realloc this one, because the tessellator is using -* pointers into it. -*****************************************************************************/ - -INT AppendToVertBuf(FLOAT value) -{ - if (VertBufIndex >= VertBufSize) - return 0; - VertBuf[VertBufIndex++] = value; - return 1; -} - -/***************************************************************************** -* GetWord -* -* Fetch the next 16-bit word from a little-endian byte stream, and increment -* the stream pointer to the next unscanned byte. -*****************************************************************************/ - -LONG GetWord(UCHAR** p) -{ - LONG value; - - value = ((*p)[1] << 8) + (*p)[0]; - *p += 2; - return value; -} - -/***************************************************************************** -* GetDWord -* -* Fetch the next 32-bit word from a little-endian byte stream, and increment -* the stream pointer to the next unscanned byte. -*****************************************************************************/ - -LONG GetDWord(UCHAR** p) -{ - LONG value; - - value = ((*p)[3] << 24) + ((*p)[2] << 16) + ((*p)[1] << 8) + (*p)[0]; - *p += 4; - return value; -} - -/***************************************************************************** -* GetFixed -* -* Fetch the next 32-bit fixed-point value from a little-endian byte stream, -* convert it to floating-point, and increment the stream pointer to the next -* unscanned byte. -*****************************************************************************/ -double GetFixed(UCHAR** p) -{ - LONG hiBits, loBits; - double value; - - loBits = GetWord(p); - hiBits = GetWord(p); - value = (double) ((hiBits << 16) | loBits) / 65536.0; - - return value * ScaleFactor; -} - - -/***************************************************************************** -** -** InvertGlyphBitmap. -** -** Invert the bitmap so that it suits OpenGL's representation. -** Each row starts on a double word boundary. -** -*****************************************************************************/ - -VOID InvertGlyphBitmap(INT w, INT h, DWORD *fptr, DWORD *tptr) -{ - INT dWordsInRow = (w+31)/32; - INT i, j; - - if (w <= 0 || h <= 0) { - return; - } - - tptr += ((h-1)*dWordsInRow); - for (i = 0; i < h; i++) { - for (j = 0; j < dWordsInRow; j++) { - *(tptr + j) = *(fptr + j); - } - tptr -= dWordsInRow; - fptr += dWordsInRow; - } -} - -/***************************************************************************** -* CreateHighResolutionFont -* -* Gets metrics for the current font and creates an equivalent font -* scaled to the design units of the font. -* -*****************************************************************************/ - -HFONT CreateHighResolutionFont(HDC hDC) -{ - UINT otmSize; - OUTLINETEXTMETRIC *otm; - LONG fontHeight, fontWidth, fontUnits; - LOGFONTW logFont, logFontFaceName; - - otmSize = GetOutlineTextMetricsW(hDC, 0, NULL); - if (!otmSize) - return NULL; - - otm = (OUTLINETEXTMETRIC *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, otmSize); - if (!otm) - return NULL; - - otm->otmSize = otmSize; - if (!GetOutlineTextMetricsW(hDC, otmSize, otm)) - return NULL; - - GetObjectW(GetCurrentObject(hDC, OBJ_FONT), sizeof(logFontFaceName), &logFontFaceName); - - fontHeight = otm->otmTextMetrics.tmHeight - - otm->otmTextMetrics.tmInternalLeading; - fontWidth = otm->otmTextMetrics.tmAveCharWidth; - fontUnits = (LONG) otm->otmEMSquare; - - ScaleFactor = 1.0F / (FLOAT) fontUnits; - - logFont.lfHeight = - ((LONG) fontUnits); - logFont.lfWidth = (LONG)((FLOAT) (fontWidth * fontUnits) / (FLOAT) fontHeight); - logFont.lfEscapement = 0; - logFont.lfOrientation = 0; - logFont.lfWeight = otm->otmTextMetrics.tmWeight; - logFont.lfItalic = otm->otmTextMetrics.tmItalic; - logFont.lfUnderline = otm->otmTextMetrics.tmUnderlined; - logFont.lfStrikeOut = otm->otmTextMetrics.tmStruckOut; - logFont.lfCharSet = otm->otmTextMetrics.tmCharSet; - logFont.lfOutPrecision = OUT_OUTLINE_PRECIS; - logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; - logFont.lfQuality = DEFAULT_QUALITY; - logFont.lfPitchAndFamily = - otm->otmTextMetrics.tmPitchAndFamily & 0xf0; - wcscpy(logFont.lfFaceName, logFontFaceName.lfFaceName); - - hNewFont = CreateFontIndirectW(&logFont); - - HeapFree(GetProcessHeap(), 0, otm); - - return hNewFont; -} - -/***************************************************************************** -* MakeLinesFromArc -* -* Subdivides one arc of a quadratic spline until the chordal deviation -* tolerance requirement is met, then places the resulting set of line -* segments in the global LineBuf. -*****************************************************************************/ -INT MakeLinesFromArc(FLOAT x0, FLOAT y0, FLOAT x1, FLOAT y1, FLOAT x2, FLOAT y2, - DWORD vertexCountIndex, FLOAT chordalDeviationSquared) -{ - FLOAT x01; - FLOAT y01; - FLOAT x12; - FLOAT y12; - FLOAT midPointX; - FLOAT midPointY; - FLOAT deltaX; - FLOAT deltaY; - - /* - * Calculate midpoint of the curve by de Casteljau: - */ - x01 = 0.5F * (x0 + x1); - y01 = 0.5F * (y0 + y1); - x12 = 0.5F * (x1 + x2); - y12 = 0.5F * (y1 + y2); - midPointX = 0.5F * (x01 + x12); - midPointY = 0.5F * (y01 + y12); - - - /* - * Estimate chordal deviation by the distance from the midpoint - * of the curve to its non-pointpolated control point. If this - * distance is greater than the specified chordal deviation - * constraint, then subdivide. Otherwise, generate polylines - * from the three control points. - */ - deltaX = midPointX - x1; - deltaY = midPointY - y1; - - if (deltaX * deltaX + deltaY * deltaY > chordalDeviationSquared) - { - MakeLinesFromArc( x0, y0, - x01, y01, - midPointX, midPointY, - vertexCountIndex, - chordalDeviationSquared); - - MakeLinesFromArc( midPointX, midPointY, - x12, y12, - x2, y2, - vertexCountIndex, - chordalDeviationSquared); - } - else - { - /* - * The "pen" is already at (x0, y0), so we don't need to - * add that point to the LineBuf. - */ - if (!AppendToLineBuf(x1) - || !AppendToLineBuf(y1) - || !AppendToLineBuf(x2) - || !AppendToLineBuf(y2)) - return 0; - LineBuf[vertexCountIndex] += 2.0F; - } - - return 1; -} - -/***************************************************************************** -* MakeLinesFromTTQSpline -* -* Converts points from the poly quadratic spline in a TT_PRIM_QSPLINE -* structure to polyline points in the global LineBuf. -*****************************************************************************/ - -INT MakeLinesFromTTQSpline( UCHAR** pp, DWORD vertexCountIndex, WORD pointCount, FLOAT chordalDeviation) -{ - FLOAT x0, y0, x1, y1, x2, y2; - WORD point; - - /* - * Process each of the non-pointpolated points in the outline. - * To do this, we need to generate two pointpolated points (the - * start and end of the arc) for each non-pointpolated point. - * The first pointpolated point is always the one most recently - * stored in LineBuf, so we just extract it from there. The - * second pointpolated point is either the average of the next - * two points in the QSpline, or the last point in the QSpline - * if only one remains. - */ - for (point = 0; point < pointCount - 1; ++point) - { - x0 = LineBuf[LineBufIndex - 2]; - y0 = LineBuf[LineBufIndex - 1]; - - x1 = (FLOAT) GetFixed(pp); - y1 = (FLOAT) GetFixed(pp); - - if (point == pointCount - 2) - { - /* - * This is the last arc in the QSpline. The final - * point is the end of the arc. - */ - x2 = (FLOAT) GetFixed(pp); - y2 = (FLOAT) GetFixed(pp); - } - else - { - /* - * Peek at the next point in the input to compute - * the end of the arc: - */ - x2 = 0.5F * (x1 + (FLOAT) GetFixed(pp)); - y2 = 0.5F * (y1 + (FLOAT) GetFixed(pp)); - /* - * Push the point back onto the input so it will - * be reused as the next off-curve point: - */ - *pp -= 8; - } - - if (!MakeLinesFromArc( x0, y0, - x1, y1, - x2, y2, - vertexCountIndex, - chordalDeviation * chordalDeviation)) - return 0; - } - - return 1; -} - -/***************************************************************************** -* MakeLinesFromTTLine -* -* Converts points from the polyline in a TT_PRIM_LINE structure to -* equivalent points in the global LineBuf. -*****************************************************************************/ -INT MakeLinesFromTTLine(UCHAR** pp, DWORD vertexCountIndex, WORD pointCount) -{ - /* - * Just copy the line segments into the line buffer (converting - * type as we go): - */ - LineBuf[vertexCountIndex] += pointCount; - while (pointCount--) - { - if (!AppendToLineBuf((FLOAT) GetFixed(pp)) /* X coord */ - || !AppendToLineBuf((FLOAT) GetFixed(pp))) /* Y coord */ - return 0; - } - - return 1; -} - -/***************************************************************************** -* MakeLinesFromTTPolyCurve -* -* Converts the lines and splines in a single TTPOLYCURVE structure to points -* in the global LineBuf. -*****************************************************************************/ - -INT MakeLinesFromTTPolycurve(UCHAR** pp, DWORD vertexCountIndex, FLOAT chordalDeviation) -{ - WORD type; - WORD pointCount; - - /* - * Pick up the relevant fields of the TTPOLYCURVE structure: - */ - type = (WORD) GetWord(pp); - pointCount = (WORD) GetWord(pp); - - /* - * Convert the "curve" to line segments: - */ - if (type == TT_PRIM_LINE) - return MakeLinesFromTTLine( pp, - vertexCountIndex, - pointCount); - else if (type == TT_PRIM_QSPLINE) - return MakeLinesFromTTQSpline( pp, - vertexCountIndex, - pointCount, - chordalDeviation); - else - return 0; -} - -/***************************************************************************** -* MakeLinesFromTTPolygon -* -* Converts a TTPOLYGONHEADER and its associated curve structures into a -* single polyline loop in the global LineBuf. -*****************************************************************************/ - -INT MakeLinesFromTTPolygon(UCHAR** pp, FLOAT chordalDeviation) -{ - DWORD polySize; - UCHAR* polyStart; - DWORD vertexCountIndex; - - /* - * Record where the polygon data begins, and where the loop's - * vertex count resides: - */ - polyStart = *pp; - vertexCountIndex = LineBufIndex; - if (!AppendToLineBuf(0.0F)) - return 0; - - /* - * Extract relevant data from the TTPOLYGONHEADER: - */ - polySize = GetDWord(pp); - if (GetDWord(pp) != TT_POLYGON_TYPE) /* polygon type */ - return 0; - if (!AppendToLineBuf((FLOAT) GetFixed(pp))) /* first X coord */ - return 0; - if (!AppendToLineBuf((FLOAT) GetFixed(pp))) /* first Y coord */ - return 0; - LineBuf[vertexCountIndex] += 1.0F; - - /* - * Process each of the TTPOLYCURVE structures in the polygon: - */ - while (*pp < polyStart + polySize) - if (!MakeLinesFromTTPolycurve( pp, - vertexCountIndex, - chordalDeviation)) - return 0; - - return 1; -} - -/***************************************************************************** -* TessVertexOut -* -* Used by tessellator to handle output vertexes. -*****************************************************************************/ - -VOID CALLBACK TessVertexOutData(FLOAT p[3], GLfloat *pz) -{ - GLfloat v[3]; - v[0] = (GLfloat) p[0]; - v[1] = (GLfloat) p[1]; - v[2] = *pz; - glVertex3fv(v); -} - -/***************************************************************************** -* TessCombine -* -* Used by tessellator to handle self-pointsecting contours and degenerate -* geometry. -*****************************************************************************/ -VOID CALLBACK TessCombine(double coords[3], VOID* vertex_data[4], FLOAT weight[4], VOID** outData) -{ - if (!AppendToVertBuf((FLOAT) coords[0]) - || !AppendToVertBuf((FLOAT) coords[1]) - || !AppendToVertBuf((FLOAT) coords[2])) - TessErrorOccurred = GL_OUT_OF_MEMORY; - - *outData = VertBuf + (VertBufIndex - 3); -} - -/***************************************************************************** -* TessError -* -* Saves the last tessellator error code in the global TessErrorOccurred. -*****************************************************************************/ - -VOID CALLBACK TessError(GLenum error) -{ - TessErrorOccurred = error; -} - -/***************************************************************************** -* MakeLinesFromGlyph -* -* Converts the outline of a glyph from the TTPOLYGON format to a simple -* array of floating-point values containing one or more loops. -* -* The first element of the output array is a count of the number of loops. -* The loop data follows this count. Each loop consists of a count of the -* number of vertices it contains, followed by the vertices. Each vertex -* is an X and Y coordinate. For example, a single triangle might be -* described by this array: -* -* 1., 3., 0., 0., 1., 0., 0., 1. -* ^ ^ ^ ^ ^ ^ ^ ^ -* #loops #verts x1 y1 x2 y2 x3 y3 -* -* A two-loop glyph would look like this: -* -* 2., 3., 0.,0., 1.,0., 0.,1., 3., .2,.2, .4,.2, .2,.4 -* -* Line segments from the TTPOLYGON are transferred to the output array in -* the obvious way. Quadratic splines in the TTPOLYGON are converted to -* collections of line segments -*****************************************************************************/ - -INT MakeLinesFromGlyph(UCHAR* glyphBuf, DWORD glyphSize, FLOAT chordalDeviation) -{ - UCHAR* p; - INT status = 0; - - /* - * Pick up all the polygons (aka loops) that make up the glyph: - */ - if (!AppendToLineBuf(0.0F)) /* loop count at LineBuf[0] */ - goto exit; - - p = glyphBuf; - while (p < glyphBuf + glyphSize) - { - if (!MakeLinesFromTTPolygon(&p, chordalDeviation)) - goto exit; - LineBuf[0] += 1.0F; /* increment loop count */ - } - - status = 1; - -exit: - return status; -} - -/***************************************************************************** -* DrawGlyph -* -* Converts the outline of a glyph to OpenGL drawing primitives, tessellating -* as needed, and then draws the glyph. Tessellation of the quadratic splines -* in the outline is controlled by "chordalDeviation", and the drawing -* primitives (lines or polygons) are selected by "format". -* -* Return value is nonzero for success, zero for failure. -* -* Does not check for OpenGL errors, so if the caller needs to know about them, -* it should call glGetError(). -*****************************************************************************/ - -INT DrawGlyph(UCHAR* glyphBuf, DWORD glyphSize, FLOAT chordalDeviation, FLOAT extrusion, INT format) -{ - INT status = 0; - FLOAT* p; - DWORD loop; - DWORD point; - GLUtesselator* tess = NULL; - - /* - * Initialize the global buffer into which we place the outlines: - */ - LineBuf = (FLOAT*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (LINE_BUF_QUANT) * sizeof(FLOAT)); - - if(!LineBuf) - goto exit; - - LineBufSize = LINE_BUF_QUANT; - LineBufIndex = 0; - - /* - * Convert the glyph outlines to a set of polyline loops. - * (See MakeLinesFromGlyph() for the format of the loop data - * structure.) - */ - if (!MakeLinesFromGlyph(glyphBuf, glyphSize, chordalDeviation)) - goto exit; - p = LineBuf; - - - /* - * Now draw the loops in the appropriate format: - */ - if (format == WGL_FONT_LINES) - { - /* - * This is the easy case. Just draw the outlines. - */ - for (loop = (DWORD) *p++; loop; --loop) - { - glBegin(GL_LINE_LOOP); - for (point = (DWORD) *p++; point; --point) - { - glVertex2fv(p); - p += 2; - } - glEnd(); - } - status = 1; - } - - else if (format == WGL_FONT_POLYGONS) - { - double v[3]; - FLOAT *save_p = p; - GLfloat z_value; - - /* - * This is the hard case. We have to set up a tessellator - * to convert the outlines into a set of polygonal - * primitives, which the tessellator passes to some - * auxiliary routines for drawing. - */ - - VertBuf = (FLOAT*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (VERT_BUF_QUANT) * sizeof(FLOAT)); - - if (!VertBuf) - goto exit; - - VertBufSize = VERT_BUF_QUANT; - VertBufIndex = 0; - - if (!(tess = gluNewTess())) - goto exit; - - gluTessCallback(tess, GLU_BEGIN, (VOID(CALLBACK *)()) glBegin); - gluTessCallback(tess, GLU_TESS_VERTEX_DATA, (VOID(CALLBACK *)()) TessVertexOutData); - gluTessCallback(tess, GLU_END, (VOID(CALLBACK *)()) glEnd); - gluTessCallback(tess, GLU_ERROR, (VOID(CALLBACK *)()) TessError); - gluTessCallback(tess, GLU_TESS_COMBINE, (VOID(CALLBACK *)()) TessCombine); - gluTessNormal(tess, 0.0F, 0.0F, 1.0F); - - TessErrorOccurred = 0; - glNormal3f(0.0f, 0.0f, 1.0f); - v[2] = 0.0; - z_value = 0.0f; - - gluTessBeginPolygon(tess, &z_value); - - for (loop = (DWORD) *p++; loop; --loop) - { - gluTessBeginContour(tess); - - for (point = (DWORD) *p++; point; --point) - { - v[0] = p[0]; - v[1] = p[1]; - gluTessVertex(tess, v, p); - p += 2; - } - - gluTessEndContour(tess); - } - gluTessEndPolygon(tess); - - status = !TessErrorOccurred; - - /* Extrusion code */ - if (extrusion) - { - DWORD loops; - GLfloat thickness = (GLfloat) - extrusion; - FLOAT *vert, *vert2; - DWORD count; - - p = save_p; - loops = (DWORD) *p++; - - for (loop = 0; loop < loops; loop++) - { - GLfloat dx, dy, len; - DWORD last; - - count = (DWORD) *p++; - glBegin(GL_QUAD_STRIP); - - /* Check if the first and last vertex are identical - * so we don't draw the same quad twice. - */ - vert = p + (count-1)*2; - last = (p[0] == vert[0] && p[1] == vert[1]) ? count-1 : count; - - for (point = 0; point <= last; point++) - { - vert = p + 2 * (point % last); - vert2 = p + 2 * ((point+1) % last); - - dx = vert[0] - vert2[0]; - dy = vert[1] - vert2[1]; - len = (GLfloat)sqrt(dx * dx + dy * dy); - - glNormal3f(dy / len, -dx / len, 0.0f); - glVertex3f((GLfloat) vert[0], - (GLfloat) vert[1], thickness); - glVertex3f((GLfloat) vert[0], - (GLfloat) vert[1], 0.0f); - } - - glEnd(); - p += count*2; - } - - /* Draw the back face */ - p = save_p; - v[2] = thickness; - glNormal3f(0.0f, 0.0f, -1.0f); - gluTessNormal(tess, 0.0F, 0.0F, -1.0F); - - gluTessBeginPolygon(tess, &thickness); - - for (loop = (DWORD) *p++; loop; --loop) - { - count = (DWORD) *p++; - - gluTessBeginContour(tess); - - for (point = 0; point < count; point++) - { - vert = p + ((count-point-1)<<1); - v[0] = vert[0]; - v[1] = vert[1]; - gluTessVertex(tess, v, vert); - } - p += count*2; - - gluTessEndContour(tess); - } - gluTessEndPolygon(tess); - } - -#if !defined(NDEBUG) - if (TessErrorOccurred) - DBGPRINT("Tessellation error %s\n", gluErrorString(TessErrorOccurred)); -#endif - } - - -exit: - - if(LineBuf) - HeapFree(GetProcessHeap(), 0, LineBuf); - - if(VertBuf) - HeapFree(GetProcessHeap(), 0, VertBuf); - - if (tess) - gluDeleteTess(tess); - - return status; -} - - -/***************************************************************************** -* MakeDisplayListFromGlyph -* -* Converts the outline of a glyph to an OpenGL display list. -* -* Return value is nonzero for success, zero for failure. -* -* Does not check for OpenGL errors, so if the caller needs to know about them, -* it should call glGetError(). -*****************************************************************************/ - -INT MakeDisplayListFromGlyph(DWORD listName, UCHAR* glyphBuf, DWORD glyphSize, LPGLYPHMETRICSFLOAT glyphMetricsFloat, - FLOAT chordalDeviation, FLOAT extrusion, INT format) -{ - INT status; - - glNewList(listName, GL_COMPILE); - status = DrawGlyph(glyphBuf, glyphSize, chordalDeviation, extrusion, format); - glTranslatef(glyphMetricsFloat->gmfCellIncX, glyphMetricsFloat->gmfCellIncY, 0.0F); - glEndList(); - - return status; -} - -// *********************************************************************** - -/***************************************************************************** -* IntUseFontBitmaps -* -* Converts a subrange of the glyphs in a GDI font to OpenGL display -* lists. -* -* Extended to support any GDI font, not just TrueType fonts. (DaveM) -* -*****************************************************************************/ - -BOOL APIENTRY IntUseFontBitmapsW(HDC hDC, DWORD first, DWORD count, DWORD listBase) -{ - INT i, ox, oy, ix, iy; - INT w = 0, h = 0; - INT iBufSize, iCurBufSize = 0; - DWORD *bitmapBuffer = NULL; - DWORD *invertedBitmapBuffer = NULL; - BOOL bSuccessOrFail = TRUE; - BOOL bTrueType = FALSE; - TEXTMETRIC tm; GLYPHMETRICS gm; - RASTERIZER_STATUS rs; - MAT2 mat; - SIZE size; - RECT rect; - HDC hDCMem; - HBITMAP hBitmap; - BITMAPINFO bmi; - HFONT hFont; + unsigned int glyph, size = 0; + void *bitmap = NULL, *gl_bitmap = NULL; + int org_alignment; + BOOL ret = TRUE; - // Set up a unity matrix. - ZeroMemory(&mat, sizeof(mat)); - mat.eM11.value = 1; - mat.eM22.value = 1; + glGetIntegerv(GL_UNPACK_ALIGNMENT, &org_alignment); + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); - // Test to see if selected font is TrueType or not - ZeroMemory(&tm, sizeof(tm)); - if (!GetTextMetrics(hDC, &tm)) - { - DBGPRINT("Font metrics error\n"); - return FALSE; - } - bTrueType = (tm.tmPitchAndFamily & TMPF_TRUETYPE) ? TRUE : FALSE; + for (glyph = first; glyph < first + count; glyph++) { + static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; + unsigned int needed_size, height, width, width_int; - // Test to see if TRUE-TYPE capabilities are installed - // (only necessary if TrueType font selected) - ZeroMemory(&rs, sizeof(rs)); - - if (bTrueType) - { - if (!GetRasterizerCaps (&rs, sizeof (RASTERIZER_STATUS)) || !(rs.wFlags & TT_ENABLED)) - { - DBGPRINT("No TrueType caps\n"); - bTrueType = FALSE; - } - } - - // Trick to get the current font handle - hFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT)); - SelectObject(hDC, hFont); - - // Have memory device context available for holding bitmaps of font glyphs - hDCMem = CreateCompatibleDC(hDC); - SelectObject(hDCMem, hFont); - SetTextColor(hDCMem, RGB(0xFF, 0xFF, 0xFF)); - SetBkColor(hDCMem, 0); - - for (i = first; (DWORD) i < (first + count); i++) - { - // Find out how much space is needed for the bitmap so we can - // Set the buffer size correctly. - if (bTrueType) - { - // Use TrueType support to get bitmap size of glyph - iBufSize = GetGlyphOutline(hDC, i, GGO_BITMAP, &gm, 0, NULL, &mat); - if (iBufSize == GDI_ERROR) - { - bSuccessOrFail = FALSE; - break; - } - } + if (unicode) + needed_size = GetGlyphOutlineW(hdc, glyph, GGO_BITMAP, &gm, 0, NULL, &identity); else - { - // Use generic GDI support to compute bitmap size of glyph - w = tm.tmMaxCharWidth; - h = tm.tmHeight; - if (GetTextExtentPoint32(hDC, (LPCTSTR)&i, 1, &size)) - { - w = size.cx; - h = size.cy; - } - iBufSize = w * h; - // Use DWORD multiple for compatibility - iBufSize += 3; - iBufSize /= 4; - iBufSize *= 4; + needed_size = GetGlyphOutlineA(hdc, glyph, GGO_BITMAP, &gm, 0, NULL, &identity); + + TRACE("Glyph: %3d / List: %d size %d\n", glyph, listBase, needed_size); + if (needed_size == GDI_ERROR) { + ret = FALSE; + break; } - // If we need to allocate Larger Buffers, then do so - but allocate - // An extra 50 % so that we don't do too many mallocs ! - if (iBufSize > iCurBufSize) - { - if (bitmapBuffer) - { - HeapFree(GetProcessHeap(), 0, bitmapBuffer); - } - if (invertedBitmapBuffer) - { - HeapFree(GetProcessHeap(), 0, invertedBitmapBuffer); - } - - iCurBufSize = iBufSize * 2; - bitmapBuffer = (DWORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, iCurBufSize); - invertedBitmapBuffer = (DWORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, iCurBufSize); - - if (bitmapBuffer == NULL || invertedBitmapBuffer == NULL) - { - bSuccessOrFail = FALSE; - break; - } - } - - // If we fail to get the Glyph data, delete the display lists - // Created so far and return FALSE. - if (bTrueType) - { - // Use TrueType support to get bitmap of glyph - if (GetGlyphOutline(hDC, i, GGO_BITMAP, &gm, iBufSize, bitmapBuffer, &mat) == GDI_ERROR) - { - bSuccessOrFail = FALSE; - break; - } - - // Setup glBitmap parameters for current font glyph - w = gm.gmBlackBoxX; - h = gm.gmBlackBoxY; - ox = gm.gmptGlyphOrigin.x; - oy = gm.gmptGlyphOrigin.y; - ix = gm.gmCellIncX; - iy = gm.gmCellIncY; + if (needed_size > size) { + size = needed_size; + HeapFree(GetProcessHeap(), 0, bitmap); + HeapFree(GetProcessHeap(), 0, gl_bitmap); + bitmap = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + gl_bitmap = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); } + if (unicode) + ret = (GetGlyphOutlineW(hdc, glyph, GGO_BITMAP, &gm, size, bitmap, &identity) != GDI_ERROR); else - { - // Use generic GDI support to create bitmap of glyph - ZeroMemory(bitmapBuffer, iBufSize); + ret = (GetGlyphOutlineA(hdc, glyph, GGO_BITMAP, &gm, size, bitmap, &identity) != GDI_ERROR); + if (!ret) break; - if (i >= tm.tmFirstChar && i <= tm.tmLastChar) - { - // Only create bitmaps for actual font glyphs - hBitmap = CreateBitmap(w, h, 1, 1, NULL); - SelectObject(hDCMem, hBitmap); - // Make bitmap of current font glyph - SetRect(&rect, 0, 0, w, h); - DrawText(hDCMem, (LPCTSTR)&i, 1, &rect, - DT_LEFT | DT_BOTTOM | DT_SINGLELINE | DT_NOCLIP); - // Make copy of bitmap in our local buffer - ZeroMemory(&bmi, sizeof(bmi)); - bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmi.bmiHeader.biWidth = w; - bmi.bmiHeader.biHeight = -h; - bmi.bmiHeader.biPlanes = 1; - bmi.bmiHeader.biBitCount = 1; - bmi.bmiHeader.biCompression = BI_RGB; - GetDIBits(hDCMem, hBitmap, 0, h, bitmapBuffer, &bmi, 0); - DeleteObject(hBitmap); + if (TRACE_ON(wgl)) { + unsigned int bitmask; + unsigned char *bitmap_ = bitmap; + + TRACE(" - bbox: %d x %d\n", gm.gmBlackBoxX, gm.gmBlackBoxY); + TRACE(" - origin: (%d, %d)\n", gm.gmptGlyphOrigin.x, gm.gmptGlyphOrigin.y); + TRACE(" - increment: %d - %d\n", gm.gmCellIncX, gm.gmCellIncY); + if (needed_size != 0) { + TRACE(" - bitmap:\n"); + for (height = 0; height < gm.gmBlackBoxY; height++) { + TRACE(" "); + for (width = 0, bitmask = 0x80; width < gm.gmBlackBoxX; width++, bitmask >>= 1) { + if (bitmask == 0) { + bitmap_ += 1; + bitmask = 0x80; + } + if (*bitmap_ & bitmask) + TRACE("*"); + else + TRACE(" "); + } + bitmap_ += (4 - ((UINT_PTR)bitmap_ & 0x03)); + TRACE("\n"); + } } - else - { - // Otherwise use empty display list for non-existing glyph - iBufSize = 0; + } + + /* In OpenGL, the bitmap is drawn from the bottom to the top... So we need to invert the + * glyph for it to be drawn properly. + */ + if (needed_size != 0) { + width_int = (gm.gmBlackBoxX + 31) / 32; + for (height = 0; height < gm.gmBlackBoxY; height++) { + for (width = 0; width < width_int; width++) { + ((int *) gl_bitmap)[(gm.gmBlackBoxY - height - 1) * width_int + width] = + ((int *) bitmap)[height * width_int + width]; + } } - - // Setup glBitmap parameters for current font glyph - ox = 0; - oy = tm.tmDescent; - ix = w; - iy = 0; } - // Create an OpenGL display list. - glNewList((listBase + i), GL_COMPILE); - - // Some fonts have no data for the space character, yet advertise - // a non-zero size. - if (0 == iBufSize) - { - glBitmap(0, 0, 0.0f, 0.0f, (GLfloat) ix, (GLfloat) iy, NULL); + glNewList(listBase++, GL_COMPILE); + if (needed_size != 0) { + glBitmap(gm.gmBlackBoxX, gm.gmBlackBoxY, + 0 - gm.gmptGlyphOrigin.x, (int) gm.gmBlackBoxY - gm.gmptGlyphOrigin.y, + gm.gmCellIncX, gm.gmCellIncY, + gl_bitmap); + } else { + /* This is the case of 'empty' glyphs like the space character */ + glBitmap(0, 0, 0, 0, gm.gmCellIncX, gm.gmCellIncY, NULL); } - else - { - // Invert the Glyph data. - InvertGlyphBitmap(w, h, bitmapBuffer, invertedBitmapBuffer); - - // Render an OpenGL bitmap and invert the origin. - glBitmap(w, h, - (GLfloat) ox, (GLfloat) (h-oy), - (GLfloat) ix, (GLfloat) iy, - (GLubyte *) invertedBitmapBuffer); - } - - // Close this display list. glEndList(); } - if (bSuccessOrFail == FALSE) + glPixelStorei(GL_UNPACK_ALIGNMENT, org_alignment); + HeapFree(GetProcessHeap(), 0, bitmap); + HeapFree(GetProcessHeap(), 0, gl_bitmap); + return ret; +} + +/*********************************************************************** + * wglUseFontBitmapsA (OPENGL32.@) + */ +BOOL WINAPI wglUseFontBitmapsA(HDC hdc, DWORD first, DWORD count, DWORD listBase) +{ + return wglUseFontBitmaps_common( hdc, first, count, listBase, FALSE ); +} + +/*********************************************************************** + * wglUseFontBitmapsW (OPENGL32.@) + */ +BOOL WINAPI wglUseFontBitmapsW(HDC hdc, DWORD first, DWORD count, DWORD listBase) +{ + return wglUseFontBitmaps_common( hdc, first, count, listBase, TRUE ); +} + +/* FIXME: should probably have a glu.h header */ + +typedef struct GLUtesselator GLUtesselator; +typedef void (WINAPI *_GLUfuncptr)(void); + +#define GLU_TESS_BEGIN 100100 +#define GLU_TESS_VERTEX 100101 +#define GLU_TESS_END 100102 + +static GLUtesselator * (WINAPI *pgluNewTess)(void); +static void (WINAPI *pgluDeleteTess)(GLUtesselator *tess); +static void (WINAPI *pgluTessNormal)(GLUtesselator *tess, GLdouble x, GLdouble y, GLdouble z); +static void (WINAPI *pgluTessBeginPolygon)(GLUtesselator *tess, void *polygon_data); +static void (WINAPI *pgluTessEndPolygon)(GLUtesselator *tess); +static void (WINAPI *pgluTessCallback)(GLUtesselator *tess, GLenum which, _GLUfuncptr fn); +static void (WINAPI *pgluTessBeginContour)(GLUtesselator *tess); +static void (WINAPI *pgluTessEndContour)(GLUtesselator *tess); +static void (WINAPI *pgluTessVertex)(GLUtesselator *tess, GLdouble *location, GLvoid* data); + +static HMODULE load_libglu(void) +{ + static const WCHAR glu32W[] = {'g','l','u','3','2','.','d','l','l',0}; + static int already_loaded; + static HMODULE module; + + if (already_loaded) return module; + already_loaded = 1; + + TRACE("Trying to load GLU library\n"); + module = LoadLibraryW( glu32W ); + if (!module) { - DBGPRINT("DGL_UseFontBitmaps: Get glyph failed\n"); - glDeleteLists((i+listBase), (i-first)); + WARN("Failed to load glu32\n"); + return NULL; + } +#define LOAD_FUNCPTR(f) p##f = (void *)GetProcAddress( module, #f ) + LOAD_FUNCPTR(gluNewTess); + LOAD_FUNCPTR(gluDeleteTess); + LOAD_FUNCPTR(gluTessBeginContour); + LOAD_FUNCPTR(gluTessNormal); + LOAD_FUNCPTR(gluTessBeginPolygon); + LOAD_FUNCPTR(gluTessCallback); + LOAD_FUNCPTR(gluTessEndContour); + LOAD_FUNCPTR(gluTessEndPolygon); + LOAD_FUNCPTR(gluTessVertex); +#undef LOAD_FUNCPTR + return module; +} + +static void fixed_to_double(POINTFX fixed, UINT em_size, GLdouble vertex[3]) +{ + vertex[0] = (fixed.x.value + (GLdouble)fixed.x.fract / (1 << 16)) / em_size; + vertex[1] = (fixed.y.value + (GLdouble)fixed.y.fract / (1 << 16)) / em_size; + vertex[2] = 0.0; +} + +static void WINAPI tess_callback_vertex(GLvoid *vertex) +{ + GLdouble *dbl = vertex; + TRACE("%f, %f, %f\n", dbl[0], dbl[1], dbl[2]); + glVertex3dv(vertex); +} + +static void WINAPI tess_callback_begin(GLenum which) +{ + TRACE("%d\n", which); + glBegin(which); +} + +static void WINAPI tess_callback_end(void) +{ + TRACE("\n"); + glEnd(); +} + +typedef struct _bezier_vector { + GLdouble x; + GLdouble y; +} bezier_vector; + +static double bezier_deviation_squared(const bezier_vector *p) +{ + bezier_vector deviation; + bezier_vector vertex; + bezier_vector base; + double base_length; + double dot; + + vertex.x = (p[0].x + p[1].x*2 + p[2].x)/4 - p[0].x; + vertex.y = (p[0].y + p[1].y*2 + p[2].y)/4 - p[0].y; + + base.x = p[2].x - p[0].x; + base.y = p[2].y - p[0].y; + + base_length = sqrt(base.x*base.x + base.y*base.y); + base.x /= base_length; + base.y /= base_length; + + dot = base.x*vertex.x + base.y*vertex.y; + dot = min(max(dot, 0.0), base_length); + base.x *= dot; + base.y *= dot; + + deviation.x = vertex.x-base.x; + deviation.y = vertex.y-base.y; + + return deviation.x*deviation.x + deviation.y*deviation.y; +} + +static int bezier_approximate(const bezier_vector *p, bezier_vector *points, FLOAT deviation) +{ + bezier_vector first_curve[3]; + bezier_vector second_curve[3]; + bezier_vector vertex; + int total_vertices; + + if(bezier_deviation_squared(p) <= deviation*deviation) + { + if(points) + *points = p[2]; + return 1; } - // Release resources used - DeleteObject(hFont); - DeleteDC(hDCMem); + vertex.x = (p[0].x + p[1].x*2 + p[2].x)/4; + vertex.y = (p[0].y + p[1].y*2 + p[2].y)/4; - if (bitmapBuffer) - HeapFree(GetProcessHeap(), 0, bitmapBuffer); + first_curve[0] = p[0]; + first_curve[1].x = (p[0].x + p[1].x)/2; + first_curve[1].y = (p[0].y + p[1].y)/2; + first_curve[2] = vertex; - if (invertedBitmapBuffer) - HeapFree(GetProcessHeap(), 0, invertedBitmapBuffer); + second_curve[0] = vertex; + second_curve[1].x = (p[2].x + p[1].x)/2; + second_curve[1].y = (p[2].y + p[1].y)/2; + second_curve[2] = p[2]; - return(bSuccessOrFail); + total_vertices = bezier_approximate(first_curve, points, deviation); + if(points) + points += total_vertices; + total_vertices += bezier_approximate(second_curve, points, deviation); + return total_vertices; } -BOOL APIENTRY IntUseFontBitmapsA(HDC hDC, DWORD first, DWORD count, DWORD listBase) +/*********************************************************************** + * wglUseFontOutlines_common + */ +static BOOL wglUseFontOutlines_common(HDC hdc, + DWORD first, + DWORD count, + DWORD listBase, + FLOAT deviation, + FLOAT extrusion, + int format, + LPGLYPHMETRICSFLOAT lpgmf, + BOOL unicode) { - /* Just call IntUseFontBitmapsW for now */ - return IntUseFontBitmapsW(hDC, first, count, listBase); -} + UINT glyph; + const MAT2 identity = {{0,1},{0,0},{0,0},{0,1}}; + GLUtesselator *tess = NULL; + LOGFONTW lf; + HFONT old_font, unscaled_font; + UINT em_size = 1024; + RECT rc; + TRACE("(%p, %d, %d, %d, %f, %f, %d, %p, %s)\n", hdc, first, count, + listBase, deviation, extrusion, format, lpgmf, unicode ? "W" : "A"); + if(deviation <= 0.0) + deviation = 1.0/em_size; -/***************************************************************************** -* IntUseFontOutlines -* -* Converts a subrange of the glyphs in a TrueType font to OpenGL display -* lists. -*****************************************************************************/ - -BOOL APIENTRY IntUseFontOutlinesW(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT chordalDeviation, - FLOAT extrusion, INT format, GLYPHMETRICSFLOAT *glyphMetricsFloatArray) -{ - DWORD glyphIndex; - UCHAR* glyphBuf; - DWORD glyphBufSize; - - /* - * Flush any previous OpenGL errors. This allows us to check for - * new errors so they can be reported via the function return value. - */ - while (glGetError() != GL_NO_ERROR); - - /* - * Make sure that the current font can be sampled accurately. - */ - hNewFont = CreateHighResolutionFont(hDC); - - if (!hNewFont) - return FALSE; - - hOldFont = SelectObject(hDC, hNewFont); - if (!hOldFont) - return FALSE; - - /* - * Preallocate a buffer for the outline data, and track its size: - */ - glyphBuf = (UCHAR*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, glyphBufSize = 10240); - - if (!glyphBuf) - return FALSE; /*WGL_STATUS_NOT_ENOUGH_MEMORY*/ - - /* - * Process each glyph in the given range: - */ - for (glyphIndex = first; glyphIndex - first < count; ++glyphIndex) + if(format == WGL_FONT_POLYGONS) { - GLYPHMETRICS glyphMetrics; - DWORD glyphSize; - static MAT2 matrix = + if (!load_libglu()) { - {0, 1}, {0, 0}, - {0, 0}, {0, 1} - }; - LPGLYPHMETRICSFLOAT glyphMetricsFloat = &glyphMetricsFloatArray[glyphIndex - first]; - - /* - * Determine how much space is needed to store the glyph's - * outlines. If our glyph buffer isn't large enough, - * resize it. - */ - - glyphSize = GetGlyphOutline(hDC, glyphIndex, GGO_NATIVE, &glyphMetrics, 0, NULL, &matrix); - - if (glyphSize == GDI_ERROR) - return FALSE; /*WGL_STATUS_FAILURE*/ - - if (glyphSize > glyphBufSize) - { - HeapFree(GetProcessHeap(), 0, glyphBuf); - glyphBuf = (UCHAR*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, glyphBufSize = glyphSize); - if (!glyphBuf) - return FALSE; /*WGL_STATUS_NOT_ENOUGH_MEMORY*/ + ERR("glu32 is required for this function but isn't available\n"); + return FALSE; } + tess = pgluNewTess(); + if(!tess) return FALSE; + pgluTessCallback(tess, GLU_TESS_VERTEX, (_GLUfuncptr)tess_callback_vertex); + pgluTessCallback(tess, GLU_TESS_BEGIN, (_GLUfuncptr)tess_callback_begin); + pgluTessCallback(tess, GLU_TESS_END, tess_callback_end); + } - /* - * Get the glyph's outlines. - */ - if (GetGlyphOutline(hDC, glyphIndex, GGO_NATIVE, &glyphMetrics, glyphBufSize, glyphBuf, &matrix) == GDI_ERROR) + GetObjectW(GetCurrentObject(hdc, OBJ_FONT), sizeof(lf), &lf); + rc.left = rc.right = rc.bottom = 0; + rc.top = em_size; + DPtoLP(hdc, (POINT*)&rc, 2); + lf.lfHeight = -abs(rc.top - rc.bottom); + lf.lfOrientation = lf.lfEscapement = 0; + unscaled_font = CreateFontIndirectW(&lf); + old_font = SelectObject(hdc, unscaled_font); + + for (glyph = first; glyph < first + count; glyph++) + { + DWORD needed; + GLYPHMETRICS gm; + BYTE *buf; + TTPOLYGONHEADER *pph; + TTPOLYCURVE *ppc; + GLdouble *vertices = NULL; + int vertex_total = -1; + + if(unicode) + needed = GetGlyphOutlineW(hdc, glyph, GGO_NATIVE, &gm, 0, NULL, &identity); + else + needed = GetGlyphOutlineA(hdc, glyph, GGO_NATIVE, &gm, 0, NULL, &identity); + + if(needed == GDI_ERROR) + goto error; + + buf = HeapAlloc(GetProcessHeap(), 0, needed); + + if(unicode) + GetGlyphOutlineW(hdc, glyph, GGO_NATIVE, &gm, needed, buf, &identity); + else + GetGlyphOutlineA(hdc, glyph, GGO_NATIVE, &gm, needed, buf, &identity); + + TRACE("glyph %d\n", glyph); + + if(lpgmf) { - HeapFree(GetProcessHeap(), 0, glyphBuf); - return FALSE; /*WGL_STATUS_FAILURE*/ + lpgmf->gmfBlackBoxX = (float)gm.gmBlackBoxX / em_size; + lpgmf->gmfBlackBoxY = (float)gm.gmBlackBoxY / em_size; + lpgmf->gmfptGlyphOrigin.x = (float)gm.gmptGlyphOrigin.x / em_size; + lpgmf->gmfptGlyphOrigin.y = (float)gm.gmptGlyphOrigin.y / em_size; + lpgmf->gmfCellIncX = (float)gm.gmCellIncX / em_size; + lpgmf->gmfCellIncY = (float)gm.gmCellIncY / em_size; + + TRACE("%fx%f at %f,%f inc %f,%f\n", lpgmf->gmfBlackBoxX, lpgmf->gmfBlackBoxY, + lpgmf->gmfptGlyphOrigin.x, lpgmf->gmfptGlyphOrigin.y, lpgmf->gmfCellIncX, lpgmf->gmfCellIncY); + lpgmf++; } - glyphMetricsFloat->gmfBlackBoxX = - (FLOAT) glyphMetrics.gmBlackBoxX * ScaleFactor; - glyphMetricsFloat->gmfBlackBoxY = - (FLOAT) glyphMetrics.gmBlackBoxY * ScaleFactor; - glyphMetricsFloat->gmfptGlyphOrigin.x = - (FLOAT) glyphMetrics.gmptGlyphOrigin.x * ScaleFactor; - glyphMetricsFloat->gmfptGlyphOrigin.y = - (FLOAT) glyphMetrics.gmptGlyphOrigin.y * ScaleFactor; - glyphMetricsFloat->gmfCellIncX = - (FLOAT) glyphMetrics.gmCellIncX * ScaleFactor; - glyphMetricsFloat->gmfCellIncY = - (FLOAT) glyphMetrics.gmCellIncY * ScaleFactor; - - /* - * Turn the glyph into a display list: - */ - if (!MakeDisplayListFromGlyph((glyphIndex - first) + listBase, glyphBuf, glyphSize, glyphMetricsFloat, - chordalDeviation + ScaleFactor, extrusion, format)) + glNewList(listBase++, GL_COMPILE); + glFrontFace(GL_CCW); + if(format == WGL_FONT_POLYGONS) { - HeapFree(GetProcessHeap(), 0, glyphBuf); - return FALSE; /*WGL_STATUS_FAILURE*/ + glNormal3d(0.0, 0.0, 1.0); + pgluTessNormal(tess, 0, 0, 1); + pgluTessBeginPolygon(tess, NULL); } + + while(!vertices) + { + if(vertex_total != -1) + vertices = HeapAlloc(GetProcessHeap(), 0, vertex_total * 3 * sizeof(GLdouble)); + vertex_total = 0; + + pph = (TTPOLYGONHEADER*)buf; + while((BYTE*)pph < buf + needed) + { + GLdouble previous[3]; + fixed_to_double(pph->pfxStart, em_size, previous); + + if(vertices) + TRACE("\tstart %d, %d\n", pph->pfxStart.x.value, pph->pfxStart.y.value); + + if(format == WGL_FONT_POLYGONS) + pgluTessBeginContour(tess); + else + glBegin(GL_LINE_LOOP); + + if(vertices) + { + fixed_to_double(pph->pfxStart, em_size, vertices); + if(format == WGL_FONT_POLYGONS) + pgluTessVertex(tess, vertices, vertices); + else + glVertex3d(vertices[0], vertices[1], vertices[2]); + vertices += 3; + } + vertex_total++; + + ppc = (TTPOLYCURVE*)((char*)pph + sizeof(*pph)); + while((char*)ppc < (char*)pph + pph->cb) + { + int i, j; + int num; + + switch(ppc->wType) { + case TT_PRIM_LINE: + for(i = 0; i < ppc->cpfx; i++) + { + if(vertices) + { + TRACE("\t\tline to %d, %d\n", + ppc->apfx[i].x.value, ppc->apfx[i].y.value); + fixed_to_double(ppc->apfx[i], em_size, vertices); + if(format == WGL_FONT_POLYGONS) + pgluTessVertex(tess, vertices, vertices); + else + glVertex3d(vertices[0], vertices[1], vertices[2]); + vertices += 3; + } + fixed_to_double(ppc->apfx[i], em_size, previous); + vertex_total++; + } + break; + + case TT_PRIM_QSPLINE: + for(i = 0; i < ppc->cpfx-1; i++) + { + bezier_vector curve[3]; + bezier_vector *points; + GLdouble curve_vertex[3]; + + if(vertices) + TRACE("\t\tcurve %d,%d %d,%d\n", + ppc->apfx[i].x.value, ppc->apfx[i].y.value, + ppc->apfx[i + 1].x.value, ppc->apfx[i + 1].y.value); + + curve[0].x = previous[0]; + curve[0].y = previous[1]; + fixed_to_double(ppc->apfx[i], em_size, curve_vertex); + curve[1].x = curve_vertex[0]; + curve[1].y = curve_vertex[1]; + fixed_to_double(ppc->apfx[i + 1], em_size, curve_vertex); + curve[2].x = curve_vertex[0]; + curve[2].y = curve_vertex[1]; + if(i < ppc->cpfx-2) + { + curve[2].x = (curve[1].x + curve[2].x)/2; + curve[2].y = (curve[1].y + curve[2].y)/2; + } + num = bezier_approximate(curve, NULL, deviation); + points = HeapAlloc(GetProcessHeap(), 0, num*sizeof(bezier_vector)); + num = bezier_approximate(curve, points, deviation); + vertex_total += num; + if(vertices) + { + for(j=0; jwType); + if(format == WGL_FONT_POLYGONS) + pgluTessEndContour(tess); + else + glEnd(); + goto error_in_list; + } + + ppc = (TTPOLYCURVE*)((char*)ppc + sizeof(*ppc) + + (ppc->cpfx - 1) * sizeof(POINTFX)); + } + if(format == WGL_FONT_POLYGONS) + pgluTessEndContour(tess); + else + glEnd(); + pph = (TTPOLYGONHEADER*)((char*)pph + pph->cb); + } + } + +error_in_list: + if(format == WGL_FONT_POLYGONS) + pgluTessEndPolygon(tess); + glTranslated((GLdouble)gm.gmCellIncX / em_size, (GLdouble)gm.gmCellIncY / em_size, 0.0); + glEndList(); + HeapFree(GetProcessHeap(), 0, buf); + HeapFree(GetProcessHeap(), 0, vertices); } - /* - * Clean up temporary storage and return. If an error occurred, - * clear all OpenGL error flags and return FAILURE status; - * otherwise just return SUCCESS. - */ - HeapFree(GetProcessHeap(), 0, glyphBuf); + error: + DeleteObject(SelectObject(hdc, old_font)); + if(format == WGL_FONT_POLYGONS) + pgluDeleteTess(tess); + return TRUE; - DeleteObject(SelectObject(hDC, hOldFont)); - - if (glGetError() == GL_NO_ERROR) - { - return TRUE; /*WGL_STATUS_SUCCESS*/ - } - else - { - while (glGetError() != GL_NO_ERROR); - - return FALSE; /*WGL_STATUS_FAILURE*/ - } } -BOOL APIENTRY IntUseFontOutlinesA(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT chordalDeviation, - FLOAT extrusion, INT format, GLYPHMETRICSFLOAT *glyphMetricsFloatArray) +/*********************************************************************** + * wglUseFontOutlinesA (OPENGL32.@) + */ +BOOL WINAPI wglUseFontOutlinesA(HDC hdc, + DWORD first, + DWORD count, + DWORD listBase, + FLOAT deviation, + FLOAT extrusion, + int format, + LPGLYPHMETRICSFLOAT lpgmf) { - /* Just call IntUseFontOutlinesW for now */ - return IntUseFontOutlinesW(hDC, first, count, listBase, chordalDeviation, extrusion, format, glyphMetricsFloatArray); + return wglUseFontOutlines_common(hdc, first, count, listBase, deviation, extrusion, format, lpgmf, FALSE); } + +/*********************************************************************** + * wglUseFontOutlinesW (OPENGL32.@) + */ +BOOL WINAPI wglUseFontOutlinesW(HDC hdc, + DWORD first, + DWORD count, + DWORD listBase, + FLOAT deviation, + FLOAT extrusion, + int format, + LPGLYPHMETRICSFLOAT lpgmf) +{ + return wglUseFontOutlines_common(hdc, first, count, listBase, deviation, extrusion, format, lpgmf, TRUE); +} \ No newline at end of file diff --git a/dll/opengl/opengl32/opengl32.spec b/dll/opengl/opengl32/opengl32.spec index 5f881b06741..0547d89857c 100644 --- a/dll/opengl/opengl32/opengl32.spec +++ b/dll/opengl/opengl32/opengl32.spec @@ -363,7 +363,7 @@ @ stdcall wglSwapBuffers(long) rosglSwapBuffers @ stdcall wglSwapLayerBuffers(long long) rosglSwapLayerBuffers @ stub wglSwapMultipleBuffers -@ stdcall wglUseFontBitmapsA(long long long long) rosglUseFontBitmapsA -@ stdcall wglUseFontBitmapsW(long long long long) rosglUseFontBitmapsW -@ stdcall wglUseFontOutlinesA(long long long long long long long ptr) rosglUseFontOutlinesA -@ stdcall wglUseFontOutlinesW(long long long long long long long ptr) rosglUseFontOutlinesW +@ stdcall wglUseFontBitmapsA(long long long long) +@ stdcall wglUseFontBitmapsW(long long long long) +@ stdcall wglUseFontOutlinesA(long long long long long long long ptr) +@ stdcall wglUseFontOutlinesW(long long long long long long long ptr) diff --git a/dll/opengl/opengl32/wgl.c b/dll/opengl/opengl32/wgl.c index f6feeac8a0e..fe4942e0601 100644 --- a/dll/opengl/opengl32/wgl.c +++ b/dll/opengl/opengl32/wgl.c @@ -1241,41 +1241,6 @@ rosglSwapLayerBuffers( HDC hdc, UINT fuPlanes ) return ret; } - -BOOL -APIENTRY -rosglUseFontBitmapsA( HDC hdc, DWORD first, DWORD count, DWORD listBase ) -{ - return IntUseFontBitmapsA(hdc, first, count, listBase); -} - - -BOOL -APIENTRY -rosglUseFontBitmapsW( HDC hdc, DWORD first, DWORD count, DWORD listBase ) -{ - return IntUseFontBitmapsW(hdc, first, count, listBase); -} - -BOOL -APIENTRY -rosglUseFontOutlinesA( HDC hdc, DWORD first, DWORD count, DWORD listBase, - FLOAT deviation, FLOAT extrusion, int format, - GLYPHMETRICSFLOAT *pgmf ) -{ - return IntUseFontOutlinesA(hdc, first, count, listBase, deviation, extrusion, format, pgmf); -} - - -BOOL -APIENTRY -rosglUseFontOutlinesW( HDC hdc, DWORD first, DWORD count, DWORD listBase, - FLOAT deviation, FLOAT extrusion, int format, - GLYPHMETRICSFLOAT *pgmf ) -{ - return IntUseFontOutlinesW(hdc, first, count, listBase, deviation, extrusion, format, pgmf); -} - #ifdef __cplusplus }; /* extern "C" */ #endif /* __cplusplus */ diff --git a/dll/win32/CMakeLists.txt b/dll/win32/CMakeLists.txt index 48680a6b427..50ce0462e55 100644 --- a/dll/win32/CMakeLists.txt +++ b/dll/win32/CMakeLists.txt @@ -145,6 +145,7 @@ add_subdirectory(pdh) add_subdirectory(pidgen) add_subdirectory(powrprof) add_subdirectory(printui) +add_subdirectory(propsys) add_subdirectory(psapi) add_subdirectory(pstorec) add_subdirectory(qmgr) diff --git a/dll/win32/kernel32/client/fiber.c b/dll/win32/kernel32/client/fiber.c index 338c9b7f9e5..22ece1be4e6 100644 --- a/dll/win32/kernel32/client/fiber.c +++ b/dll/win32/kernel32/client/fiber.c @@ -15,15 +15,15 @@ typedef struct _FIBER /* Field offsets: */ { /* 32 bit 64 bit */ /* this must be the first field */ - LPVOID Parameter; /* 0x00 0x00 */ - struct _EXCEPTION_REGISTRATION_RECORD * ExceptionList; /* 0x04 0x08 */ - LPVOID StackBase; /* 0x08 0x10 */ - LPVOID StackLimit; /* 0x0C 0x18 */ - LPVOID DeallocationStack; /* 0x10 0x20 */ + PVOID Parameter; /* 0x00 0x00 */ + PEXCEPTION_REGISTRATION_RECORD ExceptionList; /* 0x04 0x08 */ + PVOID StackBase; /* 0x08 0x10 */ + PVOID StackLimit; /* 0x0C 0x18 */ + PVOID DeallocationStack; /* 0x10 0x20 */ CONTEXT Context; /* 0x14 0x28 */ ULONG GuaranteedStackBytes; /* 0x2E0 */ PVOID FlsData; /* 0x2E4 */ - PVOID ActivationContextStack; /* 0x2E8 */ + PACTIVATION_CONTEXT_STACK ActivationContextStack; /* 0x2E8 */ } FIBER, *PFIBER; /* PRIVATE FUNCTIONS **********************************************************/ @@ -171,7 +171,7 @@ CreateFiberEx(SIZE_T dwStackCommitSize, PFIBER Fiber; NTSTATUS Status; INITIAL_TEB InitialTeb; - PVOID ActivationContextStack = NULL; + PACTIVATION_CONTEXT_STACK ActivationContextStack = NULL; DPRINT("Creating Fiber\n"); /* Check for invalid flags */ @@ -195,6 +195,9 @@ CreateFiberEx(SIZE_T dwStackCommitSize, Fiber = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(FIBER)); if (!Fiber) { + /* Free the activation context stack */ + RtlFreeActivationContextStack(ActivationContextStack); + /* Fail */ SetLastError(ERROR_NOT_ENOUGH_MEMORY); return NULL; @@ -210,9 +213,8 @@ CreateFiberEx(SIZE_T dwStackCommitSize, /* Free the fiber */ RtlFreeHeap(GetProcessHeap(), 0, Fiber); - /* Free the activation context */ - DPRINT1("Leaking activation stack because nobody implemented free"); - //RtlFreeActivationContextStack(&ActivationContextStack); + /* Free the activation context stack */ + RtlFreeActivationContextStack(ActivationContextStack); /* Failure */ BaseSetLastNTError(Status); @@ -271,9 +273,8 @@ DeleteFiber(LPVOID lpFiber) /* Get rid of FLS */ if (Fiber->FlsData) BaseRundownFls(Fiber->FlsData); - /* Get rid of the activation stack */ - DPRINT1("Leaking activation stack because nobody implemented free"); - //RtlFreeActivationContextStack(Fiber->ActivationContextStack); + /* Get rid of the activation context stack */ + RtlFreeActivationContextStack(Fiber->ActivationContextStack); /* Free the fiber data */ RtlFreeHeap(GetProcessHeap(), 0, lpFiber); diff --git a/dll/win32/kernel32/client/thread.c b/dll/win32/kernel32/client/thread.c index 56da4337949..504c0356b2b 100644 --- a/dll/win32/kernel32/client/thread.c +++ b/dll/win32/kernel32/client/thread.c @@ -171,7 +171,7 @@ CreateRemoteThread(IN HANDLE hProcess, ULONG Dummy; PTEB Teb; THREAD_BASIC_INFORMATION ThreadBasicInfo; - PVOID ActivationContextStack = NULL; + PACTIVATION_CONTEXT_STACK ActivationContextStack = NULL; ACTIVATION_CONTEXT_BASIC_INFORMATION ActCtxInfo; ULONG_PTR Cookie; ULONG ReturnLength; @@ -191,7 +191,7 @@ CreateRemoteThread(IN HANDLE hProcess, dwCreationFlags & STACK_SIZE_PARAM_IS_A_RESERVATION ? dwStackSize : 0, &InitialTeb); - if(!NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) { BaseSetLastNTError(Status); return NULL; @@ -260,7 +260,7 @@ CreateRemoteThread(IN HANDLE hProcess, Teb->ActivationContextStackPointer = ActivationContextStack; /* Query the Context */ - // WARNING!!! THIS IS USING THE WIN32 FLAG BECAUSE REACTOS CONTINUES TO BE A POS!!! /// + // WARNING!!! THIS IS USING THE WIN32 FLAG BECAUSE REACTOS CONTINUES TO BE A POS!!! /// Status = RtlQueryInformationActivationContext(QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX, NULL, 0, @@ -274,6 +274,11 @@ CreateRemoteThread(IN HANDLE hProcess, ERROR_DBGBREAK("SXS: %s - Failing thread create because " "RtlQueryInformationActivationContext() failed with status %08lx\n", __FUNCTION__, Status); + + /* Free the activation context stack */ + // RtlFreeThreadActivationContextStack(); + RtlFreeActivationContextStack(Teb->ActivationContextStackPointer); + return NULL; } @@ -291,6 +296,11 @@ CreateRemoteThread(IN HANDLE hProcess, ERROR_DBGBREAK("SXS: %s - Failing thread create because " "RtlActivateActivationContextEx() failed with status %08lx\n", __FUNCTION__, Status); + + /* Free the activation context stack */ + // RtlFreeThreadActivationContextStack(); + RtlFreeActivationContextStack(Teb->ActivationContextStackPointer); + return NULL; } } @@ -299,7 +309,6 @@ CreateRemoteThread(IN HANDLE hProcess, /* Notify CSR */ if (!BaseRunningInServerProcess) { - /* Notify CSR */ Status = BasepNotifyCsrOfThread(hThread, &ClientId); ASSERT(NT_SUCCESS(Status)); } diff --git a/dll/win32/lsasrv/authpackage.c b/dll/win32/lsasrv/authpackage.c index 62199b0e9aa..04a3c32f569 100644 --- a/dll/win32/lsasrv/authpackage.c +++ b/dll/win32/lsasrv/authpackage.c @@ -231,7 +231,7 @@ LsapAddAuthPackage(IN PWSTR ValueName, TRACE("Package Name: %s\n", Package->Name->Buffer); Package->Id = *Id; - *Id++; + (*Id)++; InsertTailList(&PackageListHead, &Package->Entry); diff --git a/dll/win32/lsasrv/lsasrv.c b/dll/win32/lsasrv/lsasrv.c index 53198aa06fc..15f16ce4c75 100644 --- a/dll/win32/lsasrv/lsasrv.c +++ b/dll/win32/lsasrv/lsasrv.c @@ -15,6 +15,113 @@ WINE_DEFAULT_DEBUG_CHANNEL(lsasrv); /* FUNCTIONS ***************************************************************/ +VOID +NTAPI +LsaIFree_LSAPR_POLICY_INFORMATION(IN POLICY_INFORMATION_CLASS InformationClass, + IN PLSAPR_POLICY_INFORMATION PolicyInformation) +{ + if (PolicyInformation != NULL) + { + switch (InformationClass) + { + case PolicyAuditLogInformation: /* 1 */ + break; + + case PolicyAuditEventsInformation: /* 2 */ + if (PolicyInformation->PolicyAuditEventsInfo.EventAuditingOptions != NULL) + midl_user_free(PolicyInformation->PolicyAuditEventsInfo.EventAuditingOptions); + break; + + case PolicyPrimaryDomainInformation: /* 3 */ + if (PolicyInformation->PolicyPrimaryDomInfo.Name.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyPrimaryDomInfo.Name.Buffer); + + if (PolicyInformation->PolicyPrimaryDomInfo.Sid != NULL) + midl_user_free(PolicyInformation->PolicyPrimaryDomInfo.Sid); + break; + + case PolicyPdAccountInformation: /* 4 */ + if (PolicyInformation->PolicyPdAccountInfo.Name.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyPdAccountInfo.Name.Buffer); + break; + + case PolicyAccountDomainInformation: /* 5 */ + if (PolicyInformation->PolicyAccountDomainInfo.DomainName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyAccountDomainInfo.DomainName.Buffer); + + if (PolicyInformation->PolicyAccountDomainInfo.Sid != NULL) + midl_user_free(PolicyInformation->PolicyAccountDomainInfo.Sid); + break; + + case PolicyLsaServerRoleInformation: /* 6 */ + break; + + case PolicyReplicaSourceInformation: /* 7 */ + if (PolicyInformation->PolicyReplicaSourceInfo.ReplicaSource.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyReplicaSourceInfo.ReplicaSource.Buffer); + + if (PolicyInformation->PolicyReplicaSourceInfo.ReplicaAccountName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyReplicaSourceInfo.ReplicaAccountName.Buffer); + break; + + case PolicyDefaultQuotaInformation: /* 8 */ + break; + + case PolicyModificationInformation: /* 9 */ + break; + + case PolicyAuditFullSetInformation: /* 10 (0xA) */ + break; + + case PolicyAuditFullQueryInformation: /* 11 (0xB) */ + break; + + case PolicyDnsDomainInformation: /* 12 (0xC) */ + if (PolicyInformation->PolicyDnsDomainInfo.Name.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfo.Name.Buffer); + + if (PolicyInformation->PolicyDnsDomainInfo.DnsDomainName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfo.DnsDomainName.Buffer); + + if (PolicyInformation->PolicyDnsDomainInfo.DnsForestName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfo.DnsForestName.Buffer); + + if (PolicyInformation->PolicyDnsDomainInfo.Sid != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfo.Sid); + break; + + case PolicyDnsDomainInformationInt: /* 13 (0xD) */ + if (PolicyInformation->PolicyDnsDomainInfoInt.Name.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfoInt.Name.Buffer); + + if (PolicyInformation->PolicyDnsDomainInfoInt.DnsDomainName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfoInt.DnsDomainName.Buffer); + + if (PolicyInformation->PolicyDnsDomainInfoInt.DnsForestName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfoInt.DnsForestName.Buffer); + + if (PolicyInformation->PolicyDnsDomainInfoInt.Sid != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfoInt.Sid); + break; + + case PolicyLocalAccountDomainInformation: /* 14 (0xE) */ + if (PolicyInformation->PolicyLocalAccountDomainInfo.DomainName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyLocalAccountDomainInfo.DomainName.Buffer); + + if (PolicyInformation->PolicyLocalAccountDomainInfo.Sid != NULL) + midl_user_free(PolicyInformation->PolicyLocalAccountDomainInfo.Sid); + break; + + default: + ERR("Invalid InformationClass: %lu\n", InformationClass); + break; + } + + midl_user_free(PolicyInformation); + } +} + + NTSTATUS WINAPI LsapInitLsa(VOID) { diff --git a/dll/win32/lsasrv/lsasrv.spec b/dll/win32/lsasrv/lsasrv.spec index a599b08b9cc..26bd0e7ae17 100644 --- a/dll/win32/lsasrv/lsasrv.spec +++ b/dll/win32/lsasrv/lsasrv.spec @@ -1,4 +1,3 @@ - @ stub LsaIAuditNotifyPackageLoad @ stub LsaIAuditSamEvent @ stub LsaIEnumerateSecrets @@ -6,7 +5,7 @@ @ stub LsaIFree_LSAI_SECRET_ENUM_BUFFER @ stub LsaIFree_LSAPR_ACCOUNT_ENUM_BUFFER @ stub LsaIFree_LSAPR_CR_CIPHER_VALUE - @ stub LsaIFree_LSAPR_POLICY_INFORMATION + @ stdcall LsaIFree_LSAPR_POLICY_INFORMATION(long ptr) @ stub LsaIFree_LSAPR_PRIVILEGE_ENUM_BUFFER @ stub LsaIFree_LSAPR_PRIVILEGE_SET @ stub LsaIFree_LSAPR_REFERENCED_DOMAIN_LIST diff --git a/dll/win32/lsasrv/policy.c b/dll/win32/lsasrv/policy.c index af8d1ce0b86..394a8c668ad 100644 --- a/dll/win32/lsasrv/policy.c +++ b/dll/win32/lsasrv/policy.c @@ -824,8 +824,7 @@ LsarSetAuditEvents(PLSA_DB_OBJECT PolicyObject, AuditData, AttributeSize); - if (AuditData != NULL) - RtlFreeHeap(RtlGetProcessHeap(), 0, AuditData); + RtlFreeHeap(RtlGetProcessHeap(), 0, AuditData); return Status; } diff --git a/dll/win32/msv1_0/CMakeLists.txt b/dll/win32/msv1_0/CMakeLists.txt index b98a4792ceb..2d504c0cf0a 100644 --- a/dll/win32/msv1_0/CMakeLists.txt +++ b/dll/win32/msv1_0/CMakeLists.txt @@ -13,6 +13,7 @@ list(APPEND SOURCE add_library(msv1_0 SHARED ${SOURCE}) set_module_type(msv1_0 win32dll UNICODE ENTRYPOINT 0) target_link_libraries(msv1_0 wine ${PSEH_LIB}) +add_delay_importlibs(msv1_0 samsrv lsasrv) add_importlibs(msv1_0 kernel32 ntdll) add_pch(msv1_0 msv1_0.h) add_dependencies(msv1_0 psdk) diff --git a/dll/win32/msv1_0/msv1_0.c b/dll/win32/msv1_0/msv1_0.c index 84f1b43da2d..4878e28ec3f 100644 --- a/dll/win32/msv1_0/msv1_0.c +++ b/dll/win32/msv1_0/msv1_0.c @@ -20,6 +20,55 @@ LSA_DISPATCH_TABLE DispatchTable; /* FUNCTIONS ***************************************************************/ +static +NTSTATUS +GetDomainSid(PRPC_SID *Sid) +{ + LSAPR_HANDLE PolicyHandle = NULL; + PLSAPR_POLICY_INFORMATION PolicyInfo = NULL; + ULONG Length = 0; + NTSTATUS Status; + + Status = LsaIOpenPolicyTrusted(&PolicyHandle); + if (!NT_SUCCESS(Status)) + { + TRACE("LsaIOpenPolicyTrusted() failed (Status 0x%08lx)\n", Status); + return Status; + } + + Status = LsarQueryInformationPolicy(PolicyHandle, + PolicyAccountDomainInformation, + &PolicyInfo); + if (!NT_SUCCESS(Status)) + { + TRACE("LsarQueryInformationPolicy() failed (Status 0x%08lx)\n", Status); + goto done; + } + + Length = RtlLengthSid(PolicyInfo->PolicyAccountDomainInfo.Sid); + + *Sid = RtlAllocateHeap(RtlGetProcessHeap(), 0, Length); + if (*Sid == NULL) + { + ERR("Failed to allocate SID\n"); + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + memcpy(*Sid, PolicyInfo->PolicyAccountDomainInfo.Sid, Length); + +done: + if (PolicyInfo != NULL) + LsaIFree_LSAPR_POLICY_INFORMATION(PolicyAccountDomainInformation, + PolicyInfo); + + if (PolicyHandle != NULL) + LsarClose(&PolicyHandle); + + return Status; +} + + /* * @unimplemented */ @@ -95,6 +144,10 @@ LsaApInitializePackage(IN ULONG AuthenticationPackageId, /* Get the dispatch table entries */ DispatchTable.AllocateLsaHeap = LsaDispatchTable->AllocateLsaHeap; DispatchTable.FreeLsaHeap = LsaDispatchTable->FreeLsaHeap; + DispatchTable.AllocateClientBuffer = LsaDispatchTable->AllocateClientBuffer; + DispatchTable.FreeClientBuffer = LsaDispatchTable->FreeClientBuffer; + DispatchTable.CopyToClientBuffer = LsaDispatchTable->CopyToClientBuffer; + DispatchTable.CopyFromClientBuffer = LsaDispatchTable->CopyFromClientBuffer; /* Return the package name */ @@ -149,7 +202,186 @@ LsaApLogonUser(IN PLSA_CLIENT_REQUEST ClientRequest, OUT PLSA_UNICODE_STRING *AccountName, OUT PLSA_UNICODE_STRING *AuthenticatingAuthority) { + PMSV1_0_INTERACTIVE_LOGON LogonInfo; + + SAMPR_HANDLE ServerHandle = NULL; + SAMPR_HANDLE DomainHandle = NULL; + PRPC_SID AccountDomainSid = NULL; + RPC_UNICODE_STRING Names[1]; + SAMPR_ULONG_ARRAY RelativeIds = {0, NULL}; + SAMPR_ULONG_ARRAY Use = {0, NULL}; + NTSTATUS Status; + TRACE("()\n"); + + TRACE("LogonType: %lu\n", LogonType); + TRACE("AuthenticationInformation: %p\n", AuthenticationInformation); + TRACE("AuthenticationInformationLength: %lu\n", AuthenticationInformationLength); + + + *ProfileBuffer = NULL; + *ProfileBufferLength = 0; + *SubStatus = STATUS_SUCCESS; + + if (LogonType == Interactive || + LogonType == Batch || + LogonType == Service) + { + ULONG_PTR PtrOffset; + + LogonInfo = (PMSV1_0_INTERACTIVE_LOGON)AuthenticationInformation; + + /* Fix-up pointers in the authentication info */ + PtrOffset = (ULONG_PTR)AuthenticationInformation - (ULONG_PTR)ClientAuthenticationBase; + + LogonInfo->LogonDomainName.Buffer = (PWSTR)((ULONG_PTR)LogonInfo->LogonDomainName.Buffer + PtrOffset); + LogonInfo->UserName.Buffer = (PWSTR)((ULONG_PTR)LogonInfo->UserName.Buffer + PtrOffset); + LogonInfo->Password.Buffer = (PWSTR)((ULONG_PTR)LogonInfo->Password.Buffer + PtrOffset); + + TRACE("Domain: %S\n", LogonInfo->LogonDomainName.Buffer); + TRACE("User: %S\n", LogonInfo->UserName.Buffer); + TRACE("Password: %S\n", LogonInfo->Password.Buffer); + } + else + { + FIXME("LogonType %lu is not supported yet!\n", LogonType); + return STATUS_NOT_IMPLEMENTED; + } + + Status = GetDomainSid(&AccountDomainSid); + if (!NT_SUCCESS(Status)) + { + TRACE("GetDomainSid() failed (Status 0x%08lx)\n", Status); + return Status; + } + + /* Connect to the SAM server */ + Status = SamIConnect(NULL, + &ServerHandle, + SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN, + TRUE); + if (!NT_SUCCESS(Status)) + { + TRACE("SamIConnect() failed (Status 0x%08lx)\n", Status); + goto done; + } + + /* Open the account domain */ + Status = SamrOpenDomain(ServerHandle, + DOMAIN_LOOKUP, + AccountDomainSid, + &DomainHandle); + if (!NT_SUCCESS(Status)) + { + TRACE("SamrOpenDomain failed (Status %08lx)\n", Status); + goto done; + } + + Names[0].Length = LogonInfo->UserName.Length; + Names[0].MaximumLength = LogonInfo->UserName.MaximumLength; + Names[0].Buffer = LogonInfo->UserName.Buffer; + + /* Try to get the RID for the user name */ + Status = SamrLookupNamesInDomain(DomainHandle, + 1, + Names, + &RelativeIds, + &Use); + if (!NT_SUCCESS(Status)) + { + TRACE("SamrLookupNamesInDomain failed (Status %08lx)\n", Status); + Status = STATUS_NO_SUCH_USER; + goto done; + } + + /* Fail, if it is not a user account */ + if (Use.Element[0] != SidTypeUser) + { + TRACE("Account is not a user account!\n"); + Status = STATUS_NO_SUCH_USER; + goto done; + } + + + +done: + SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds); + SamIFree_SAMPR_ULONG_ARRAY(&Use); + + if (DomainHandle != NULL) + SamrCloseHandle(&DomainHandle); + + if (ServerHandle != NULL) + SamrCloseHandle(&ServerHandle); + + if (AccountDomainSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid); + + TRACE("LsaApLogonUser done (Status %08lx)\n", Status); + + return Status; +} + + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +LsaApLogonUserEx(IN PLSA_CLIENT_REQUEST ClientRequest, + IN SECURITY_LOGON_TYPE LogonType, + IN PVOID AuthenticationInformation, + IN PVOID ClientAuthenticationBase, + IN ULONG AuthenticationInformationLength, + OUT PVOID *ProfileBuffer, + OUT PULONG ProfileBufferLength, + OUT PLUID LogonId, + OUT PNTSTATUS SubStatus, + OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType, + OUT PVOID *TokenInformation, + OUT PUNICODE_STRING *AccountName, + OUT PUNICODE_STRING *AuthenticatingAuthority, + OUT PUNICODE_STRING *MachineName) +{ + TRACE("()\n"); + + TRACE("LogonType: %lu\n", LogonType); + TRACE("AuthenticationInformation: %p\n", AuthenticationInformation); + TRACE("AuthenticationInformationLength: %lu\n", AuthenticationInformationLength); + + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +LsaApLogonUserEx2(IN PLSA_CLIENT_REQUEST ClientRequest, + IN SECURITY_LOGON_TYPE LogonType, + IN PVOID ProtocolSubmitBuffer, + IN PVOID ClientBufferBase, + IN ULONG SubmitBufferSize, + OUT PVOID *ProfileBuffer, + OUT PULONG ProfileBufferSize, + OUT PLUID LogonId, + OUT PNTSTATUS SubStatus, + OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType, + OUT PVOID *TokenInformation, + OUT PUNICODE_STRING *AccountName, + OUT PUNICODE_STRING *AuthenticatingAuthority, + OUT PUNICODE_STRING *MachineName, + OUT PSECPKG_PRIMARY_CRED PrimaryCredentials, + OUT PSECPKG_SUPPLEMENTAL_CRED_ARRAY *SupplementalCredentials) +{ + TRACE("()\n"); + + TRACE("LogonType: %lu\n", LogonType); + TRACE("ProtocolSubmitBuffer: %p\n", ProtocolSubmitBuffer); + TRACE("SubmitBufferSize: %lu\n", SubmitBufferSize); + + return STATUS_NOT_IMPLEMENTED; } diff --git a/dll/win32/msv1_0/msv1_0.h b/dll/win32/msv1_0/msv1_0.h index 4c9c9181cbc..ee9f5008cda 100644 --- a/dll/win32/msv1_0/msv1_0.h +++ b/dll/win32/msv1_0/msv1_0.h @@ -27,7 +27,145 @@ #include #include #include +#include +#include + +#include +//#include #include +typedef struct _RPC_SID +{ + UCHAR Revision; + UCHAR SubAuthorityCount; + SID_IDENTIFIER_AUTHORITY IdentifierAuthority; + DWORD SubAuthority[]; +} RPC_SID, *PRPC_SID; + +typedef struct _RPC_UNICODE_STRING +{ + unsigned short Length; + unsigned short MaximumLength; + wchar_t *Buffer; +} RPC_UNICODE_STRING, *PRPC_UNICODE_STRING; + +typedef wchar_t *PSAMPR_SERVER_NAME; +typedef void *SAMPR_HANDLE; + +typedef struct _SAMPR_ULONG_ARRAY +{ + ULONG Count; + PULONG Element; +} SAMPR_ULONG_ARRAY, *PSAMPR_ULONG_ARRAY; + +NTSTATUS +NTAPI +SamIConnect(IN PSAMPR_SERVER_NAME ServerName, + OUT SAMPR_HANDLE *ServerHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN Trusted); + +VOID +NTAPI +SamIFree_SAMPR_ULONG_ARRAY(PSAMPR_ULONG_ARRAY Ptr); + +NTSTATUS +NTAPI +SamrCloseHandle(IN OUT SAMPR_HANDLE *SamHandle); + +NTSTATUS +NTAPI +SamrOpenDomain(IN SAMPR_HANDLE ServerHandle, + IN ACCESS_MASK DesiredAccess, + IN PRPC_SID DomainId, + OUT SAMPR_HANDLE *DomainHandle); + +NTSTATUS +NTAPI +SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle, + IN ULONG Count, + IN RPC_UNICODE_STRING Names[], + OUT PSAMPR_ULONG_ARRAY RelativeIds, + OUT PSAMPR_ULONG_ARRAY Use); + +typedef PVOID LSAPR_HANDLE; + +typedef struct _LSAPR_POLICY_AUDIT_EVENTS_INFO +{ + BOOLEAN AuditingMode; + DWORD *EventAuditingOptions; + DWORD MaximumAuditEventCount; +} LSAPR_POLICY_AUDIT_EVENTS_INFO, *PLSAPR_POLICY_AUDIT_EVENTS_INFO; + +typedef struct _LSAPR_POLICY_PRIMARY_DOM_INFO +{ + RPC_UNICODE_STRING Name; + PRPC_SID Sid; +} LSAPR_POLICY_PRIMARY_DOM_INFO, *PLSAPR_POLICY_PRIMARY_DOM_INFO; + +typedef struct _LSAPR_POLICY_ACCOUNT_DOM_INFO +{ + RPC_UNICODE_STRING DomainName; + PRPC_SID Sid; +} LSAPR_POLICY_ACCOUNT_DOM_INFO, *PLSAPR_POLICY_ACCOUNT_DOM_INFO; + +typedef struct _LSAPR_POLICY_PD_ACCOUNT_INFO +{ + RPC_UNICODE_STRING Name; +} LSAPR_POLICY_PD_ACCOUNT_INFO, *PLSAPR_POLICY_PD_ACCOUNT_INFO; + +typedef struct _POLICY_LSA_REPLICA_SRCE_INFO +{ + RPC_UNICODE_STRING ReplicaSource; + RPC_UNICODE_STRING ReplicaAccountName; +} POLICY_LSA_REPLICA_SRCE_INFO, *PPOLICY_LSA_REPLICA_SRCE_INFO; + +typedef struct _LSAPR_POLICY_DNS_DOMAIN_INFO +{ + RPC_UNICODE_STRING Name; + RPC_UNICODE_STRING DnsDomainName; + RPC_UNICODE_STRING DnsForestName; + GUID DomainGuid; + PRPC_SID Sid; +} LSAPR_POLICY_DNS_DOMAIN_INFO, *PLSAPR_POLICY_DNS_DOMAIN_INFO; + +typedef union _LSAPR_POLICY_INFORMATION +{ + POLICY_AUDIT_LOG_INFO PolicyAuditLogInfo; + LSAPR_POLICY_AUDIT_EVENTS_INFO PolicyAuditEventsInfo; + LSAPR_POLICY_PRIMARY_DOM_INFO PolicyPrimaryDomInfo; + LSAPR_POLICY_PD_ACCOUNT_INFO PolicyPdAccountInfo; + LSAPR_POLICY_ACCOUNT_DOM_INFO PolicyAccountDomainInfo; + POLICY_LSA_SERVER_ROLE_INFO PolicyServerRoleInfo; + POLICY_LSA_REPLICA_SRCE_INFO PolicyReplicaSourceInfo; + POLICY_DEFAULT_QUOTA_INFO PolicyDefaultQuotaInfo; + POLICY_MODIFICATION_INFO PolicyModificationInfo; + POLICY_AUDIT_FULL_SET_INFO PolicyAuditFullSetInfo; + POLICY_AUDIT_FULL_QUERY_INFO PolicyAuditFullQueryInfo; + LSAPR_POLICY_DNS_DOMAIN_INFO PolicyDnsDomainInfo; + LSAPR_POLICY_DNS_DOMAIN_INFO PolicyDnsDomainInfoInt; + LSAPR_POLICY_ACCOUNT_DOM_INFO PolicyLocalAccountDomainInfo; +} LSAPR_POLICY_INFORMATION, *PLSAPR_POLICY_INFORMATION; + +VOID +NTAPI +LsaIFree_LSAPR_POLICY_INFORMATION(IN POLICY_INFORMATION_CLASS InformationClass, + IN PLSAPR_POLICY_INFORMATION PolicyInformation); + +NTSTATUS +WINAPI +LsaIOpenPolicyTrusted(OUT LSAPR_HANDLE *PolicyHandle); + +NTSTATUS +WINAPI +LsarClose(IN OUT LSAPR_HANDLE *ObjectHandle); + +NTSTATUS +WINAPI +LsarQueryInformationPolicy(IN LSAPR_HANDLE PolicyHandle, + IN POLICY_INFORMATION_CLASS InformationClass, + OUT PLSAPR_POLICY_INFORMATION *PolicyInformation); + + /* EOF */ diff --git a/dll/win32/msv1_0/msv1_0.spec b/dll/win32/msv1_0/msv1_0.spec index 31a19adf71e..ea061763b8c 100644 --- a/dll/win32/msv1_0/msv1_0.spec +++ b/dll/win32/msv1_0/msv1_0.spec @@ -4,8 +4,8 @@ @ stdcall LsaApInitializePackage(long ptr ptr ptr ptr) @ stdcall LsaApLogonTerminated(ptr) @ stdcall LsaApLogonUser(ptr long ptr ptr long ptr ptr ptr ptr ptr ptr ptr ptr) -@ stub LsaApLogonUserEx -@ stub LsaApLogonUserEx2 +#@ stdcall LsaApLogonUserEx(ptr long ptr ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) +#@ stdcall LsaApLogonUserEx2(ptr long ptr ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) @ stub Msv1_0ExportSubAuthenticationRoutine @ stub Msv1_0SubAuthenticationPresent @ stub MsvGetLogonAttemptCount diff --git a/dll/win32/msxml3/attribute.c b/dll/win32/msxml3/attribute.c index edd33d019ae..6bd7a5809d1 100644 --- a/dll/win32/msxml3/attribute.c +++ b/dll/win32/msxml3/attribute.c @@ -606,7 +606,7 @@ static HRESULT WINAPI domattr_put_value( TRACE("(%p)->(%s)\n", This, debugstr_variant(&value)); - return node_put_value(&This->node, &value); + return node_put_value_escaped(&This->node, &value); } static const struct IXMLDOMAttributeVtbl domattr_vtbl = diff --git a/dll/win32/msxml3/cdata.c b/dll/win32/msxml3/cdata.c index b7d8e3884e7..cbf72cb58a2 100644 --- a/dll/win32/msxml3/cdata.c +++ b/dll/win32/msxml3/cdata.c @@ -293,10 +293,9 @@ static HRESULT WINAPI domcdata_insertBefore( IXMLDOMNode** outOldNode) { domcdata *This = impl_from_IXMLDOMCDATASection( iface ); - - FIXME("(%p)->(%p %s %p) needs test\n", This, newNode, debugstr_variant(&refChild), outOldNode); - - return node_insert_before(&This->node, newNode, &refChild, outOldNode); + TRACE("(%p)->(%p %s %p)\n", This, newNode, debugstr_variant(&refChild), outOldNode); + if (outOldNode) *outOldNode = NULL; + return E_FAIL; } static HRESULT WINAPI domcdata_replaceChild( @@ -306,10 +305,9 @@ static HRESULT WINAPI domcdata_replaceChild( IXMLDOMNode** outOldNode) { domcdata *This = impl_from_IXMLDOMCDATASection( iface ); - - FIXME("(%p)->(%p %p %p) needs tests\n", This, newNode, oldNode, outOldNode); - - return node_replace_child(&This->node, newNode, oldNode, outOldNode); + TRACE("(%p)->(%p %p %p)\n", This, newNode, oldNode, outOldNode); + if (outOldNode) *outOldNode = NULL; + return E_FAIL; } static HRESULT WINAPI domcdata_removeChild( @@ -318,7 +316,8 @@ static HRESULT WINAPI domcdata_removeChild( { domcdata *This = impl_from_IXMLDOMCDATASection( iface ); TRACE("(%p)->(%p %p)\n", This, child, oldChild); - return node_remove_child(&This->node, child, oldChild); + if (oldChild) *oldChild = NULL; + return E_FAIL; } static HRESULT WINAPI domcdata_appendChild( @@ -327,7 +326,8 @@ static HRESULT WINAPI domcdata_appendChild( { domcdata *This = impl_from_IXMLDOMCDATASection( iface ); TRACE("(%p)->(%p %p)\n", This, child, outChild); - return node_append_child(&This->node, child, outChild); + if (outChild) *outChild = NULL; + return E_FAIL; } static HRESULT WINAPI domcdata_hasChildNodes( diff --git a/dll/win32/msxml3/dispex.c b/dll/win32/msxml3/dispex.c index 4384f9836e7..9eb5ae33e5b 100644 --- a/dll/win32/msxml3/dispex.c +++ b/dll/win32/msxml3/dispex.c @@ -601,6 +601,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc hres = IUnknown_QueryInterface(This->outer, get_riid_from_tid(data->funcs[n].tid), (void**)&unk); if(FAILED(hres)) { ERR("Could not get iface: %08x\n", hres); + ITypeInfo_Release(ti); return E_FAIL; } diff --git a/dll/win32/msxml3/domdoc.c b/dll/win32/msxml3/domdoc.c index 15075e3f58b..9828482f5c0 100644 --- a/dll/win32/msxml3/domdoc.c +++ b/dll/win32/msxml3/domdoc.c @@ -135,9 +135,6 @@ struct domdoc bsc_t *bsc; HRESULT error; - /* IPersistStream */ - IStream *stream; - /* IObjectWithSite*/ IUnknown *site; @@ -559,19 +556,28 @@ void xmldoc_init(xmlDocPtr doc, MSXML_VERSION version) priv_from_xmlDocPtr(doc)->properties = create_properties(version); } -LONG xmldoc_add_ref(xmlDocPtr doc) +LONG xmldoc_add_refs(xmlDocPtr doc, LONG refs) { - LONG ref = InterlockedIncrement(&priv_from_xmlDocPtr(doc)->refs); + LONG ref = InterlockedExchangeAdd(&priv_from_xmlDocPtr(doc)->refs, refs) + refs; TRACE("(%p)->(%d)\n", doc, ref); return ref; } -LONG xmldoc_release(xmlDocPtr doc) +LONG xmldoc_add_ref(xmlDocPtr doc) +{ + return xmldoc_add_refs(doc, 1); +} + +LONG xmldoc_release_refs(xmlDocPtr doc, LONG refs) { xmldoc_priv *priv = priv_from_xmlDocPtr(doc); - LONG ref = InterlockedDecrement(&priv->refs); + LONG ref = InterlockedExchangeAdd(&priv->refs, -refs) - refs; TRACE("(%p)->(%d)\n", doc, ref); - if(ref == 0) + + if (ref < 0) + WARN("negative refcount, expect troubles\n"); + + if (ref == 0) { orphan_entry *orphan, *orphan2; TRACE("freeing docptr %p\n", doc); @@ -590,6 +596,11 @@ LONG xmldoc_release(xmlDocPtr doc) return ref; } +LONG xmldoc_release(xmlDocPtr doc) +{ + return xmldoc_release_refs(doc, 1); +} + HRESULT xmldoc_add_orphan(xmlDocPtr doc, xmlNodePtr node) { xmldoc_priv *priv = priv_from_xmlDocPtr(doc); @@ -624,7 +635,7 @@ HRESULT xmldoc_remove_orphan(xmlDocPtr doc, xmlNodePtr node) static inline xmlDocPtr get_doc( domdoc *This ) { - return (xmlDocPtr)This->node.node; + return This->node.node->doc; } static HRESULT attach_xmldoc(domdoc *This, xmlDocPtr xml ) @@ -721,46 +732,42 @@ static HRESULT WINAPI PersistStreamInit_IsDirty( return S_FALSE; } -static HRESULT WINAPI PersistStreamInit_Load( - IPersistStreamInit *iface, LPSTREAM pStm) +static HRESULT domdoc_load_from_stream(domdoc *doc, ISequentialStream *stream) { - domdoc *This = impl_from_IPersistStreamInit(iface); - HRESULT hr; - HGLOBAL hglobal; DWORD read, written, len; - BYTE buf[4096]; - char *ptr; xmlDocPtr xmldoc = NULL; + IStream *hstream; + HGLOBAL hglobal; + BYTE buf[4096]; + HRESULT hr; + char *ptr; - TRACE("(%p)->(%p)\n", This, pStm); - - if (!pStm) - return E_INVALIDARG; - - hr = CreateStreamOnHGlobal(NULL, TRUE, &This->stream); + hstream = NULL; + hr = CreateStreamOnHGlobal(NULL, TRUE, &hstream); if (FAILED(hr)) return hr; do { - IStream_Read(pStm, buf, sizeof(buf), &read); - hr = IStream_Write(This->stream, buf, read, &written); + ISequentialStream_Read(stream, buf, sizeof(buf), &read); + hr = IStream_Write(hstream, buf, read, &written); } while(SUCCEEDED(hr) && written != 0 && read != 0); if (FAILED(hr)) { - ERR("Failed to copy stream\n"); + ERR("failed to copy stream 0x%08x\n", hr); + IStream_Release(hstream); return hr; } - hr = GetHGlobalFromStream(This->stream, &hglobal); + hr = GetHGlobalFromStream(hstream, &hglobal); if (FAILED(hr)) return hr; len = GlobalSize(hglobal); ptr = GlobalLock(hglobal); - if (len != 0) - xmldoc = doparse(This, ptr, len, XML_CHAR_ENCODING_NONE); + if (len) + xmldoc = doparse(doc, ptr, len, XML_CHAR_ENCODING_NONE); GlobalUnlock(hglobal); if (!xmldoc) @@ -771,7 +778,19 @@ static HRESULT WINAPI PersistStreamInit_Load( xmldoc->_private = create_priv(); - return attach_xmldoc(This, xmldoc); + return attach_xmldoc(doc, xmldoc); +} + +static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, IStream *stream) +{ + domdoc *This = impl_from_IPersistStreamInit(iface); + + TRACE("(%p)->(%p)\n", This, stream); + + if (!stream) + return E_INVALIDARG; + + return domdoc_load_from_stream(This, (ISequentialStream*)stream); } static HRESULT WINAPI PersistStreamInit_Save( @@ -801,7 +820,7 @@ static HRESULT WINAPI PersistStreamInit_GetSizeMax( IPersistStreamInit *iface, ULARGE_INTEGER *pcbSize) { domdoc *This = impl_from_IPersistStreamInit(iface); - TRACE("(%p)->(%p): stub!\n", This, pcbSize); + TRACE("(%p)->(%p)\n", This, pcbSize); return E_NOTIMPL; } @@ -914,8 +933,6 @@ static ULONG WINAPI domdoc_Release( IXMLDOMDocument3 *iface ) if (This->site) IUnknown_Release( This->site ); destroy_xmlnode(&This->node); - if (This->stream) - IStream_Release(This->stream); for (eid = 0; eid < EVENTID_LAST; eid++) if (This->events[eid]) IDispatch_Release(This->events[eid]); @@ -1115,12 +1132,26 @@ static HRESULT WINAPI domdoc_insertBefore( IXMLDOMNode** outNewChild ) { domdoc *This = impl_from_IXMLDOMDocument3( iface ); + DOMNodeType type; + HRESULT hr; TRACE("(%p)->(%p %s %p)\n", This, newChild, debugstr_variant(&refChild), outNewChild); - return node_insert_before(&This->node, newChild, &refChild, outNewChild); -} + hr = IXMLDOMNode_get_nodeType(newChild, &type); + if (hr != S_OK) return hr; + TRACE("new node type %d\n", type); + switch (type) + { + case NODE_ATTRIBUTE: + case NODE_DOCUMENT: + case NODE_CDATA_SECTION: + if (outNewChild) *outNewChild = NULL; + return E_FAIL; + default: + return node_insert_before(&This->node, newChild, &refChild, outNewChild); + } +} static HRESULT WINAPI domdoc_replaceChild( IXMLDOMDocument3 *iface, @@ -1510,7 +1541,9 @@ static HRESULT WINAPI domdoc_put_documentElement( domdoc *This = impl_from_IXMLDOMDocument3( iface ); IXMLDOMNode *elementNode; xmlNodePtr oldRoot; + xmlDocPtr old_doc; xmlnode *xmlNode; + int refcount = 0; HRESULT hr; TRACE("(%p)->(%p)\n", This, DOMElement); @@ -1526,7 +1559,14 @@ static HRESULT WINAPI domdoc_put_documentElement( if(xmldoc_remove_orphan(xmlNode->node->doc, xmlNode->node) != S_OK) WARN("%p is not an orphan of %p\n", xmlNode->node->doc, xmlNode->node); + old_doc = xmlNode->node->doc; + if (old_doc != get_doc(This)) + refcount = xmlnode_get_inst_cnt(xmlNode); + + /* old root is still orphaned by its document, update refcount from new root */ + if (refcount) xmldoc_add_refs(get_doc(This), refcount); oldRoot = xmlDocSetRootElement( get_doc(This), xmlNode->node); + if (refcount) xmldoc_release_refs(old_doc, refcount); IXMLDOMNode_Release( elementNode ); if(oldRoot) @@ -2029,8 +2069,6 @@ static HRESULT WINAPI domdoc_load( domdoc *This = impl_from_IXMLDOMDocument3( iface ); LPWSTR filename = NULL; HRESULT hr = S_FALSE; - IXMLDOMDocument3 *pNewDoc = NULL; - IStream *pStream = NULL; xmlDocPtr xmldoc; TRACE("(%p)->(%s)\n", This, debugstr_variant(&source)); @@ -2096,13 +2134,18 @@ static HRESULT WINAPI domdoc_load( } break; case VT_UNKNOWN: + { + ISequentialStream *stream = NULL; + IXMLDOMDocument3 *newdoc = NULL; + if (!V_UNKNOWN(&source)) return E_INVALIDARG; - hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IXMLDOMDocument3, (void**)&pNewDoc); + + hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IXMLDOMDocument3, (void**)&newdoc); if(hr == S_OK) { - if(pNewDoc) + if(newdoc) { - domdoc *newDoc = impl_from_IXMLDOMDocument3( pNewDoc ); + domdoc *newDoc = impl_from_IXMLDOMDocument3( newdoc ); xmldoc = xmlCopyDoc(get_doc(newDoc), 1); xmldoc->_private = create_priv(); @@ -2114,40 +2157,25 @@ static HRESULT WINAPI domdoc_load( return hr; } } - hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IStream, (void**)&pStream); - if(hr == S_OK) - { - IPersistStream *pDocStream; - hr = IXMLDOMDocument3_QueryInterface(iface, &IID_IPersistStream, (void**)&pDocStream); - if(hr == S_OK) - { - hr = IPersistStream_Load(pDocStream, pStream); - IStream_Release(pStream); - if(hr == S_OK) - { - *isSuccessful = VARIANT_TRUE; - TRACE("Using IStream to load Document\n"); - return S_OK; - } - else - { - ERR("xmldoc_IPersistStream_Load failed (%d)\n", hr); - } - } - else - { - ERR("QueryInterface IID_IPersistStream failed (%d)\n", hr); - } - } - else + hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IStream, (void**)&stream); + if (FAILED(hr)) + hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_ISequentialStream, (void**)&stream); + + if (hr == S_OK) { - /* ISequentialStream */ - FIXME("Unknown type not supported (%d) (%p)(%p)\n", hr, pNewDoc, V_UNKNOWN(&source)->lpVtbl); + hr = domdoc_load_from_stream(This, stream); + if (hr == S_OK) + *isSuccessful = VARIANT_TRUE; + ISequentialStream_Release(stream); + return hr; } + + FIXME("unsupported IUnknown type (0x%08x) (%p)\n", hr, V_UNKNOWN(&source)->lpVtbl); break; - default: - FIXME("VT type not supported (%d)\n", V_VT(&source)); + } + default: + FIXME("VT type not supported (%d)\n", V_VT(&source)); } if ( filename ) @@ -3251,12 +3279,43 @@ static HRESULT WINAPI ConnectionPoint_GetConnectionPointContainer(IConnectionPoi return S_OK; } -static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *pUnkSink, - DWORD *pdwCookie) +static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *unk_sink, + DWORD *cookie) { ConnectionPoint *This = impl_from_IConnectionPoint(iface); - FIXME("(%p)->(%p %p): stub\n", This, pUnkSink, pdwCookie); - return E_NOTIMPL; + IUnknown *sink; + HRESULT hr; + DWORD i; + + TRACE("(%p)->(%p %p)\n", This, unk_sink, cookie); + + hr = IUnknown_QueryInterface(unk_sink, This->iid, (void**)&sink); + if(FAILED(hr) && !IsEqualGUID(&IID_IPropertyNotifySink, This->iid)) + hr = IUnknown_QueryInterface(unk_sink, &IID_IDispatch, (void**)&sink); + if(FAILED(hr)) + return CONNECT_E_CANNOTCONNECT; + + if(This->sinks) + { + for (i = 0; i < This->sinks_size; i++) + if (!This->sinks[i].unk) + break; + + if (i == This->sinks_size) + This->sinks = heap_realloc(This->sinks,(++This->sinks_size)*sizeof(*This->sinks)); + } + else + { + This->sinks = heap_alloc(sizeof(*This->sinks)); + This->sinks_size = 1; + i = 0; + } + + This->sinks[i].unk = sink; + if (cookie) + *cookie = i+1; + + return S_OK; } static HRESULT WINAPI ConnectionPoint_Unadvise(IConnectionPoint *iface, DWORD cookie) @@ -3466,7 +3525,6 @@ HRESULT get_domdoc_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument3 **document) doc->resolving = 0; doc->properties = properties_from_xmlDocPtr(xmldoc); doc->error = S_OK; - doc->stream = NULL; doc->site = NULL; doc->safeopt = 0; doc->bsc = NULL; diff --git a/dll/win32/msxml3/element.c b/dll/win32/msxml3/element.c index cfc4165f66d..1cdc0f84b8b 100644 --- a/dll/win32/msxml3/element.c +++ b/dll/win32/msxml3/element.c @@ -304,13 +304,29 @@ static HRESULT WINAPI domelem_get_attributes( static HRESULT WINAPI domelem_insertBefore( IXMLDOMElement *iface, IXMLDOMNode* newNode, VARIANT refChild, - IXMLDOMNode** outOldNode) + IXMLDOMNode** old_node) { domelem *This = impl_from_IXMLDOMElement( iface ); + DOMNodeType type; + HRESULT hr; - TRACE("(%p)->(%p %s %p)\n", This, newNode, debugstr_variant(&refChild), outOldNode); + TRACE("(%p)->(%p %s %p)\n", This, newNode, debugstr_variant(&refChild), old_node); - return node_insert_before(&This->node, newNode, &refChild, outOldNode); + hr = IXMLDOMNode_get_nodeType(newNode, &type); + if (hr != S_OK) return hr; + + TRACE("new node type %d\n", type); + switch (type) + { + case NODE_DOCUMENT: + case NODE_DOCUMENT_TYPE: + case NODE_ENTITY: + case NODE_NOTATION: + if (old_node) *old_node = NULL; + return E_FAIL; + default: + return node_insert_before(&This->node, newNode, &refChild, old_node); + } } static HRESULT WINAPI domelem_replaceChild( @@ -739,7 +755,7 @@ static HRESULT encode_base64(const BYTE *buf, int len, BSTR *ret) { static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; const BYTE *d = buf; - int bytes, pad_bytes, div, i; + int bytes, pad_bytes, div; DWORD needed; WCHAR *ptr; @@ -756,7 +772,6 @@ static HRESULT encode_base64(const BYTE *buf, int len, BSTR *ret) div = len / 3; ptr = *ret; - i = 0; while (div > 0) { /* first char is the first 6 bits of the first byte*/ @@ -769,7 +784,6 @@ static HRESULT encode_base64(const BYTE *buf, int len, BSTR *ret) *ptr++ = b64[ ((d[1] << 2) & 0x3c) | (d[2] >> 6 & 0x03)]; /* fourth char is the remaining 6 bits of the third byte */ *ptr++ = b64[ d[2] & 0x3f]; - i += 4; d += 3; div--; } @@ -1232,8 +1246,7 @@ static HRESULT WINAPI domelem_setAttribute( domelem *This = impl_from_IXMLDOMElement( iface ); xmlChar *xml_name, *xml_value, *local, *prefix; xmlNodePtr element; - HRESULT hr; - VARIANT var; + HRESULT hr = S_OK; TRACE("(%p)->(%s %s)\n", This, debugstr_w(name), debugstr_variant(&value)); @@ -1241,16 +1254,25 @@ static HRESULT WINAPI domelem_setAttribute( if ( !element ) return E_FAIL; - VariantInit(&var); - hr = VariantChangeType(&var, &value, 0, VT_BSTR); - if(hr != S_OK) + if (V_VT(&value) != VT_BSTR) { - FIXME("VariantChangeType failed\n"); - return hr; + VARIANT var; + + VariantInit(&var); + hr = VariantChangeType(&var, &value, 0, VT_BSTR); + if (hr != S_OK) + { + FIXME("VariantChangeType failed\n"); + return hr; + } + + xml_value = xmlchar_from_wchar(V_BSTR(&var)); + VariantClear(&var); } + else + xml_value = xmlchar_from_wchar(V_BSTR(&value)); xml_name = xmlchar_from_wchar( name ); - xml_value = xmlchar_from_wchar( V_BSTR(&var) ); if ((local = xmlSplitQName2(xml_name, &prefix))) { @@ -1273,7 +1295,6 @@ static HRESULT WINAPI domelem_setAttribute( heap_free(xml_value); heap_free(xml_name); - VariantClear(&var); return hr; } diff --git a/dll/win32/msxml3/factory.c b/dll/win32/msxml3/factory.c index 6f82e183968..f22d08e23cd 100644 --- a/dll/win32/msxml3/factory.c +++ b/dll/win32/msxml3/factory.c @@ -101,7 +101,7 @@ static const struct clsid_version_t clsid_versions_table[] = static MSXML_VERSION get_msxml_version(const GUID *clsid) { - int i; + unsigned int i; for (i = 0; i < sizeof(clsid_versions_table)/sizeof(struct clsid_version_t); i++) if (IsEqualGUID(clsid, clsid_versions_table[i].clsid)) diff --git a/dll/win32/msxml3/httprequest.c b/dll/win32/msxml3/httprequest.c index 7ddc49cd72e..4179368839f 100644 --- a/dll/win32/msxml3/httprequest.c +++ b/dll/win32/msxml3/httprequest.c @@ -85,8 +85,8 @@ typedef struct /* request */ BINDVERB verb; BSTR custom; - BSTR siteurl; - BSTR url; + IUri *uri; + IUri *base_uri; BOOL async; struct list reqheaders; /* cached resulting custom request headers string length in WCHARs */ @@ -144,9 +144,17 @@ static inline serverhttp *impl_from_IServerXMLHTTPRequest(IServerXMLHTTPRequest static void httprequest_setreadystate(httprequest *This, READYSTATE state) { READYSTATE last = This->state; + static const char* readystates[] = { + "READYSTATE_UNINITIALIZED", + "READYSTATE_LOADING", + "READYSTATE_LOADED", + "READYSTATE_INTERACTIVE", + "READYSTATE_COMPLETE"}; This->state = state; + TRACE("state %s\n", readystates[state]); + if (This->sink && last != state) { DISPPARAMS params; @@ -209,6 +217,7 @@ static void BindStatusCallback_Detach(BindStatusCallback *bsc) if (bsc) { if (bsc->binding) IBinding_Abort(bsc->binding); + bsc->request->bsc = NULL; bsc->request = NULL; IBindStatusCallback_Release(&bsc->IBindStatusCallback_iface); } @@ -343,7 +352,11 @@ static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallback *ifac } if (hr == S_OK) + { + BindStatusCallback_Detach(This->request->bsc); + This->request->bsc = This; httprequest_setreadystate(This->request, READYSTATE_COMPLETE); + } return S_OK; } @@ -688,23 +701,28 @@ static HRESULT BindStatusCallback_create(httprequest* This, BindStatusCallback * case VT_ARRAY|VT_UI1: { sa = V_ARRAY(body); - if ((hr = SafeArrayAccessData(sa, (void **)&ptr)) != S_OK) return hr; + if ((hr = SafeArrayAccessData(sa, (void **)&ptr)) != S_OK) + { + heap_free(bsc); + return hr; + } if ((hr = SafeArrayGetUBound(sa, 1, &size) != S_OK)) { SafeArrayUnaccessData(sa); + heap_free(bsc); return hr; } size++; break; } + default: + FIXME("unsupported body data type %d\n", V_VT(body)); + /* fall through */ case VT_EMPTY: case VT_ERROR: ptr = NULL; size = 0; break; - default: - FIXME("unsupported body data type %d\n", V_VT(body)); - break; } bsc->body = GlobalAlloc(GMEM_FIXED, size); @@ -734,7 +752,7 @@ static HRESULT BindStatusCallback_create(httprequest* This, BindStatusCallback * { IMoniker *moniker; - hr = CreateURLMoniker(NULL, This->url, &moniker); + hr = CreateURLMonikerEx2(NULL, This->uri, &moniker, URL_MK_UNIFORM); if (hr == S_OK) { IStream *stream; @@ -756,6 +774,53 @@ static HRESULT BindStatusCallback_create(httprequest* This, BindStatusCallback * return hr; } +static HRESULT verify_uri(httprequest *This, IUri *uri) +{ + DWORD scheme, base_scheme; + BSTR host, base_host; + HRESULT hr; + + if(!(This->safeopt & INTERFACESAFE_FOR_UNTRUSTED_DATA)) + return S_OK; + + if(!This->base_uri) + return E_ACCESSDENIED; + + hr = IUri_GetScheme(uri, &scheme); + if(FAILED(hr)) + return hr; + + hr = IUri_GetScheme(This->base_uri, &base_scheme); + if(FAILED(hr)) + return hr; + + if(scheme != base_scheme) { + WARN("Schemes don't match\n"); + return E_ACCESSDENIED; + } + + if(scheme == INTERNET_SCHEME_UNKNOWN) { + FIXME("Unknown scheme\n"); + return E_ACCESSDENIED; + } + + hr = IUri_GetHost(uri, &host); + if(FAILED(hr)) + return hr; + + hr = IUri_GetHost(This->base_uri, &base_host); + if(SUCCEEDED(hr)) { + if(strcmpiW(host, base_host)) { + WARN("Hosts don't match\n"); + hr = E_ACCESSDENIED; + } + SysFreeString(base_host); + } + + SysFreeString(host); + return hr; +} + static HRESULT httprequest_open(httprequest *This, BSTR method, BSTR url, VARIANT async, VARIANT user, VARIANT password) { @@ -765,15 +830,20 @@ static HRESULT httprequest_open(httprequest *This, BSTR method, BSTR url, static const WCHAR MethodDeleteW[] = {'D','E','L','E','T','E',0}; static const WCHAR MethodPropFindW[] = {'P','R','O','P','F','I','N','D',0}; VARIANT str, is_async; + IUri *uri; HRESULT hr; if (!method || !url) return E_INVALIDARG; /* free previously set data */ - SysFreeString(This->url); + if(This->uri) { + IUri_Release(This->uri); + This->uri = NULL; + } + SysFreeString(This->user); SysFreeString(This->password); - This->url = This->user = This->password = NULL; + This->user = This->password = NULL; if (!strcmpiW(method, MethodGetW)) { @@ -800,22 +870,22 @@ static HRESULT httprequest_open(httprequest *This, BSTR method, BSTR url, return E_FAIL; } - /* try to combine with site url */ - if (This->siteurl && PathIsRelativeW(url)) - { - DWORD len = INTERNET_MAX_URL_LENGTH; - WCHAR *fullW = heap_alloc(len*sizeof(WCHAR)); - - hr = UrlCombineW(This->siteurl, url, fullW, &len, 0); - if (hr == S_OK) - { - TRACE("combined url %s\n", debugstr_w(fullW)); - This->url = SysAllocString(fullW); - } - heap_free(fullW); - } + if(This->base_uri) + hr = CoInternetCombineUrlEx(This->base_uri, url, 0, &uri, 0); else - This->url = SysAllocString(url); + hr = CreateUri(url, 0, 0, &uri); + if(FAILED(hr)) { + WARN("Could not create IUri object: %08x\n", hr); + return hr; + } + + hr = verify_uri(This, uri); + if(FAILED(hr)) { + IUri_Release(uri); + return hr; + } + + This->uri = uri; VariantInit(&is_async); hr = VariantChangeType(&is_async, &async, 0, VT_BOOL); @@ -881,7 +951,8 @@ static HRESULT httprequest_getResponseHeader(httprequest *This, BSTR header, BST { struct httpheader *entry; - if (!header || !value) return E_INVALIDARG; + if (!header) return E_INVALIDARG; + if (!value) return E_POINTER; if (This->raw_respheaders && list_empty(&This->respheaders)) { @@ -915,7 +986,7 @@ static HRESULT httprequest_getResponseHeader(httprequest *This, BSTR header, BST static HRESULT httprequest_getAllResponseHeaders(httprequest *This, BSTR *respheaders) { - if (!respheaders) return E_INVALIDARG; + if (!respheaders) return E_POINTER; *respheaders = SysAllocString(This->raw_respheaders); @@ -930,10 +1001,9 @@ static HRESULT httprequest_send(httprequest *This, VARIANT body) if (This->state != READYSTATE_LOADING) return E_FAIL; hr = BindStatusCallback_create(This, &bsc, &body); - if (FAILED(hr)) return hr; - - BindStatusCallback_Detach(This->bsc); - This->bsc = bsc; + if (FAILED(hr)) + /* success path to detach it is OnStopBinding call */ + BindStatusCallback_Detach(bsc); return hr; } @@ -941,7 +1011,6 @@ static HRESULT httprequest_send(httprequest *This, VARIANT body) static HRESULT httprequest_abort(httprequest *This) { BindStatusCallback_Detach(This->bsc); - This->bsc = NULL; httprequest_setreadystate(This, READYSTATE_UNINITIALIZED); @@ -950,17 +1019,16 @@ static HRESULT httprequest_abort(httprequest *This) static HRESULT httprequest_get_status(httprequest *This, LONG *status) { - if (!status) return E_INVALIDARG; - if (This->state != READYSTATE_COMPLETE) return E_FAIL; + if (!status) return E_POINTER; *status = This->status; - return S_OK; + return This->state == READYSTATE_COMPLETE ? S_OK : E_FAIL; } static HRESULT httprequest_get_statusText(httprequest *This, BSTR *status) { - if (!status) return E_INVALIDARG; + if (!status) return E_POINTER; if (This->state != READYSTATE_COMPLETE) return E_FAIL; *status = SysAllocString(This->status_text); @@ -973,7 +1041,7 @@ static HRESULT httprequest_get_responseText(httprequest *This, BSTR *body) HGLOBAL hglobal; HRESULT hr; - if (!body) return E_INVALIDARG; + if (!body) return E_POINTER; if (This->state != READYSTATE_COMPLETE) return E_FAIL; hr = GetHGlobalFromStream(This->bsc->stream, &hglobal); @@ -1119,7 +1187,7 @@ static HRESULT httprequest_get_responseStream(httprequest *This, VARIANT *body) static HRESULT httprequest_get_readyState(httprequest *This, LONG *state) { - if (!state) return E_INVALIDARG; + if (!state) return E_POINTER; *state = This->state; return S_OK; @@ -1139,10 +1207,12 @@ static void httprequest_release(httprequest *This) if (This->site) IUnknown_Release( This->site ); + if (This->uri) + IUri_Release(This->uri); + if (This->base_uri) + IUri_Release(This->base_uri); SysFreeString(This->custom); - SysFreeString(This->siteurl); - SysFreeString(This->url); SysFreeString(This->user); SysFreeString(This->password); @@ -1442,37 +1512,55 @@ static HRESULT WINAPI httprequest_ObjectWithSite_GetSite( IObjectWithSite *iface return IUnknown_QueryInterface( This->site, iid, ppvSite ); } +static void get_base_uri(httprequest *This) +{ + IServiceProvider *provider; + IHTMLDocument2 *doc; + IUri *uri; + BSTR url; + HRESULT hr; + + hr = IUnknown_QueryInterface(This->site, &IID_IServiceProvider, (void**)&provider); + if(FAILED(hr)) + return; + + hr = IServiceProvider_QueryService(provider, &SID_SContainerDispatch, &IID_IHTMLDocument2, (void**)&doc); + IServiceProvider_Release(provider); + if(FAILED(hr)) + return; + + hr = IHTMLDocument2_get_URL(doc, &url); + IHTMLDocument2_Release(doc); + if(FAILED(hr) || !url || !*url) + return; + + TRACE("host url %s\n", debugstr_w(url)); + + hr = CreateUri(url, 0, 0, &uri); + SysFreeString(url); + if(FAILED(hr)) + return; + + This->base_uri = uri; +} + static HRESULT WINAPI httprequest_ObjectWithSite_SetSite( IObjectWithSite *iface, IUnknown *punk ) { httprequest *This = impl_from_IObjectWithSite(iface); - IServiceProvider *provider; - HRESULT hr; - TRACE("(%p)->(%p)\n", iface, punk); - - if (punk) - IUnknown_AddRef( punk ); + TRACE("(%p)->(%p)\n", This, punk); if(This->site) IUnknown_Release( This->site ); + if(This->base_uri) + IUri_Release(This->base_uri); This->site = punk; - hr = IUnknown_QueryInterface(This->site, &IID_IServiceProvider, (void**)&provider); - if (hr == S_OK) + if (punk) { - IHTMLDocument2 *doc; - - hr = IServiceProvider_QueryService(provider, &SID_SContainerDispatch, &IID_IHTMLDocument2, (void**)&doc); - if (hr == S_OK) - { - SysFreeString(This->siteurl); - - hr = IHTMLDocument2_get_URL(doc, &This->siteurl); - IHTMLDocument2_Release(doc); - TRACE("host url %s, 0x%08x\n", debugstr_w(This->siteurl), hr); - } - IServiceProvider_Release(provider); + IUnknown_AddRef( punk ); + get_base_uri(This); } return S_OK; @@ -1826,7 +1914,8 @@ static void init_httprequest(httprequest *req) req->async = FALSE; req->verb = -1; req->custom = NULL; - req->url = req->siteurl = req->user = req->password = NULL; + req->uri = req->base_uri = NULL; + req->user = req->password = NULL; req->state = READYSTATE_UNINITIALIZED; req->sink = NULL; diff --git a/dll/win32/msxml3/main.c b/dll/win32/msxml3/main.c index 4deee6a3033..4f18378876a 100644 --- a/dll/win32/msxml3/main.c +++ b/dll/win32/msxml3/main.c @@ -276,6 +276,8 @@ const char *debugstr_variant(const VARIANT *v) return wine_dbg_sprintf("{VT_I2: %d}", V_I2(v)); case VT_I4: return wine_dbg_sprintf("{VT_I4: %d}", V_I4(v)); + case VT_INT: + return wine_dbg_sprintf("{VT_INT: %d}", V_INT(v)); case VT_R8: return wine_dbg_sprintf("{VT_R8: %lf}", V_R8(v)); case VT_BSTR: diff --git a/dll/win32/msxml3/msxml_private.h b/dll/win32/msxml3/msxml_private.h index e156ec26703..dc5250bb132 100644 --- a/dll/win32/msxml3/msxml_private.h +++ b/dll/win32/msxml3/msxml_private.h @@ -194,7 +194,8 @@ static inline LPWSTR heap_strdupW(LPCWSTR str) size = (strlenW(str)+1)*sizeof(WCHAR); ret = heap_alloc(size); - memcpy(ret, str, size); + if(ret) + memcpy(ret, str, size); } return ret; @@ -291,6 +292,9 @@ extern xmlChar *xmlChar_from_wchar( LPCWSTR str ) DECLSPEC_HIDDEN; extern void xmldoc_init( xmlDocPtr doc, MSXML_VERSION version ) DECLSPEC_HIDDEN; extern LONG xmldoc_add_ref( xmlDocPtr doc ) DECLSPEC_HIDDEN; extern LONG xmldoc_release( xmlDocPtr doc ) DECLSPEC_HIDDEN; +extern LONG xmldoc_add_refs( xmlDocPtr doc, LONG refs ) DECLSPEC_HIDDEN; +extern LONG xmldoc_release_refs ( xmlDocPtr doc, LONG refs ) DECLSPEC_HIDDEN; +extern int xmlnode_get_inst_cnt( xmlnode *node ) DECLSPEC_HIDDEN; extern HRESULT xmldoc_add_orphan( xmlDocPtr doc, xmlNodePtr node ) DECLSPEC_HIDDEN; extern HRESULT xmldoc_remove_orphan( xmlDocPtr doc, xmlNodePtr node ) DECLSPEC_HIDDEN; extern void xmldoc_link_xmldecl(xmlDocPtr doc, xmlNodePtr node) DECLSPEC_HIDDEN; @@ -404,6 +408,21 @@ static inline xmlChar *xmlchar_from_wchar( const WCHAR *str ) return xmlchar_from_wcharn(str, -1); } +static inline xmlChar *heap_strdupxmlChar(const xmlChar *str) +{ + xmlChar *ret = NULL; + + if(str) { + DWORD size; + + size = (xmlStrlen(str)+1)*sizeof(xmlChar); + ret = heap_alloc(size); + memcpy(ret, str, size); + } + + return ret; +} + #endif static inline HRESULT return_bstr(const WCHAR *value, BSTR *p) diff --git a/dll/win32/msxml3/mxwriter.c b/dll/win32/msxml3/mxwriter.c index 0069e4119b6..e60a6074069 100644 --- a/dll/win32/msxml3/mxwriter.c +++ b/dll/win32/msxml3/mxwriter.c @@ -291,7 +291,9 @@ static HRESULT alloc_output_buffer(xml_encoding encoding, output_buffer **buffer return hr; } - if (ret->code_page == CP_UTF8) { + /* currently we always create a default output buffer that is UTF-16 only, + but it's possible to allocate with specific encoding too */ + if (encoding != XmlEncoding_UTF16) { hr = init_encoded_buffer(&ret->encoded); if (hr != S_OK) { free_encoded_buffer(&ret->utf16); diff --git a/dll/win32/msxml3/node.c b/dll/win32/msxml3/node.c index 788bea8bd32..f52026e8668 100644 --- a/dll/win32/msxml3/node.c +++ b/dll/win32/msxml3/node.c @@ -285,36 +285,48 @@ static HRESULT node_set_content_escaped(xmlnode *This, LPCWSTR value) HRESULT node_put_value(xmlnode *This, VARIANT *value) { - VARIANT string_value; HRESULT hr; - VariantInit(&string_value); - hr = VariantChangeType(&string_value, value, 0, VT_BSTR); - if(FAILED(hr)) { - WARN("Couldn't convert to VT_BSTR\n"); - return hr; - } + if (V_VT(value) != VT_BSTR) + { + VARIANT string_value; - hr = node_set_content(This, V_BSTR(&string_value)); - VariantClear(&string_value); + VariantInit(&string_value); + hr = VariantChangeType(&string_value, value, 0, VT_BSTR); + if(FAILED(hr)) { + WARN("Couldn't convert to VT_BSTR\n"); + return hr; + } + + hr = node_set_content(This, V_BSTR(&string_value)); + VariantClear(&string_value); + } + else + hr = node_set_content(This, V_BSTR(value)); return hr; } HRESULT node_put_value_escaped(xmlnode *This, VARIANT *value) { - VARIANT string_value; HRESULT hr; - VariantInit(&string_value); - hr = VariantChangeType(&string_value, value, 0, VT_BSTR); - if(FAILED(hr)) { - WARN("Couldn't convert to VT_BSTR\n"); - return hr; - } + if (V_VT(value) != VT_BSTR) + { + VARIANT string_value; - hr = node_set_content_escaped(This, V_BSTR(&string_value)); - VariantClear(&string_value); + VariantInit(&string_value); + hr = VariantChangeType(&string_value, value, 0, VT_BSTR); + if(FAILED(hr)) { + WARN("Couldn't convert to VT_BSTR\n"); + return hr; + } + + hr = node_set_content_escaped(This, V_BSTR(&string_value)); + VariantClear(&string_value); + } + else + hr = node_set_content_escaped(This, V_BSTR(value)); return hr; } @@ -377,11 +389,45 @@ HRESULT node_get_next_sibling(xmlnode *This, IXMLDOMNode **ret) return get_node(This, "next", This->node->next, ret); } +static int node_get_inst_cnt(xmlNodePtr node) +{ + int ret = *(LONG *)&node->_private; + xmlNodePtr child; + + /* add attribute counts */ + if (node->type == XML_ELEMENT_NODE) + { + xmlAttrPtr prop = node->properties; + + while (prop) + { + ret += node_get_inst_cnt((xmlNodePtr)prop); + prop = prop->next; + } + } + + /* add children counts */ + child = node->children; + while (child) + { + ret += node_get_inst_cnt(child); + child = child->next; + } + + return ret; +} + +int xmlnode_get_inst_cnt(xmlnode *node) +{ + return node_get_inst_cnt(node->node); +} + HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT *ref_child, IXMLDOMNode **ret) { IXMLDOMNode *before = NULL; xmlnode *node_obj; + int refcount = 0; xmlDocPtr doc; HRESULT hr; @@ -417,6 +463,8 @@ HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT if(xmldoc_remove_orphan(node_obj->node->doc, node_obj->node) != S_OK) WARN("%p is not an orphan of %p\n", node_obj->node, node_obj->node->doc); + refcount = xmlnode_get_inst_cnt(node_obj); + if(before) { xmlnode *before_node_obj = get_node_obj(before); @@ -429,10 +477,16 @@ HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT hr = IXMLDOMNode_removeChild(node_obj->parent, node_obj->iface, NULL); if (hr == S_OK) xmldoc_remove_orphan(node_obj->node->doc, node_obj->node); } + doc = node_obj->node->doc; - xmldoc_add_ref(before_node_obj->node->doc); + + /* refs count including subtree */ + if (doc != before_node_obj->node->doc) + refcount = xmlnode_get_inst_cnt(node_obj); + + if (refcount) xmldoc_add_refs(before_node_obj->node->doc, refcount); xmlAddPrevSibling(before_node_obj->node, node_obj->node); - xmldoc_release(doc); + if (refcount) xmldoc_release_refs(doc, refcount); node_obj->parent = This->parent; } else @@ -444,11 +498,15 @@ HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT if (hr == S_OK) xmldoc_remove_orphan(node_obj->node->doc, node_obj->node); } doc = node_obj->node->doc; - xmldoc_add_ref(This->node->doc); + + if (doc != This->node->doc) + refcount = xmlnode_get_inst_cnt(node_obj); + + if (refcount) xmldoc_add_refs(This->node->doc, refcount); /* xmlAddChild doesn't unlink node from previous parent */ xmlUnlinkNode(node_obj->node); xmlAddChild(This->node, node_obj->node); - xmldoc_release(doc); + if (refcount) xmldoc_release_refs(doc, refcount); node_obj->parent = This->iface; } @@ -468,6 +526,7 @@ HRESULT node_replace_child(xmlnode *This, IXMLDOMNode *newChild, IXMLDOMNode *ol xmlnode *old_child, *new_child; xmlDocPtr leaving_doc; xmlNode *my_ancestor; + int refcount = 0; /* Do not believe any documentation telling that newChild == NULL means removal. It does certainly *not* apply to msxml3! */ @@ -505,9 +564,13 @@ HRESULT node_replace_child(xmlnode *This, IXMLDOMNode *newChild, IXMLDOMNode *ol WARN("%p is not an orphan of %p\n", new_child->node, new_child->node->doc); leaving_doc = new_child->node->doc; - xmldoc_add_ref(old_child->node->doc); + + if (leaving_doc != old_child->node->doc) + refcount = xmlnode_get_inst_cnt(new_child); + + if (refcount) xmldoc_add_refs(old_child->node->doc, refcount); xmlReplaceNode(old_child->node, new_child->node); - xmldoc_release(leaving_doc); + if (refcount) xmldoc_release_refs(leaving_doc, refcount); new_child->parent = old_child->parent; old_child->parent = NULL; @@ -598,7 +661,7 @@ HRESULT node_clone(xmlnode *This, VARIANT_BOOL deep, IXMLDOMNode **cloneNode) clone = xmlCopyNode(This->node, deep ? 1 : 2); if (clone) { - clone->doc = This->node->doc; + xmlSetTreeDoc(clone, This->node->doc); xmldoc_add_orphan(clone->doc, clone); node = create_node(clone); @@ -836,6 +899,53 @@ HRESULT node_get_xml(xmlnode *This, BOOL ensure_eol, BSTR *ret) return *ret ? S_OK : E_OUTOFMEMORY; } +static void htmldtd_dumpcontent(xmlOutputBufferPtr buf, xmlDocPtr doc) +{ + xmlDtdPtr cur = doc->intSubset; + + xmlOutputBufferWriteString(buf, "name); + if (cur->ExternalID) + { + xmlOutputBufferWriteString(buf, " PUBLIC "); + xmlBufferWriteQuotedString(buf->buffer, cur->ExternalID); + if (cur->SystemID) + { + xmlOutputBufferWriteString(buf, " "); + xmlBufferWriteQuotedString(buf->buffer, cur->SystemID); + } + } + else if (cur->SystemID) + { + xmlOutputBufferWriteString(buf, " SYSTEM "); + xmlBufferWriteQuotedString(buf->buffer, cur->SystemID); + } + xmlOutputBufferWriteString(buf, ">\n"); +} + +static void htmldoc_dumpcontent(xmlOutputBufferPtr buf, xmlDocPtr doc) +{ + xmlElementType type; + + /* force HTML output */ + type = doc->type; + doc->type = XML_HTML_DOCUMENT_NODE; + if (doc->intSubset) + htmldtd_dumpcontent(buf, doc); + if (doc->children) + { + xmlNodePtr cur = doc->children; + + while (cur) + { + htmlNodeDumpFormatOutput(buf, doc, cur, NULL, 1); + cur = cur->next; + } + + } + doc->type = type; +} + HRESULT node_transform_node(const xmlnode *This, IXMLDOMNode *stylesheet, BSTR *p) { #ifdef SONAME_LIBXSLT @@ -863,7 +973,7 @@ HRESULT node_transform_node(const xmlnode *This, IXMLDOMNode *stylesheet, BSTR * xmlOutputBufferPtr output = xmlAllocOutputBuffer(NULL); if (output) { - htmlDocContentDumpOutput(output, result->doc, NULL); + htmldoc_dumpcontent(output, result->doc); content = xmlBufferContent(output->buffer); *p = bstr_from_xmlChar(content); xmlOutputBufferClose(output); @@ -973,17 +1083,36 @@ HRESULT node_get_base_name(xmlnode *This, BSTR *name) return S_OK; } +/* _private field holds a number of COM instances spawned from this libxml2 node */ +static void xmlnode_add_ref(xmlNodePtr node) +{ + if (node->type == XML_DOCUMENT_NODE) return; + InterlockedIncrement((LONG*)&node->_private); +} + +static void xmlnode_release(xmlNodePtr node) +{ + if (node->type == XML_DOCUMENT_NODE) return; + InterlockedDecrement((LONG*)&node->_private); +} + void destroy_xmlnode(xmlnode *This) { if(This->node) + { + xmlnode_release(This->node); xmldoc_release(This->node->doc); + } release_dispex(&This->dispex); } void init_xmlnode(xmlnode *This, xmlNodePtr node, IXMLDOMNode *node_iface, dispex_static_data_t *dispex_data) { if(node) - xmldoc_add_ref( node->doc ); + { + xmlnode_add_ref(node); + xmldoc_add_ref(node->doc); + } This->node = node; This->iface = node_iface; diff --git a/dll/win32/msxml3/nodelist.c b/dll/win32/msxml3/nodelist.c index 6ed73de22d9..994d5b93921 100644 --- a/dll/win32/msxml3/nodelist.c +++ b/dll/win32/msxml3/nodelist.c @@ -341,28 +341,62 @@ static HRESULT xmlnodelist_invoke(IUnknown *iface, DISPID id, LCID lcid, WORD fl TRACE("(%p)->(%x %x %x %p %p %p)\n", This, id, lcid, flags, params, res, ei); - V_VT(res) = VT_DISPATCH; - V_DISPATCH(res) = NULL; - - if (id < DISPID_DOM_COLLECTION_BASE || id > DISPID_DOM_COLLECTION_MAX) - return DISP_E_UNKNOWNNAME; - - switch(flags) + if (id >= DISPID_DOM_COLLECTION_BASE && id <= DISPID_DOM_COLLECTION_MAX) { - case INVOKE_PROPERTYGET: + switch(flags) { - IXMLDOMNode *disp = NULL; + case DISPATCH_PROPERTYGET: + { + IXMLDOMNode *disp = NULL; - IXMLDOMNodeList_get_item(&This->IXMLDOMNodeList_iface, id - DISPID_DOM_COLLECTION_BASE, &disp); - V_DISPATCH(res) = (IDispatch*)disp; - break; - } - default: - { - FIXME("unimplemented flags %x\n", flags); - break; + V_VT(res) = VT_DISPATCH; + IXMLDOMNodeList_get_item(&This->IXMLDOMNodeList_iface, id - DISPID_DOM_COLLECTION_BASE, &disp); + V_DISPATCH(res) = (IDispatch*)disp; + break; + } + default: + { + FIXME("unimplemented flags %x\n", flags); + break; + } } } + else if (id == DISPID_VALUE) + { + switch(flags) + { + case DISPATCH_METHOD|DISPATCH_PROPERTYGET: + case DISPATCH_PROPERTYGET: + case DISPATCH_METHOD: + { + IXMLDOMNode *item; + VARIANT index; + HRESULT hr; + + if (params->cArgs - params->cNamedArgs != 1) return DISP_E_BADPARAMCOUNT; + + VariantInit(&index); + hr = VariantChangeType(&index, params->rgvarg, 0, VT_I4); + if(FAILED(hr)) + { + FIXME("failed to convert arg, %s\n", debugstr_variant(params->rgvarg)); + return hr; + } + + IXMLDOMNodeList_get_item(&This->IXMLDOMNodeList_iface, V_I4(&index), &item); + V_VT(res) = VT_DISPATCH; + V_DISPATCH(res) = (IDispatch*)item; + break; + } + default: + { + FIXME("DISPID_VALUE: unimplemented flags %x\n", flags); + break; + } + } + } + else + return DISP_E_UNKNOWNNAME; TRACE("ret %p\n", V_DISPATCH(res)); diff --git a/dll/win32/msxml3/saxreader.c b/dll/win32/msxml3/saxreader.c index 19d8e69a5fa..9fb17120423 100644 --- a/dll/win32/msxml3/saxreader.c +++ b/dll/win32/msxml3/saxreader.c @@ -171,12 +171,13 @@ enum saxhandler_type SAXContentHandler = 0, SAXDeclHandler, SAXDTDHandler, + SAXEntityResolver, SAXErrorHandler, SAXLexicalHandler, SAXHandler_Last }; -struct saxhandler_iface +struct saxanyhandler_iface { IUnknown *handler; IUnknown *vbhandler; @@ -200,6 +201,23 @@ struct saxlexicalhandler_iface IVBSAXLexicalHandler *vbhandler; }; +struct saxentityresolver_iface +{ + ISAXEntityResolver *handler; + IVBSAXEntityResolver *vbhandler; +}; + +struct saxhandler_iface +{ + union { + struct saxcontenthandler_iface content; + struct saxentityresolver_iface entityresolver; + struct saxerrorhandler_iface error; + struct saxlexicalhandler_iface lexical; + struct saxanyhandler_iface anyhandler; + } u; +}; + typedef struct { DispatchEx dispex; @@ -218,7 +236,7 @@ typedef struct static HRESULT saxreader_put_handler(saxreader *reader, enum saxhandler_type type, void *ptr, BOOL vb) { - struct saxhandler_iface *iface = &reader->saxhandlers[type]; + struct saxanyhandler_iface *iface = &reader->saxhandlers[type].u.anyhandler; IUnknown *unk = (IUnknown*)ptr; if (unk) @@ -237,7 +255,7 @@ static HRESULT saxreader_put_handler(saxreader *reader, enum saxhandler_type typ static HRESULT saxreader_get_handler(const saxreader *reader, enum saxhandler_type type, BOOL vb, void **ret) { - const struct saxhandler_iface *iface = &reader->saxhandlers[type]; + const struct saxanyhandler_iface *iface = &reader->saxhandlers[type].u.anyhandler; if (!ret) return E_POINTER; @@ -256,17 +274,17 @@ static HRESULT saxreader_get_handler(const saxreader *reader, enum saxhandler_ty static struct saxcontenthandler_iface *saxreader_get_contenthandler(saxreader *reader) { - return (struct saxcontenthandler_iface*)&reader->saxhandlers[SAXContentHandler]; + return &reader->saxhandlers[SAXContentHandler].u.content; } static struct saxerrorhandler_iface *saxreader_get_errorhandler(saxreader *reader) { - return (struct saxerrorhandler_iface*)&reader->saxhandlers[SAXErrorHandler]; + return &reader->saxhandlers[SAXErrorHandler].u.error; } static struct saxlexicalhandler_iface *saxreader_get_lexicalhandler(saxreader *reader) { - return (struct saxlexicalhandler_iface*)&reader->saxhandlers[SAXLexicalHandler]; + return &reader->saxhandlers[SAXLexicalHandler].u.lexical; } typedef struct @@ -279,8 +297,8 @@ typedef struct saxreader *saxreader; HRESULT ret; xmlParserCtxtPtr pParserCtxt; - WCHAR *publicId; - WCHAR *systemId; + BSTR publicId; + BSTR systemId; int line; int column; BOOL vbInterface; @@ -330,8 +348,23 @@ static inline saxlocator *impl_from_ISAXAttributes( ISAXAttributes *iface ) static inline int saxreader_has_handler(const saxlocator *locator, enum saxhandler_type type) { - return (locator->vbInterface && locator->saxreader->saxhandlers[type].vbhandler) || - (!locator->vbInterface && locator->saxreader->saxhandlers[type].handler); + struct saxanyhandler_iface *iface = &locator->saxreader->saxhandlers[type].u.anyhandler; + return (locator->vbInterface && iface->vbhandler) || (!locator->vbInterface && iface->handler); +} + +static HRESULT saxreader_saxcharacters(saxlocator *locator, BSTR chars) +{ + struct saxcontenthandler_iface *content = saxreader_get_contenthandler(locator->saxreader); + HRESULT hr; + + if (!saxreader_has_handler(locator, SAXContentHandler)) return S_OK; + + if (locator->vbInterface) + hr = IVBSAXContentHandler_characters(content->vbhandler, &chars); + else + hr = ISAXContentHandler_characters(content->handler, chars, SysStringLen(chars)); + + return hr; } /* property names */ @@ -1550,7 +1583,6 @@ static void libxmlCharacters( int len) { saxlocator *This = ctx; - struct saxcontenthandler_iface *handler = saxreader_get_contenthandler(This->saxreader); BSTR Chars; HRESULT hr; xmlChar *cur, *end; @@ -1609,10 +1641,7 @@ static void libxmlCharacters( } Chars = pooled_bstr_from_xmlCharN(&This->saxreader->pool, cur, end-cur); - if(This->vbInterface) - hr = IVBSAXContentHandler_characters(handler->vbhandler, &Chars); - else - hr = ISAXContentHandler_characters(handler->handler, Chars, SysStringLen(Chars)); + hr = saxreader_saxcharacters(This, Chars); if (sax_callback_failed(This, hr)) { @@ -1745,33 +1774,58 @@ static void libxmlFatalError(void *ctx, const char *msg, ...) This->ret = E_FAIL; } -static void libxmlCDataBlock(void *ctx, const xmlChar *value, int len) +/* The only reason this helper exists is that CDATA section are reported by chunks, + newlines are used as delimiter. More than that, reader even alters input data before reporting. + + This helper should be called for substring with trailing newlines. +*/ +static BSTR saxreader_get_cdata_chunk(const xmlChar *str, int len) { - saxlocator *This = ctx; - struct saxcontenthandler_iface *content = saxreader_get_contenthandler(This->saxreader); - struct saxlexicalhandler_iface *lexical = saxreader_get_lexicalhandler(This->saxreader); - HRESULT hr = S_OK; - xmlChar *beg = (xmlChar*)This->pParserCtxt->input->cur-len; - xmlChar *cur, *end; - int realLen; - BSTR Chars; - BOOL lastEvent = FALSE, change; + BSTR bstr = bstr_from_xmlCharN(str, len), ret; + WCHAR *ptr; - update_position(This, FALSE); - while(beg-9>=This->pParserCtxt->input->base - && memcmp(beg-9, "= bstr) + ptr--; + + while (*++ptr) { - if(*beg=='\n' || (*beg=='\r' && *(beg+1)!='\n')) - This->line--; - beg--; + /* replace returns as: + + - "\r" -> "\n" + - "\r\r" -> "\r" + - "\r\n" -> "\n" + */ + if (*ptr == '\r') + { + if (*(ptr+1) == '\r' || *(ptr+1) == '\n') + { + /* shift tail */ + memmove(ptr, ptr+1, len-- - (ptr-bstr)); + } + else + *ptr = '\n'; + } } - This->column = 0; - for(; beg>=This->pParserCtxt->input->base && *beg!='\n' && *beg!='\r'; beg--) - This->column++; - if (saxreader_has_handler(This, SAXLexicalHandler)) + ret = SysAllocStringLen(bstr, len); + SysFreeString(bstr); + return ret; +} + +static void libxml_cdatablock(void *ctx, const xmlChar *value, int len) +{ + const xmlChar *start, *end; + saxlocator *locator = ctx; + struct saxlexicalhandler_iface *lexical = saxreader_get_lexicalhandler(locator->saxreader); + HRESULT hr = S_OK; + BSTR chars; + int i; + + update_position(locator, FALSE); + if (saxreader_has_handler(locator, SAXLexicalHandler)) { - if (This->vbInterface) + if (locator->vbInterface) hr = IVBSAXLexicalHandler_startCDATA(lexical->vbhandler); else hr = ISAXLexicalHandler_startCDATA(lexical->handler); @@ -1779,61 +1833,66 @@ static void libxmlCDataBlock(void *ctx, const xmlChar *value, int len) if(FAILED(hr)) { - format_error_message_from_id(This, hr); + format_error_message_from_id(locator, hr); return; } - realLen = This->pParserCtxt->input->cur-beg-3; - cur = beg; - end = beg; + start = value; + end = NULL; + i = 0; - while(1) + while (i < len) { - while(end-begsaxreader->pool, cur, end-cur+1); - if (This->vbInterface) - hr = IVBSAXContentHandler_characters(content->vbhandler, &Chars); - else - hr = ISAXContentHandler_characters(content->handler, Chars, SysStringLen(Chars)); - } - - if(change) *end = '\r'; - - if(lastEvent) - break; - - This->column += end-cur+2; - end += 2; - cur = end; + i++; + locator->column++; } - if (saxreader_has_handler(This, SAXLexicalHandler)) + /* no newline chars (or last chunk) report as a whole */ + if (!end && start == value) { - if (This->vbInterface) + /* report */ + chars = bstr_from_xmlCharN(start, len-(start-value)); + TRACE("(%s)\n", debugstr_w(chars)); + hr = saxreader_saxcharacters(locator, chars); + SysFreeString(chars); + } + + if (saxreader_has_handler(locator, SAXLexicalHandler)) + { + if (locator->vbInterface) hr = IVBSAXLexicalHandler_endCDATA(lexical->vbhandler); else hr = ISAXLexicalHandler_endCDATA(lexical->handler); } if(FAILED(hr)) - format_error_message_from_id(This, hr); + format_error_message_from_id(locator, hr); +} - This->column += 4+end-cur; +static xmlParserInputPtr libxmlresolveentity(void *ctx, const xmlChar *publicid, const xmlChar *systemid) +{ + FIXME("entity resolving not implemented, %s, %s\n", publicid, systemid); + return xmlSAX2ResolveEntity(ctx, publicid, systemid); } /*** IVBSAXLocator interface ***/ @@ -2123,7 +2182,7 @@ static HRESULT WINAPI isaxlocator_getPublicId( publicId = bstr_from_xmlChar(xmlSAX2GetPublicId(This->pParserCtxt)); if(SysStringLen(publicId)) - This->publicId = (WCHAR*)&publicId; + This->publicId = publicId; else { SysFreeString(publicId); @@ -2145,7 +2204,7 @@ static HRESULT WINAPI isaxlocator_getSystemId( systemId = bstr_from_xmlChar(xmlSAX2GetSystemId(This->pParserCtxt)); if(SysStringLen(systemId)) - This->systemId = (WCHAR*)&systemId; + This->systemId = systemId; else { SysFreeString(systemId); @@ -2370,24 +2429,6 @@ static HRESULT internal_parseStream(saxreader *This, ISequentialStream *stream, return hr; } -static HRESULT internal_getEntityResolver( - saxreader *This, - void *pEntityResolver, - BOOL vbInterface) -{ - FIXME("(%p)->(%p) stub\n", This, pEntityResolver); - return E_NOTIMPL; -} - -static HRESULT internal_putEntityResolver( - saxreader *This, - void *pEntityResolver, - BOOL vbInterface) -{ - FIXME("(%p)->(%p) stub\n", This, pEntityResolver); - return E_NOTIMPL; -} - static HRESULT internal_parse( saxreader* This, VARIANT varInput, @@ -2737,7 +2778,7 @@ static ULONG WINAPI saxxmlreader_Release( for (i = 0; i < SAXHandler_Last; i++) { - struct saxhandler_iface *iface = &This->saxhandlers[i]; + struct saxanyhandler_iface *iface = &This->saxhandlers[i].u.anyhandler; if (iface->handler) IUnknown_Release(iface->handler); @@ -2870,18 +2911,18 @@ static HRESULT WINAPI saxxmlreader_putProperty( static HRESULT WINAPI saxxmlreader_get_entityResolver( IVBSAXXMLReader* iface, - IVBSAXEntityResolver **pEntityResolver) + IVBSAXEntityResolver **resolver) { saxreader *This = impl_from_IVBSAXXMLReader( iface ); - return internal_getEntityResolver(This, pEntityResolver, TRUE); + return saxreader_get_handler(This, SAXEntityResolver, TRUE, (void**)resolver); } static HRESULT WINAPI saxxmlreader_put_entityResolver( IVBSAXXMLReader* iface, - IVBSAXEntityResolver *pEntityResolver) + IVBSAXEntityResolver *resolver) { saxreader *This = impl_from_IVBSAXXMLReader( iface ); - return internal_putEntityResolver(This, pEntityResolver, TRUE); + return saxreader_put_handler(This, SAXEntityResolver, resolver, TRUE); } static HRESULT WINAPI saxxmlreader_get_contentHandler( @@ -3077,18 +3118,18 @@ static HRESULT WINAPI isaxxmlreader_putProperty( static HRESULT WINAPI isaxxmlreader_getEntityResolver( ISAXXMLReader* iface, - ISAXEntityResolver **ppEntityResolver) + ISAXEntityResolver **resolver) { saxreader *This = impl_from_ISAXXMLReader( iface ); - return internal_getEntityResolver(This, ppEntityResolver, FALSE); + return saxreader_get_handler(This, SAXEntityResolver, FALSE, (void**)resolver); } static HRESULT WINAPI isaxxmlreader_putEntityResolver( ISAXXMLReader* iface, - ISAXEntityResolver *pEntityResolver) + ISAXEntityResolver *resolver) { saxreader *This = impl_from_ISAXXMLReader( iface ); - return internal_putEntityResolver(This, pEntityResolver, FALSE); + return saxreader_put_handler(This, SAXEntityResolver, resolver, FALSE); } static HRESULT WINAPI isaxxmlreader_getContentHandler( @@ -3256,7 +3297,8 @@ HRESULT SAXXMLReader_create(MSXML_VERSION version, IUnknown *outer, LPVOID *ppOb reader->sax.comment = libxmlComment; reader->sax.error = libxmlFatalError; reader->sax.fatalError = libxmlFatalError; - reader->sax.cdataBlock = libxmlCDataBlock; + reader->sax.cdataBlock = libxml_cdatablock; + reader->sax.resolveEntity = libxmlresolveentity; *ppObj = &reader->IVBSAXXMLReader_iface; diff --git a/dll/win32/msxml3/schema.c b/dll/win32/msxml3/schema.c index f0413842e50..f00ba3a3b45 100644 --- a/dll/win32/msxml3/schema.c +++ b/dll/win32/msxml3/schema.c @@ -103,6 +103,9 @@ typedef struct MSXML_VERSION version; xmlHashTablePtr cache; + xmlChar **uris; + int allocated; + int count; VARIANT_BOOL validateOnLoad; int read_only; @@ -116,12 +119,6 @@ typedef struct LONG ref; } cache_entry; -typedef struct -{ - LONG index; - BSTR* out; -} cache_index_data; - /* datatypes lookup stuff * generated with help from gperf */ #define DT_MIN_STR_LEN 2 @@ -744,7 +741,7 @@ void schemasInit(void) return; } buf = LockResource(datatypes_handle); - datatypes_len = SizeofResource(MSXML_hInstance, datatypes_rsrc) - 1; + datatypes_len = SizeofResource(MSXML_hInstance, datatypes_rsrc); /* Resource is loaded as raw data, * need a null-terminated string */ @@ -844,7 +841,7 @@ static BOOL link_datatypes(xmlDocPtr schema) xmlNodePtr root, next, child; xmlNsPtr ns; - assert((void*)xmlGetExternalEntityLoader() == (void*)external_entity_loader); + assert(xmlGetExternalEntityLoader() == external_entity_loader); root = xmlDocGetRootElement(schema); if (!root) return FALSE; @@ -985,6 +982,55 @@ static void cache_free(void* data, xmlChar* name /* ignored */) cache_entry_release((cache_entry*)data); } +/* returns index or -1 if not found */ +static int cache_free_uri(schema_cache *cache, const xmlChar *uri) +{ + int i; + + for (i = 0; i < cache->count; i++) + if (xmlStrEqual(cache->uris[i], uri)) + { + heap_free(cache->uris[i]); + return i; + } + + return -1; +} + +static void cache_add_entry(schema_cache *cache, const xmlChar *uri, cache_entry *entry) +{ + int i; + + /* meaning no entry found with this name */ + if (xmlHashRemoveEntry(cache->cache, uri, cache_free)) + { + if (cache->count == cache->allocated) + { + cache->allocated *= 2; + cache->uris = heap_realloc(cache->uris, cache->allocated*sizeof(xmlChar*)); + } + i = cache->count++; + } + else + i = cache_free_uri(cache, uri); + + cache->uris[i] = heap_strdupxmlChar(uri); + xmlHashAddEntry(cache->cache, uri, entry); +} + +static void cache_remove_entry(schema_cache *cache, const xmlChar *uri) +{ + /* adjust index if entry was really removed */ + if (xmlHashRemoveEntry(cache->cache, uri, cache_free) == 0) + { + int i = cache_free_uri(cache, uri); + if (i == -1) return; + /* shift array */ + if (i != --cache->count) + memmove(&cache->uris[i], &cache->uris[i+1], (cache->count-i)*sizeof(xmlChar*)); + } +} + /* This one adds all namespaces defined in document to a cache, without anything associated with uri obviously. Unfortunately namespace:: axis implementation in libxml2 differs from what we need, @@ -1033,8 +1079,7 @@ HRESULT cache_from_doc_ns(IXMLDOMSchemaCollection2 *iface, xmlnode *node) entry->schema = NULL; entry->doc = NULL; - xmlHashRemoveEntry(This->cache, ns->href, cache_free); - xmlHashAddEntry(This->cache, ns->href, entry); + cache_add_entry(This, ns->href, entry); } pos++; } @@ -1091,6 +1136,11 @@ static ULONG WINAPI schema_cache_Release(IXMLDOMSchemaCollection2* iface) if (ref == 0) { + int i; + + for (i = 0; i < This->count; i++) + heap_free(This->uris[i]); + heap_free(This->uris); xmlHashFree(This->cache, cache_free); release_dispex(&This->dispex); heap_free(This); @@ -1146,7 +1196,7 @@ static HRESULT WINAPI schema_cache_add(IXMLDOMSchemaCollection2* iface, BSTR uri { case VT_NULL: { - xmlHashRemoveEntry(This->cache, name, cache_free); + cache_remove_entry(This, name); } break; @@ -1164,8 +1214,7 @@ static HRESULT WINAPI schema_cache_add(IXMLDOMSchemaCollection2* iface, BSTR uri return E_FAIL; } - xmlHashRemoveEntry(This->cache, name, cache_free); - xmlHashAddEntry(This->cache, name, entry); + cache_add_entry(This, name, entry); } break; @@ -1214,8 +1263,7 @@ static HRESULT WINAPI schema_cache_add(IXMLDOMSchemaCollection2* iface, BSTR uri return E_FAIL; } - xmlHashRemoveEntry(This->cache, name, cache_free); - xmlHashAddEntry(This->cache, name, entry); + cache_add_entry(This, name, entry); } break; @@ -1263,7 +1311,7 @@ static HRESULT WINAPI schema_cache_remove(IXMLDOMSchemaCollection2* iface, BSTR if (This->version == MSXML6) return E_NOTIMPL; - xmlHashRemoveEntry(This->cache, name, cache_free); + cache_remove_entry(This, name); heap_free(name); return S_OK; } @@ -1275,33 +1323,25 @@ static HRESULT WINAPI schema_cache_get_length(IXMLDOMSchemaCollection2* iface, L if (!length) return E_POINTER; - *length = xmlHashSize(This->cache); + + *length = This->count; return S_OK; } -static void cache_index(void* data /* ignored */, void* index, xmlChar* name) -{ - cache_index_data* index_data = (cache_index_data*)index; - - if (index_data->index-- == 0) - *index_data->out = bstr_from_xmlChar(name); -} - static HRESULT WINAPI schema_cache_get_namespaceURI(IXMLDOMSchemaCollection2* iface, - LONG index, BSTR* len) + LONG index, BSTR* uri) { schema_cache* This = impl_from_IXMLDOMSchemaCollection2(iface); - cache_index_data data = {index, len}; - TRACE("(%p)->(%i %p)\n", This, index, len); - if (!len) + TRACE("(%p)->(%i %p)\n", This, index, uri); + + if (!uri) return E_POINTER; - if (index >= xmlHashSize(This->cache)) + if (index >= This->count) return E_FAIL; - *len = NULL; - xmlHashScan(This->cache, cache_index, &data); + *uri = bstr_from_xmlChar(This->uris[index]); return S_OK; } @@ -1313,7 +1353,7 @@ static void cache_copy(void* data, void* dest, xmlChar* name) if (xmlHashLookup(This->cache, name) == NULL) { cache_entry_add_ref(entry); - xmlHashAddEntry(This->cache, name, entry); + cache_add_entry(This, name, entry); } } @@ -1531,6 +1571,9 @@ HRESULT SchemaCache_create(MSXML_VERSION version, IUnknown* outer, void** obj) This->IXMLDOMSchemaCollection2_iface.lpVtbl = &XMLDOMSchemaCollection2Vtbl; This->cache = xmlHashCreate(DEFAULT_HASHTABLE_SIZE); + This->allocated = 10; + This->count = 0; + This->uris = heap_alloc(This->allocated*sizeof(xmlChar*)); This->ref = 1; This->version = version; This->validateOnLoad = VARIANT_TRUE; diff --git a/dll/win32/msxml3/text.c b/dll/win32/msxml3/text.c index dd761342ed6..efc79e547e1 100644 --- a/dll/win32/msxml3/text.c +++ b/dll/win32/msxml3/text.c @@ -29,6 +29,7 @@ //#include #ifdef HAVE_LIBXML2 # include +# include //# include #endif @@ -58,6 +59,11 @@ static inline domtext *impl_from_IXMLDOMText( IXMLDOMText *iface ) return CONTAINING_RECORD(iface, domtext, IXMLDOMText_iface); } +static void domtext_reset_noenc(domtext *This) +{ + This->node.node->name = NULL; +} + static HRESULT WINAPI domtext_QueryInterface( IXMLDOMText *iface, REFIID riid, @@ -185,6 +191,7 @@ static HRESULT WINAPI domtext_put_nodeValue( TRACE("(%p)->(%s)\n", This, debugstr_variant(&value)); + domtext_reset_noenc(This); return node_put_value(&This->node, &value); } @@ -374,6 +381,7 @@ static HRESULT WINAPI domtext_put_text( { domtext *This = impl_from_IXMLDOMText( iface ); TRACE("(%p)->(%s)\n", This, debugstr_w(p)); + domtext_reset_noenc(This); return node_put_text( &This->node, p ); } @@ -611,7 +619,14 @@ static HRESULT WINAPI domtext_put_data( BSTR data) { domtext *This = impl_from_IXMLDOMText( iface ); + static WCHAR rnW[] = {'\r','\n',0}; + TRACE("(%p)->(%s)\n", This, debugstr_w(data)); + + if (data && !strcmpW(rnW, data)) + This->node.node->name = xmlStringTextNoenc; + else + domtext_reset_noenc(This); return node_set_content(&This->node, data); } diff --git a/dll/win32/msxml3/xmlparser.c b/dll/win32/msxml3/xmlparser.c index 9a500e58c27..7807ea1b309 100644 --- a/dll/win32/msxml3/xmlparser.c +++ b/dll/win32/msxml3/xmlparser.c @@ -49,6 +49,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml); typedef struct _xmlparser { IXMLParser IXMLParser_iface; + IXMLNodeFactory *nodefactory; + IUnknown *input; LONG ref; int flags; @@ -98,6 +100,12 @@ static ULONG WINAPI xmlparser_Release(IXMLParser* iface) TRACE("(%p)->(%d)\n", This, ref); if ( ref == 0 ) { + if(This->input) + IUnknown_Release(This->input); + + if(This->nodefactory) + IXMLNodeFactory_Release(This->nodefactory); + heap_free( This ); } @@ -109,18 +117,33 @@ static HRESULT WINAPI xmlparser_SetFactory(IXMLParser *iface, IXMLNodeFactory *p { xmlparser *This = impl_from_IXMLParser( iface ); - FIXME("(%p %p)\n", This, pNodeFactory); + TRACE("(%p %p)\n", This, pNodeFactory); - return E_NOTIMPL; + if(This->nodefactory) + IXMLNodeFactory_Release(This->nodefactory); + + This->nodefactory = pNodeFactory; + if(This->nodefactory) + IXMLNodeFactory_AddRef(This->nodefactory); + + return S_OK; } static HRESULT WINAPI xmlparser_GetFactory(IXMLParser *iface, IXMLNodeFactory **ppNodeFactory) { xmlparser *This = impl_from_IXMLParser( iface ); - FIXME("(%p, %p)\n", This, ppNodeFactory); + TRACE("(%p, %p)\n", This, ppNodeFactory); - return E_NOTIMPL; + if(!ppNodeFactory) + return E_INVALIDARG; + + *ppNodeFactory = This->nodefactory; + + if(*ppNodeFactory) + IXMLNodeFactory_AddRef(*ppNodeFactory); + + return S_OK; } static HRESULT WINAPI xmlparser_Abort(IXMLParser *iface, BSTR bstrErrorInfo) @@ -230,9 +253,18 @@ static HRESULT WINAPI xmlparser_SetInput(IXMLParser *iface, IUnknown *pStm) { xmlparser *This = impl_from_IXMLParser( iface ); - FIXME("(%p %p)\n", This, pStm); + TRACE("(%p %p)\n", This, pStm); - return E_NOTIMPL; + if(!pStm) + return E_INVALIDARG; + + if(This->input) + IUnknown_Release(This->input); + + This->input = pStm; + IUnknown_AddRef(This->input); + + return S_OK; } static HRESULT WINAPI xmlparser_PushData(IXMLParser *iface, const char *pData, @@ -418,6 +450,8 @@ HRESULT XMLParser_create(IUnknown* pUnkOuter, void**ppObj) return E_OUTOFMEMORY; This->IXMLParser_iface.lpVtbl = &xmlparser_vtbl; + This->nodefactory = NULL; + This->input = NULL; This->flags = 0; This->ref = 1; diff --git a/dll/win32/msxml3/xslpattern.l b/dll/win32/msxml3/xslpattern.l index eb84e40bc79..bda383602cf 100644 --- a/dll/win32/msxml3/xslpattern.l +++ b/dll/win32/msxml3/xslpattern.l @@ -58,7 +58,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml); %option reentrant bison-bridge %option noyywrap %option prefix="xslpattern_" -%option noinput nounput +%option noinput nounput never-interactive /* From the w3c XML standard * */ diff --git a/dll/win32/msxml3/xslpattern.yy.c b/dll/win32/msxml3/xslpattern.yy.c index 489a47474e5..f61ced65b8a 100644 --- a/dll/win32/msxml3/xslpattern.yy.c +++ b/dll/win32/msxml3/xslpattern.yy.c @@ -872,16 +872,12 @@ yy_match: yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 138 ); + while ( yy_current_state != 95 ); + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; yy_find_action: yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - yy_act = yy_accept[yy_current_state]; - } YY_DO_BEFORE_ACTION; @@ -1088,7 +1084,7 @@ YY_RULE_SETUP #line 153 "xslpattern.l" ECHO; YY_BREAK -#line 1092 "xslpattern.yy.c" +#line 1088 "xslpattern.yy.c" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -1155,7 +1151,8 @@ case YY_STATE_EOF(INITIAL): else { - yy_cp = yyg->yy_c_buf_p; + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; goto yy_find_action; } } @@ -1609,10 +1606,6 @@ static void xslpattern__load_buffer_state (yyscan_t yyscanner) xslpattern_free((void *) b ,yyscanner ); } -#ifndef __cplusplus -extern int isatty (int ); -#endif /* __cplusplus */ - /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a xslpattern_restart() or at EOF. @@ -1637,7 +1630,7 @@ extern int isatty (int ); b->yy_bs_column = 0; } - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + b->yy_is_interactive = 0; errno = oerrno; } diff --git a/dll/win32/netcfgx/lang/ja-JP.rc b/dll/win32/netcfgx/lang/ja-JP.rc index a0785a6c6e7..567846f1dbc 100644 --- a/dll/win32/netcfgx/lang/ja-JP.rc +++ b/dll/win32/netcfgx/lang/ja-JP.rc @@ -5,7 +5,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "全般" FONT 9, "MS UI Gothic" BEGIN - LTEXT "ネットワークでこの機能 がサポートされている場合は、IP 設定を自動的に取得することができます。サポートされていない場合は、ネットワーク管理者に適切な IP 設定を問い合わせてください。", -1, 9, 9, 228, 27 + LTEXT "ネットワークでこの機能がサポートされている場合は、IP 設定を自動的に取得することができます。サポートされていない場合は、ネットワーク管理者に適切な IP 設定を問い合わせてください。", -1, 9, 9, 228, 27 CONTROL "IP アドレスを自動的に取得する", IDC_USEDHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP, 14, 43, 210, 12 GROUPBOX "", -1, 9, 61, 228, 70, BS_GROUPBOX CONTROL "次の IP アドレスを使う(&U):", IDC_NODHCP, "BUTTON", BS_AUTORADIOBUTTON, 14, 59, 105, 12 diff --git a/dll/win32/netid/lang/ja-JP.rc b/dll/win32/netid/lang/ja-JP.rc index 5af13ab938a..7aa1923efb1 100644 --- a/dll/win32/netid/lang/ja-JP.rc +++ b/dll/win32/netid/lang/ja-JP.rc @@ -67,7 +67,7 @@ BEGIN 22 "%1 ワークグループへようこそ。" 23 "%1 ドメインへようこそ。" 24 "変更を有効にするには、コンピュータを再起動してください。" - 25 "このコンピュータの名前とメンバシップを変更できます。変更するとネットワーク リソ ースへのアクセスに影響する可能 性があります。" + 25 "このコンピュータの名前とメンバシップを変更できます。変更するとネットワーク リソースへのアクセスに影響する可能性があります。" 1021 "注意: このコンピュータの ID を変更できるのは管理者のみです。" 1022 "注意: 次の理由により、このコンピュータの ID を変更できません:" 1030 "新しいコンピュータ名 ""%s"" には、使用できないな文字が含まれています。使用できない文字は ` ~ ! @ # $ %% ^ & * ( ) = + _ [ ] { } \\ | ; : ' "" , . < > / ? です。" diff --git a/dll/win32/newdev/lang/ja-JP.rc b/dll/win32/newdev/lang/ja-JP.rc index 7b625783bf5..f9849dd38e5 100644 --- a/dll/win32/newdev/lang/ja-JP.rc +++ b/dll/win32/newdev/lang/ja-JP.rc @@ -11,7 +11,7 @@ BEGIN IDC_STATIC,120,21,195,30 LTEXT "続行するには、[次へ] をクリックしてください。",IDC_STATIC,120,169,195,17 LTEXT "不明なデバイス",IDC_DEVICE,134,52,164,11 - LTEXT "警告! カスタム デバイスをインストールすると、コンピュータがフリーズしたり、起動不能 になる可能 性があります!",IDC_STATIC,120,67,195,34 + LTEXT "警告! カスタム デバイスをインストールすると、コンピュータがフリーズしたり、起動不能になる可能性があります!",IDC_STATIC,120,67,195,34 CONTROL "ドライバを自動的にインストールする",IDC_RADIO_AUTO,"Button", BS_AUTORADIOBUTTON,120,112,178,13 CONTROL "ドライバを特定の場所からインストールする",IDC_RADIO_MANUAL, @@ -29,7 +29,7 @@ BEGIN IDC_STATIC,120,40,195,19 LTEXT "ドライバのディスクを持っていたり、ドライバへのパスを知っている場合は、[戻る] をクリックしてください。", IDC_STATIC,120,98,181,24 - CONTROL "このダイアログを今後表 示しない",IDC_DONOTSHOWDLG,"Button", + CONTROL "このダイアログを今後表示しない",IDC_DONOTSHOWDLG,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,120,170,180,11 END @@ -40,7 +40,7 @@ CAPTION "デバイスのインストール" FONT 9, "MS UI Gothic" BEGIN LTEXT "インストール失敗",IDC_FINISHTITLE,120,8,195,24 - LTEXT "予 期せぬエラーが発生したため、デバイスはインストールされませんでした。", + LTEXT "予期せぬエラーが発生したため、デバイスはインストールされませんでした。", IDC_STATIC,120,40,195,19 LTEXT "不明なデバイス",IDC_DEVICE,134,55,164,11 END diff --git a/dll/win32/newdev/wizard.c b/dll/win32/newdev/wizard.c index 658d71da5af..44813f71649 100644 --- a/dll/win32/newdev/wizard.c +++ b/dll/win32/newdev/wizard.c @@ -493,7 +493,7 @@ WelcomeDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static void @@ -656,7 +656,7 @@ CHSourceDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static INT_PTR CALLBACK @@ -751,7 +751,7 @@ SearchDrvDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static INT_PTR CALLBACK @@ -857,7 +857,7 @@ InstallDrvDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static INT_PTR CALLBACK @@ -972,7 +972,7 @@ NoDriverDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static INT_PTR CALLBACK @@ -1051,7 +1051,7 @@ InstallFailedDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static INT_PTR CALLBACK @@ -1130,7 +1130,7 @@ NeedRebootDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static INT_PTR CALLBACK @@ -1209,7 +1209,7 @@ FinishDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static HFONT diff --git a/dll/win32/ole32/compobj.c b/dll/win32/ole32/compobj.c index f23468409bb..4b3ae49f566 100644 --- a/dll/win32/ole32/compobj.c +++ b/dll/win32/ole32/compobj.c @@ -818,14 +818,17 @@ static void apartment_freeunusedlibraries(struct apartment *apt, DWORD delay) real_delay = 0; } - if (!real_delay || (entry->unload_time && (entry->unload_time < GetTickCount()))) + if (!real_delay || (entry->unload_time && ((int)(GetTickCount() - entry->unload_time) > 0))) { list_remove(&entry->entry); COMPOBJ_DllList_ReleaseRef(entry->dll, TRUE); HeapFree(GetProcessHeap(), 0, entry); } else + { entry->unload_time = GetTickCount() + real_delay; + if (!entry->unload_time) entry->unload_time = 1; + } } else if (entry->unload_time) entry->unload_time = 0; @@ -2035,8 +2038,11 @@ HRESULT WINAPI ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *ppszProgID) *ppszProgID = CoTaskMemAlloc(progidlen * sizeof(WCHAR)); if (*ppszProgID) { - if (RegQueryValueW(hkey, NULL, *ppszProgID, &progidlen)) + if (RegQueryValueW(hkey, NULL, *ppszProgID, &progidlen)) { ret = REGDB_E_CLASSNOTREG; + CoTaskMemFree(*ppszProgID); + *ppszProgID = NULL; + } } else ret = E_OUTOFMEMORY; @@ -2732,83 +2738,82 @@ HRESULT WINAPI CoResumeClassObjects(void) * CoGetClassObject() */ HRESULT WINAPI CoCreateInstance( - REFCLSID rclsid, - LPUNKNOWN pUnkOuter, - DWORD dwClsContext, - REFIID iid, - LPVOID *ppv) + REFCLSID rclsid, + LPUNKNOWN pUnkOuter, + DWORD dwClsContext, + REFIID iid, + LPVOID *ppv) { - HRESULT hres; - LPCLASSFACTORY lpclf = 0; - APARTMENT *apt; + HRESULT hres; + LPCLASSFACTORY lpclf = 0; + APARTMENT *apt; - TRACE("(rclsid=%s, pUnkOuter=%p, dwClsContext=%08x, riid=%s, ppv=%p)\n", debugstr_guid(rclsid), - pUnkOuter, dwClsContext, debugstr_guid(iid), ppv); + TRACE("(rclsid=%s, pUnkOuter=%p, dwClsContext=%08x, riid=%s, ppv=%p)\n", debugstr_guid(rclsid), + pUnkOuter, dwClsContext, debugstr_guid(iid), ppv); - /* - * Sanity check - */ - if (ppv==0) - return E_POINTER; + if (ppv==0) + return E_POINTER; - /* - * Initialize the "out" parameter - */ - *ppv = 0; + *ppv = 0; - if (!(apt = COM_CurrentApt())) - { - if (!(apt = apartment_find_multi_threaded())) + if (!(apt = COM_CurrentApt())) { - ERR("apartment not initialised\n"); - return CO_E_NOTINITIALIZED; - } - apartment_release(apt); - } - - /* - * The Standard Global Interface Table (GIT) object is a process-wide singleton. - * Rather than create a class factory, we can just check for it here - */ - if (IsEqualIID(rclsid, &CLSID_StdGlobalInterfaceTable)) { - if (StdGlobalInterfaceTableInstance == NULL) - StdGlobalInterfaceTableInstance = StdGlobalInterfaceTable_Construct(); - hres = IGlobalInterfaceTable_QueryInterface( (IGlobalInterfaceTable*) StdGlobalInterfaceTableInstance, iid, ppv); - if (hres) return hres; - - TRACE("Retrieved GIT (%p)\n", *ppv); - return S_OK; - } - - if (IsEqualCLSID(rclsid, &CLSID_ManualResetEvent)) - return ManualResetEvent_Construct(pUnkOuter, iid, ppv); - - /* - * Get a class factory to construct the object we want. - */ - hres = CoGetClassObject(rclsid, - dwClsContext, - NULL, - &IID_IClassFactory, - (LPVOID)&lpclf); - - if (FAILED(hres)) - return hres; - - /* - * Create the object and don't forget to release the factory - */ - hres = IClassFactory_CreateInstance(lpclf, pUnkOuter, iid, ppv); - IClassFactory_Release(lpclf); - if(FAILED(hres)) + if (!(apt = apartment_find_multi_threaded())) { - if (hres == CLASS_E_NOAGGREGATION && pUnkOuter) - FIXME("Class %s does not support aggregation\n", debugstr_guid(rclsid)); - else - FIXME("no instance created for interface %s of class %s, hres is 0x%08x\n", debugstr_guid(iid), debugstr_guid(rclsid),hres); + ERR("apartment not initialised\n"); + return CO_E_NOTINITIALIZED; } + apartment_release(apt); + } - return hres; + /* + * The Standard Global Interface Table (GIT) object is a process-wide singleton. + * Rather than create a class factory, we can just check for it here + */ + if (IsEqualIID(rclsid, &CLSID_StdGlobalInterfaceTable)) + { + if (StdGlobalInterfaceTableInstance == NULL) + StdGlobalInterfaceTableInstance = StdGlobalInterfaceTable_Construct(); + hres = IGlobalInterfaceTable_QueryInterface((IGlobalInterfaceTable*)StdGlobalInterfaceTableInstance, + iid, + ppv); + if (hres) return hres; + + TRACE("Retrieved GIT (%p)\n", *ppv); + return S_OK; + } + + if (IsEqualCLSID(rclsid, &CLSID_ManualResetEvent)) + return ManualResetEvent_Construct(pUnkOuter, iid, ppv); + + /* + * Get a class factory to construct the object we want. + */ + hres = CoGetClassObject(rclsid, + dwClsContext, + NULL, + &IID_IClassFactory, + (LPVOID)&lpclf); + + if (FAILED(hres)) + return hres; + + /* + * Create the object and don't forget to release the factory + */ + hres = IClassFactory_CreateInstance(lpclf, pUnkOuter, iid, ppv); + IClassFactory_Release(lpclf); + if (FAILED(hres)) + { + if (hres == CLASS_E_NOAGGREGATION && pUnkOuter) + FIXME("Class %s does not support aggregation\n", debugstr_guid(rclsid)); + else + FIXME("no instance created for interface %s of class %s, hres is 0x%08x\n", + debugstr_guid(iid), + debugstr_guid(rclsid),hres); + } + + return hres; } /*********************************************************************** @@ -3876,6 +3881,7 @@ HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout, if (res == WAIT_OBJECT_0 + cHandles) /* messages available */ { MSG msg; + int count = 0; /* call message filter */ @@ -3905,7 +3911,9 @@ HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout, } } - while (COM_PeekMessage(apt, &msg)) + /* some apps (e.g. Visio 2010) don't handle WM_PAINT properly and loop forever, + * so after processing 100 messages we go back to checking the wait handles */ + while (count++ < 100 && COM_PeekMessage(apt, &msg)) { TRACE("received message whilst waiting for RPC: 0x%04x\n", msg.message); TranslateMessage(&msg); diff --git a/dll/win32/ole32/compositemoniker.c b/dll/win32/ole32/compositemoniker.c index 8088d953976..a010e4fa7ff 100644 --- a/dll/win32/ole32/compositemoniker.c +++ b/dll/win32/ole32/compositemoniker.c @@ -1641,10 +1641,10 @@ static const IEnumMonikerVtbl VT_EnumMonikerImpl = ******************************************************************************/ static HRESULT EnumMonikerImpl_CreateEnumMoniker(IMoniker** tabMoniker, ULONG tabSize, - ULONG currentPos, BOOL leftToRigth, IEnumMoniker ** ppmk) + ULONG currentPos, BOOL leftToRight, IEnumMoniker ** ppmk) { EnumMonikerImpl* newEnumMoniker; - int i; + ULONG i; if (currentPos > tabSize) return E_INVALIDARG; @@ -1668,17 +1668,17 @@ EnumMonikerImpl_CreateEnumMoniker(IMoniker** tabMoniker, ULONG tabSize, return E_OUTOFMEMORY; } - if (leftToRigth) + if (leftToRight) for (i=0;itabMoniker[i]=tabMoniker[i]; IMoniker_AddRef(tabMoniker[i]); } else - for (i=tabSize-1;i>=0;i--){ + for (i = tabSize; i > 0; i--){ - newEnumMoniker->tabMoniker[tabSize-i-1]=tabMoniker[i]; - IMoniker_AddRef(tabMoniker[i]); + newEnumMoniker->tabMoniker[tabSize-i]=tabMoniker[i - 1]; + IMoniker_AddRef(tabMoniker[i - 1]); } *ppmk=&newEnumMoniker->IEnumMoniker_iface; diff --git a/dll/win32/ole32/defaulthandler.c b/dll/win32/ole32/defaulthandler.c index 0b3db7ad50b..f1ca02b91ff 100644 --- a/dll/win32/ole32/defaulthandler.c +++ b/dll/win32/ole32/defaulthandler.c @@ -1325,7 +1325,7 @@ static HRESULT WINAPI DefaultHandler_Run( release_delegates(This); - hr = CoCreateInstance(&This->clsid, NULL, CLSCTX_ALL, + hr = CoCreateInstance(&This->clsid, NULL, CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, &IID_IOleObject, (void **)&This->pOleDelegate); if (FAILED(hr)) return hr; diff --git a/dll/win32/ole32/moniker.c b/dll/win32/ole32/moniker.c index 4e3d46c5c66..9de947caf4b 100644 --- a/dll/win32/ole32/moniker.c +++ b/dll/win32/ole32/moniker.c @@ -149,7 +149,7 @@ static BOOL start_rpcss(void) strcatW( cmd, rpcss ); Wow64DisableWow64FsRedirection( &redir ); - rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); + rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi ); Wow64RevertWow64FsRedirection( redir ); if (rslt) diff --git a/dll/win32/ole32/ole2.c b/dll/win32/ole32/ole2.c index 851bbeae3fa..70da8a461db 100644 --- a/dll/win32/ole32/ole2.c +++ b/dll/win32/ole32/ole2.c @@ -1880,11 +1880,11 @@ HOLEMENU WINAPI OleCreateMenuDescriptor( * Destroy the shared menu descriptor */ HRESULT WINAPI OleDestroyMenuDescriptor( - HOLEMENU hmenuDescriptor) + HOLEMENU hmenuDescriptor) { - if ( hmenuDescriptor ) - GlobalFree( hmenuDescriptor ); - return S_OK; + if ( hmenuDescriptor ) + GlobalFree( hmenuDescriptor ); + return S_OK; } /*********************************************************************** @@ -1908,72 +1908,73 @@ HRESULT WINAPI OleDestroyMenuDescriptor( * these are non null. */ HRESULT WINAPI OleSetMenuDescriptor( - HOLEMENU hOleMenu, - HWND hwndFrame, - HWND hwndActiveObject, - LPOLEINPLACEFRAME lpFrame, - LPOLEINPLACEACTIVEOBJECT lpActiveObject) + HOLEMENU hOleMenu, + HWND hwndFrame, + HWND hwndActiveObject, + LPOLEINPLACEFRAME lpFrame, + LPOLEINPLACEACTIVEOBJECT lpActiveObject) { - OleMenuDescriptor *pOleMenuDescriptor = NULL; + OleMenuDescriptor *pOleMenuDescriptor = NULL; - /* Check args */ - if ( !hwndFrame || (hOleMenu && !hwndActiveObject) ) - return E_INVALIDARG; + /* Check args */ + if ( !hwndFrame || (hOleMenu && !hwndActiveObject) ) + return E_INVALIDARG; - if ( lpFrame || lpActiveObject ) - { - FIXME("(%p, %p, %p, %p, %p), Context sensitive help filtering not implemented!\n", - hOleMenu, - hwndFrame, - hwndActiveObject, - lpFrame, - lpActiveObject); - } + if ( lpFrame || lpActiveObject ) + { + FIXME("(%p, %p, %p, %p, %p), Context sensitive help filtering not implemented!\n", + hOleMenu, + hwndFrame, + hwndActiveObject, + lpFrame, + lpActiveObject); + } - /* Set up a message hook to intercept the containers frame window messages. - * The message filter is responsible for dispatching menu messages from the - * shared menu which are intended for the object. - */ + /* Set up a message hook to intercept the containers frame window messages. + * The message filter is responsible for dispatching menu messages from the + * shared menu which are intended for the object. + */ - if ( hOleMenu ) /* Want to install dispatching code */ - { - /* If OLEMenu hooks are already installed for this thread, fail - * Note: This effectively means that OleSetMenuDescriptor cannot - * be called twice in succession on the same frame window - * without first calling it with a null hOleMenu to uninstall */ - if ( OLEMenu_IsHookInstalled( GetCurrentThreadId() ) ) - return E_FAIL; + if ( hOleMenu ) /* Want to install dispatching code */ + { + /* If OLEMenu hooks are already installed for this thread, fail + * Note: This effectively means that OleSetMenuDescriptor cannot + * be called twice in succession on the same frame window + * without first calling it with a null hOleMenu to uninstall + */ + if ( OLEMenu_IsHookInstalled( GetCurrentThreadId() ) ) + return E_FAIL; - /* Get the menu descriptor */ - pOleMenuDescriptor = GlobalLock( hOleMenu ); - if ( !pOleMenuDescriptor ) - return E_UNEXPECTED; + /* Get the menu descriptor */ + pOleMenuDescriptor = GlobalLock( hOleMenu ); + if ( !pOleMenuDescriptor ) + return E_UNEXPECTED; - /* Update the menu descriptor */ - pOleMenuDescriptor->hwndFrame = hwndFrame; - pOleMenuDescriptor->hwndActiveObject = hwndActiveObject; + /* Update the menu descriptor */ + pOleMenuDescriptor->hwndFrame = hwndFrame; + pOleMenuDescriptor->hwndActiveObject = hwndActiveObject; - GlobalUnlock( hOleMenu ); - pOleMenuDescriptor = NULL; + GlobalUnlock( hOleMenu ); + pOleMenuDescriptor = NULL; - /* Add a menu descriptor windows property to the frame window */ - SetPropW( hwndFrame, prop_olemenuW, hOleMenu ); + /* Add a menu descriptor windows property to the frame window */ + SetPropW( hwndFrame, prop_olemenuW, hOleMenu ); - /* Install thread scope message hooks for WH_GETMESSAGE and WH_CALLWNDPROC */ - if ( !OLEMenu_InstallHooks( GetCurrentThreadId() ) ) - return E_FAIL; - } - else /* Want to uninstall dispatching code */ - { - /* Uninstall the hooks */ - if ( !OLEMenu_UnInstallHooks( GetCurrentThreadId() ) ) - return E_FAIL; + /* Install thread scope message hooks for WH_GETMESSAGE and WH_CALLWNDPROC */ + if ( !OLEMenu_InstallHooks( GetCurrentThreadId() ) ) + return E_FAIL; + } + else /* Want to uninstall dispatching code */ + { + /* Uninstall the hooks */ + if ( !OLEMenu_UnInstallHooks( GetCurrentThreadId() ) ) + return E_FAIL; - /* Remove the menu descriptor property from the frame window */ - RemovePropW( hwndFrame, prop_olemenuW ); - } + /* Remove the menu descriptor property from the frame window */ + RemovePropW( hwndFrame, prop_olemenuW ); + } - return S_OK; + return S_OK; } /****************************************************************************** diff --git a/dll/win32/ole32/pointermoniker.c b/dll/win32/ole32/pointermoniker.c index 436d6e25edd..2a0a80d3e7f 100644 --- a/dll/win32/ole32/pointermoniker.c +++ b/dll/win32/ole32/pointermoniker.c @@ -632,7 +632,7 @@ static HRESULT WINAPI PointerMonikerCF_CreateInstance(LPCLASSFACTORY iface, if (FAILED(hr)) return hr; - hr = IMoniker_QueryInterface(pMoniker, riid, ppv); + hr = IMoniker_QueryInterface(pMoniker, riid, ppv); if (FAILED(hr)) IMoniker_Release(pMoniker); diff --git a/dll/win32/ole32/rpc.c b/dll/win32/ole32/rpc.c index 238bfbba1b5..5839d0df1ed 100644 --- a/dll/win32/ole32/rpc.c +++ b/dll/win32/ole32/rpc.c @@ -1683,7 +1683,7 @@ static HRESULT create_server(REFCLSID rclsid, HANDLE *process) /* FIXME: Win2003 supports a ServerExecutable value that is passed into * CreateProcess */ - if (!CreateProcessW(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)) { + if (!CreateProcessW(NULL, command, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &sinfo, &pinfo)) { WARN("failed to run local server %s\n", debugstr_w(command)); return HRESULT_FROM_WIN32(GetLastError()); } @@ -1880,7 +1880,7 @@ struct local_server_params { CLSID clsid; IStream *stream; - HANDLE ready_event; + HANDLE pipe; HANDLE stop_event; HANDLE thread; BOOL multi_use; @@ -1901,7 +1901,7 @@ static DWORD WINAPI local_server_thread(LPVOID param) ULONG res; BOOL multi_use = lsp->multi_use; OVERLAPPED ovl; - HANDLE pipe_event, hPipe, new_pipe; + HANDLE pipe_event, hPipe = lsp->pipe, new_pipe; DWORD bytes; TRACE("Starting threader for %s.\n",debugstr_guid(&lsp->clsid)); @@ -1910,18 +1910,6 @@ static DWORD WINAPI local_server_thread(LPVOID param) get_localserver_pipe_name(pipefn, &lsp->clsid); ovl.hEvent = pipe_event = CreateEventW(NULL, FALSE, FALSE, NULL); - hPipe = CreateNamedPipeW( pipefn, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, - PIPE_TYPE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, - 4096, 4096, 500 /* 0.5 second timeout */, NULL ); - if (hPipe == INVALID_HANDLE_VALUE) - { - FIXME("pipe creation failed for %s, le is %u\n", debugstr_w(pipefn), GetLastError()); - CloseHandle(pipe_event); - return 1; - } - - SetEvent(lsp->ready_event); - while (1) { if (!ConnectNamedPipe(hPipe, &ovl)) { @@ -2011,8 +1999,9 @@ static DWORD WINAPI local_server_thread(LPVOID param) /* starts listening for a local server */ HRESULT RPC_StartLocalServer(REFCLSID clsid, IStream *stream, BOOL multi_use, void **registration) { - DWORD tid; + DWORD tid, err; struct local_server_params *lsp; + WCHAR pipefn[100]; lsp = HeapAlloc(GetProcessHeap(), 0, sizeof(*lsp)); if (!lsp) @@ -2021,34 +2010,36 @@ HRESULT RPC_StartLocalServer(REFCLSID clsid, IStream *stream, BOOL multi_use, vo lsp->clsid = *clsid; lsp->stream = stream; IStream_AddRef(stream); - lsp->ready_event = CreateEventW(NULL, FALSE, FALSE, NULL); - if (!lsp->ready_event) - { - HeapFree(GetProcessHeap(), 0, lsp); - return HRESULT_FROM_WIN32(GetLastError()); - } lsp->stop_event = CreateEventW(NULL, FALSE, FALSE, NULL); if (!lsp->stop_event) { - CloseHandle(lsp->ready_event); HeapFree(GetProcessHeap(), 0, lsp); return HRESULT_FROM_WIN32(GetLastError()); } lsp->multi_use = multi_use; + get_localserver_pipe_name(pipefn, &lsp->clsid); + lsp->pipe = CreateNamedPipeW(pipefn, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, + 4096, 4096, 500 /* 0.5 second timeout */, NULL); + if (lsp->pipe == INVALID_HANDLE_VALUE) + { + err = GetLastError(); + FIXME("pipe creation failed for %s, le is %u\n", debugstr_w(pipefn), GetLastError()); + CloseHandle(lsp->stop_event); + HeapFree(GetProcessHeap(), 0, lsp); + return HRESULT_FROM_WIN32(err); + } + lsp->thread = CreateThread(NULL, 0, local_server_thread, lsp, 0, &tid); if (!lsp->thread) { - CloseHandle(lsp->ready_event); + CloseHandle(lsp->pipe); CloseHandle(lsp->stop_event); HeapFree(GetProcessHeap(), 0, lsp); return HRESULT_FROM_WIN32(GetLastError()); } - WaitForSingleObject(lsp->ready_event, INFINITE); - CloseHandle(lsp->ready_event); - lsp->ready_event = NULL; - *registration = lsp; return S_OK; } diff --git a/dll/win32/ole32/storage32.c b/dll/win32/ole32/storage32.c index 69a7f8c8e08..a3c7435c02a 100644 --- a/dll/win32/ole32/storage32.c +++ b/dll/win32/ole32/storage32.c @@ -1767,7 +1767,7 @@ static HRESULT WINAPI StorageBaseImpl_CopyTo( StorageBaseImpl *This = impl_from_IStorage(iface); BOOL skip_storage = FALSE, skip_stream = FALSE; - int i; + DWORD i; TRACE("(%p, %d, %p, %p, %p)\n", iface, ciidExclude, rgiidExclude, @@ -2822,7 +2822,7 @@ static HRESULT StorageImpl_Construct( { ULONG current_block = This->extBigBlockDepotStart; ULONG cache_size = This->extBigBlockDepotCount * 2; - int i; + ULONG i; This->extBigBlockDepotLocations = HeapAlloc(GetProcessHeap(), 0, sizeof(ULONG) * cache_size); if (!This->extBigBlockDepotLocations) diff --git a/dll/win32/ole32/usrmarshal.c b/dll/win32/ole32/usrmarshal.c index b8ec9897b50..0c61b4f2324 100644 --- a/dll/win32/ole32/usrmarshal.c +++ b/dll/win32/ole32/usrmarshal.c @@ -2360,8 +2360,8 @@ HRESULT CALLBACK IMoniker_BindToStorage_Proxy( REFIID riid, void **ppvObj) { - FIXME(":stub\n"); - return E_NOTIMPL; + TRACE("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObj); + return IMoniker_RemoteBindToStorage_Proxy(This, pbc, pmkToLeft, riid, (IUnknown**)ppvObj); } HRESULT __RPC_STUB IMoniker_BindToStorage_Stub( @@ -2371,8 +2371,8 @@ HRESULT __RPC_STUB IMoniker_BindToStorage_Stub( REFIID riid, IUnknown **ppvObj) { - FIXME(":stub\n"); - return E_NOTIMPL; + TRACE("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObj); + return IMoniker_BindToStorage(This, pbc, pmkToLeft, riid, (void**)ppvObj); } HRESULT CALLBACK IEnumString_Next_Proxy( diff --git a/dll/win32/oleaut32/connpt.h b/dll/win32/oleaut32/connpt.h index cac3ae62fa8..e0bdd8b59b4 100644 --- a/dll/win32/oleaut32/connpt.h +++ b/dll/win32/oleaut32/connpt.h @@ -19,6 +19,6 @@ #ifndef _CONNPT_H #define _CONNPT_H -HRESULT CreateConnectionPoint(IUnknown *pUnk, REFIID riid, IConnectionPoint **pCP); +HRESULT CreateConnectionPoint(IUnknown *pUnk, REFIID riid, IConnectionPoint **pCP) DECLSPEC_HIDDEN; #endif /* _CONNPT_H */ diff --git a/dll/win32/oleaut32/oleaut.c b/dll/win32/oleaut32/oleaut.c index fa52acc2036..2a61c016141 100644 --- a/dll/win32/oleaut32/oleaut.c +++ b/dll/win32/oleaut32/oleaut.c @@ -93,14 +93,15 @@ typedef struct { } u; } bstr_t; +#define BUCKET_SIZE 16 +#define BUCKET_BUFFER_SIZE 6 + typedef struct { unsigned short head; unsigned short cnt; - bstr_t *buf[6]; + bstr_t *buf[BUCKET_BUFFER_SIZE]; } bstr_cache_entry_t; -#define BUCKET_SIZE 16 - #define ARENA_INUSE_FILLER 0x55 #define ARENA_TAIL_FILLER 0xab #define ARENA_FREE_FILLER 0xfeeefeee @@ -141,7 +142,7 @@ static bstr_t *alloc_bstr(size_t size) if(cache_entry) { ret = cache_entry->buf[cache_entry->head++]; - cache_entry->head %= sizeof(cache_entry->buf)/sizeof(*cache_entry->buf); + cache_entry->head %= BUCKET_BUFFER_SIZE; cache_entry->cnt--; } @@ -260,14 +261,26 @@ void WINAPI SysFreeString(BSTR str) bstr = bstr_from_str(str); cache_entry = get_cache_entry(bstr->size+sizeof(WCHAR)); if(cache_entry) { + unsigned i; + EnterCriticalSection(&cs_bstr_cache); + /* According to tests, freeing a string that's already in cache doesn't corrupt anything. + * For that to work we need to search the cache. */ + for(i=0; i < cache_entry->cnt; i++) { + if(cache_entry->buf[(cache_entry->head+i) % BUCKET_BUFFER_SIZE] == bstr) { + WARN_(heap)("String already is in cache!\n"); + LeaveCriticalSection(&cs_bstr_cache); + return; + } + } + if(cache_entry->cnt < sizeof(cache_entry->buf)/sizeof(*cache_entry->buf)) { - cache_entry->buf[(cache_entry->head+cache_entry->cnt)%((sizeof(cache_entry->buf)/sizeof(*cache_entry->buf)))] = bstr; + cache_entry->buf[(cache_entry->head+cache_entry->cnt) % BUCKET_BUFFER_SIZE] = bstr; cache_entry->cnt++; if(WARN_ON(heap)) { - unsigned i, n = bstr_alloc_size(bstr->size) / sizeof(DWORD) - 1; + unsigned n = bstr_alloc_size(bstr->size) / sizeof(DWORD) - 1; bstr->size = ARENA_FREE_FILLER; for(i=0; iu.dwptr[i] = ARENA_FREE_FILLER; diff --git a/dll/win32/oleaut32/olepicture.c b/dll/win32/oleaut32/olepicture.c index 051621f28c7..a698c92ca07 100644 --- a/dll/win32/oleaut32/olepicture.c +++ b/dll/win32/oleaut32/olepicture.c @@ -1423,8 +1423,8 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface, IStream *pStm) } while (!headerisdata); if (statfailed) { /* we don't know the size ... read all we get */ - int sizeinc = 4096; - int origsize = sizeinc; + unsigned int sizeinc = 4096; + unsigned int origsize = sizeinc; ULONG nread = 42; TRACE("Reading all data from stream.\n"); diff --git a/dll/win32/oleaut32/olepropframe.c b/dll/win32/oleaut32/olepropframe.c index d86d40507b4..eb9a1c39a9a 100644 --- a/dll/win32/oleaut32/olepropframe.c +++ b/dll/win32/oleaut32/olepropframe.c @@ -143,7 +143,7 @@ static HRESULT WINAPI PropertyPageSite_TranslateAccelerator( return E_NOTIMPL; } -IPropertyPageSiteVtbl PropertyPageSiteVtbl = { +static IPropertyPageSiteVtbl PropertyPageSiteVtbl = { PropertyPageSite_QueryInterface, PropertyPageSite_AddRef, PropertyPageSite_Release, @@ -171,7 +171,7 @@ HRESULT WINAPI OleCreatePropertyFrameIndirect(LPOCPFIPARAMS lpParams) IPropertyPage **property_page; PropertyPageSite *property_page_site; HRESULT res; - int i; + ULONG i; HMODULE hcomctl; HRSRC property_sheet_dialog_find = NULL; HGLOBAL property_sheet_dialog_load = NULL; diff --git a/dll/win32/oleaut32/recinfo.c b/dll/win32/oleaut32/recinfo.c index 5a865f6e629..a27443334c9 100644 --- a/dll/win32/oleaut32/recinfo.c +++ b/dll/win32/oleaut32/recinfo.c @@ -619,7 +619,7 @@ HRESULT WINAPI GetRecordInfoFromTypeInfo(ITypeInfo* pTI, IRecordInfo** ppRecInfo ret->name = NULL; } - ret->fields = HeapAlloc(GetProcessHeap(), 0, ret->n_vars*sizeof(VARDESC)); + ret->fields = HeapAlloc(GetProcessHeap(), 0, ret->n_vars*sizeof(fieldstr)); for(i = 0; in_vars; i++) { VARDESC *vardesc; hres = ITypeInfo_GetVarDesc(pTypeInfo, i, &vardesc); diff --git a/dll/win32/oleaut32/tmarshal.c b/dll/win32/oleaut32/tmarshal.c index 8f6d696c7d2..ea814b23d2c 100644 --- a/dll/win32/oleaut32/tmarshal.c +++ b/dll/win32/oleaut32/tmarshal.c @@ -137,29 +137,29 @@ _unmarshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN *pUnk) { DWORD xsize; TRACE("...%s...\n",debugstr_guid(riid)); - + *pUnk = NULL; hres = xbuf_get(buf,(LPBYTE)&xsize,sizeof(xsize)); if (hres) { ERR("xbuf_get failed\n"); return hres; } - + if (xsize == 0) return S_OK; - + hres = CreateStreamOnHGlobal(0,TRUE,&pStm); if (hres) { ERR("Stream create failed %x\n",hres); return hres; } - + hres = IStream_Write(pStm,buf->base+buf->curoff,xsize,&res); if (hres) { ERR("stream write %x\n",hres); IStream_Release(pStm); return hres; } - + memset(&seekto,0,sizeof(seekto)); hres = IStream_Seek(pStm,seekto,SEEK_SET,&newpos); if (hres) { @@ -167,14 +167,14 @@ _unmarshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN *pUnk) { IStream_Release(pStm); return hres; } - + hres = CoUnmarshalInterface(pStm,riid,(LPVOID*)pUnk); if (hres) { ERR("Unmarshalling interface %s failed with %x\n",debugstr_guid(riid),hres); IStream_Release(pStm); return hres; } - + IStream_Release(pStm); return xbuf_skip(buf,xsize); } @@ -204,25 +204,25 @@ _marshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN pUnk) { hres = E_FAIL; TRACE("...%s...\n",debugstr_guid(riid)); - + hres = CreateStreamOnHGlobal(0,TRUE,&pStm); if (hres) { ERR("Stream create failed %x\n",hres); goto fail; } - + hres = CoMarshalInterface(pStm,riid,pUnk,0,NULL,0); if (hres) { ERR("Marshalling interface %s failed with %x\n", debugstr_guid(riid), hres); goto fail; } - + hres = IStream_Stat(pStm,&ststg,STATFLAG_NONAME); if (hres) { ERR("Stream stat failed\n"); goto fail; } - + tempbuf = HeapAlloc(GetProcessHeap(), 0, ststg.cbSize.u.LowPart); memset(&seekto,0,sizeof(seekto)); hres = IStream_Seek(pStm,seekto,SEEK_SET,&newpos); @@ -230,22 +230,22 @@ _marshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN pUnk) { ERR("Failed Seek %x\n",hres); goto fail; } - + hres = IStream_Read(pStm,tempbuf,ststg.cbSize.u.LowPart,&res); if (hres) { ERR("Failed Read %x\n",hres); goto fail; } - + xsize = ststg.cbSize.u.LowPart; xbuf_add(buf,(LPBYTE)&xsize,sizeof(xsize)); hres = xbuf_add(buf,tempbuf,ststg.cbSize.u.LowPart); - + HeapFree(GetProcessHeap(),0,tempbuf); IStream_Release(pStm); - + return hres; - + fail: xsize = 0; xbuf_add(buf,(LPBYTE)&xsize,sizeof(xsize)); @@ -412,15 +412,15 @@ static HRESULT num_of_funcs(ITypeInfo *tinfo, unsigned int *num, #include "pshpack1.h" typedef struct _TMAsmProxy { - BYTE popleax; + DWORD lealeax; + BYTE pushleax; BYTE pushlval; DWORD nr; - BYTE pushleax; BYTE lcall; DWORD xcall; BYTE lret; WORD bytestopop; - BYTE nop; + WORD nop; } TMAsmProxy; #include "poppack.h" @@ -1216,7 +1216,7 @@ deserialize_param( ); return S_OK; } - case VT_SAFEARRAY: { + case VT_SAFEARRAY: { if (readit) { ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); @@ -1338,13 +1338,13 @@ static inline BOOL is_out_elem(const ELEMDESC *elem) return (elem->u.paramdesc.wParamFlags & PARAMFLAG_FOUT || !elem->u.paramdesc.wParamFlags); } -static DWORD -xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) +static DWORD WINAPI xCall(int method, void **args) { - DWORD *args = ((DWORD*)&tpinfo)+1, *xargs; + TMProxyImpl *tpinfo = args[0]; + DWORD *xargs; const FUNCDESC *fdesc; HRESULT hres; - int i, relaydeb = TRACE_ON(olerelay); + int i; marshal_state buf; RPCOLEMESSAGE msg; ULONG status; @@ -1376,7 +1376,7 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) LeaveCriticalSection(&tpinfo->crit); - if (relaydeb) { + if (TRACE_ON(olerelay)) { TRACE_(olerelay)("->"); if (iname) TRACE_(olerelay)("%s:",relaystr(iname)); @@ -1401,10 +1401,10 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) if (nrofnames > sizeof(names)/sizeof(names[0])) ERR("Need more names!\n"); - xargs = args; + xargs = (DWORD *)(args + 1); for (i=0;icParams;i++) { ELEMDESC *elem = fdesc->lprgelemdescParam+i; - if (relaydeb) { + if (TRACE_ON(olerelay)) { if (i) TRACE_(olerelay)(","); if (i+1tdesc, xargs, @@ -1440,7 +1440,7 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) } xargs+=_argsize(&elem->tdesc, tinfo); } - if (relaydeb) TRACE_(olerelay)(")"); + TRACE_(olerelay)(")"); memset(&msg,0,sizeof(msg)); msg.cbBuffer = buf.curoff; @@ -1451,14 +1451,14 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) goto exit; } memcpy(msg.Buffer,buf.base,buf.curoff); - if (relaydeb) TRACE_(olerelay)("\n"); + TRACE_(olerelay)("\n"); hres = IRpcChannelBuffer_SendReceive(chanbuf,&msg,&status); if (hres) { ERR("RpcChannelBuffer SendReceive failed, %x\n",hres); goto exit; } - if (relaydeb) TRACE_(olerelay)(" status = %08x (",status); + TRACE_(olerelay)(" status = %08x (",status); if (buf.base) buf.base = HeapReAlloc(GetProcessHeap(),0,buf.base,msg.cbBuffer); else @@ -1468,25 +1468,24 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) buf.curoff = 0; /* generic deserializer using typelib description */ - xargs = args; + xargs = (DWORD *)(args + 1); status = S_OK; for (i=0;icParams;i++) { ELEMDESC *elem = fdesc->lprgelemdescParam+i; - if (relaydeb) { - if (i) TRACE_(olerelay)(","); - if (i+1tdesc), xargs, @@ -1503,7 +1502,7 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) hres = xbuf_get(&buf, (LPBYTE)&remoteresult, sizeof(DWORD)); if (hres != S_OK) goto exit; - if (relaydeb) TRACE_(olerelay)(") = %08x\n", remoteresult); + TRACE_(olerelay)(") = %08x\n", remoteresult); hres = remoteresult; @@ -1639,7 +1638,7 @@ static ULONG WINAPI TMarshalDispatchChannel_Release(LPRPCCHANNELBUFFER iface) if (ref) return ref; - IRpcChannelBuffer_Release(This->pDelegateChannel); + IRpcChannelBuffer_Release(This->pDelegateChannel); HeapFree(GetProcessHeap(), 0, This); return 0; } @@ -1727,8 +1726,8 @@ static inline HRESULT get_facbuf_for_iid(REFIID riid, IPSFactoryBuffer **facbuf) static HRESULT init_proxy_entry_point(TMProxyImpl *proxy, unsigned int num) { int j; - /* nrofargs without This */ - int nrofargs; + /* nrofargs including This */ + int nrofargs = 1; ITypeInfo *tinfo2; TMAsmProxy *xasm = proxy->asmstubs + num; HRESULT hres; @@ -1741,7 +1740,6 @@ static HRESULT init_proxy_entry_point(TMProxyImpl *proxy, unsigned int num) } ITypeInfo_Release(tinfo2); /* some args take more than 4 byte on the stack */ - nrofargs = 0; for (j=0;jcParams;j++) nrofargs += _argsize(&fdesc->lprgelemdescParam[j].tdesc, proxy->tinfo); @@ -1750,25 +1748,21 @@ static HRESULT init_proxy_entry_point(TMProxyImpl *proxy, unsigned int num) ERR("calling convention is not stdcall????\n"); return E_FAIL; } -/* popl %eax - return ptr - * pushl +/* leal 4(%esp),%eax * pushl %eax + * pushl * call xCall - * lret (+4) - * - * - * arg3 arg2 arg1 + * lret */ - xasm->popleax = 0x58; + xasm->lealeax = 0x0424448d; + xasm->pushleax = 0x50; xasm->pushlval = 0x68; xasm->nr = num; - xasm->pushleax = 0x50; - xasm->lcall = 0xe8; /* relative jump */ - xasm->xcall = (DWORD)xCall; - xasm->xcall -= (DWORD)&(xasm->lret); + xasm->lcall = 0xe8; + xasm->xcall = (char *)xCall - (char *)&xasm->lret; xasm->lret = 0xc2; - xasm->bytestopop = (nrofargs+2)*4; /* pop args, This, iMethod */ - xasm->nop = 0x90; + xasm->bytestopop = nrofargs * 4; + xasm->nop = 0x9090; proxy->lpvtbl[fdesc->oVft / sizeof(void *)] = xasm; #else FIXME("not implemented on non i386\n"); @@ -1808,8 +1802,6 @@ PSFacBuf_CreateProxy( proxy = CoTaskMemAlloc(sizeof(TMProxyImpl)); if (!proxy) return E_OUTOFMEMORY; - assert(sizeof(TMAsmProxy) == 16); - proxy->dispatch = NULL; proxy->dispatch_proxy = NULL; proxy->outerunknown = pUnkOuter; @@ -1871,40 +1863,23 @@ PSFacBuf_CreateProxy( proxy->lpvtbl[i] = ProxyIUnknown_Release; break; case 3: - if(!defer_to_dispatch) - { - hres = init_proxy_entry_point(proxy, i); - if(FAILED(hres)) return hres; - } + if(!defer_to_dispatch) hres = init_proxy_entry_point(proxy, i); else proxy->lpvtbl[3] = ProxyIDispatch_GetTypeInfoCount; break; case 4: - if(!defer_to_dispatch) - { - hres = init_proxy_entry_point(proxy, i); - if(FAILED(hres)) return hres; - } + if(!defer_to_dispatch) hres = init_proxy_entry_point(proxy, i); else proxy->lpvtbl[4] = ProxyIDispatch_GetTypeInfo; break; case 5: - if(!defer_to_dispatch) - { - hres = init_proxy_entry_point(proxy, i); - if(FAILED(hres)) return hres; - } + if(!defer_to_dispatch) hres = init_proxy_entry_point(proxy, i); else proxy->lpvtbl[5] = ProxyIDispatch_GetIDsOfNames; break; case 6: - if(!defer_to_dispatch) - { - hres = init_proxy_entry_point(proxy, i); - if(FAILED(hres)) return hres; - } + if(!defer_to_dispatch) hres = init_proxy_entry_point(proxy, i); else proxy->lpvtbl[6] = ProxyIDispatch_Invoke; break; default: hres = init_proxy_entry_point(proxy, i); - if(FAILED(hres)) return hres; } } diff --git a/dll/win32/oleaut32/typelib.c b/dll/win32/oleaut32/typelib.c index f5e7f82d08e..5c81263d86e 100644 --- a/dll/win32/oleaut32/typelib.c +++ b/dll/win32/oleaut32/typelib.c @@ -986,7 +986,7 @@ typedef struct tagTLBImpLib /* internal ITypeLib data */ typedef struct tagITypeLibImpl { - const ITypeLib2Vtbl *lpVtbl; + ITypeLib2 ITypeLib2_iface; const ITypeCompVtbl *lpVtblTypeComp; LONG ref; TLIBATTR LibAttr; /* guid,lcid,syskind,version,flags */ @@ -2547,9 +2547,10 @@ static HRESULT TLB_PEFile_Open(LPCWSTR path, INT index, LPVOID *ppBase, DWORD *p return S_OK; } } - - hr = E_FAIL; } + + TRACE("No TYPELIB resource found\n"); + hr = E_FAIL; } TLB_PEFile_Release((IUnknown *)&This->lpvtbl); @@ -2918,7 +2919,7 @@ static HRESULT TLB_ReadTypeLib(LPCWSTR pszFileName, LPWSTR pszPath, UINT cchPath if (!strcmpiW(entry->path, pszPath) && entry->index == index) { TRACE("cache hit\n"); - *ppTypeLib = (ITypeLib2*)entry; + *ppTypeLib = &entry->ITypeLib2_iface; ITypeLib2_AddRef(*ppTypeLib); LeaveCriticalSection(&cache_section); return S_OK; @@ -2952,8 +2953,6 @@ static HRESULT TLB_ReadTypeLib(LPCWSTR pszFileName, LPWSTR pszPath, UINT cchPath ret = TYPE_E_CANTLOADLIBRARY; IUnknown_Release(pFile); } - else - ret = TYPE_E_CANTLOADLIBRARY; if(*ppTypeLib) { ITypeLibImpl *impl = (ITypeLibImpl*)*ppTypeLib; @@ -2969,8 +2968,15 @@ static HRESULT TLB_ReadTypeLib(LPCWSTR pszFileName, LPWSTR pszPath, UINT cchPath list_add_head(&tlb_cache, &impl->entry); LeaveCriticalSection(&cache_section); ret = S_OK; - } else - ERR("Loading of typelib %s failed with error %d\n", debugstr_w(pszFileName), GetLastError()); + } + else + { + if(ret != E_FAIL) + ERR("Loading of typelib %s failed with error %d\n", debugstr_w(pszFileName), GetLastError()); + + ret = TYPE_E_CANTLOADLIBRARY; + } + return ret; } @@ -2984,7 +2990,7 @@ static ITypeLibImpl* TypeLibImpl_Constructor(void) pTypeLibImpl = heap_alloc_zero(sizeof(ITypeLibImpl)); if (!pTypeLibImpl) return NULL; - pTypeLibImpl->lpVtbl = &tlbvt; + pTypeLibImpl->ITypeLib2_iface.lpVtbl = &tlbvt; pTypeLibImpl->lpVtblTypeComp = &tlbtcvt; pTypeLibImpl->ref = 1; @@ -3202,7 +3208,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength) } TRACE("(%p)\n", pTypeLibImpl); - return (ITypeLib2*) pTypeLibImpl; + return &pTypeLibImpl->ITypeLib2_iface; } @@ -4200,58 +4206,53 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength) } heap_free(pOtherTypeInfoBlks); - return (ITypeLib2*)pTypeLibImpl; + return &pTypeLibImpl->ITypeLib2_iface; } -/* ITypeLib::QueryInterface - */ -static HRESULT WINAPI ITypeLib2_fnQueryInterface( - ITypeLib2 * iface, - REFIID riid, - VOID **ppvObject) +static inline ITypeLibImpl *impl_from_ITypeLib2(ITypeLib2 *iface) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + return CONTAINING_RECORD(iface, ITypeLibImpl, ITypeLib2_iface); +} + +static HRESULT WINAPI ITypeLib2_fnQueryInterface(ITypeLib2 *iface, REFIID riid, void **ppv) +{ + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TRACE("(%p)->(IID: %s)\n",This,debugstr_guid(riid)); - *ppvObject=NULL; if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid,&IID_ITypeLib)|| IsEqualIID(riid,&IID_ITypeLib2)) { - *ppvObject = This; + *ppv = &This->ITypeLib2_iface; + } + else + { + *ppv = NULL; + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; } - if(*ppvObject) - { - ITypeLib2_AddRef(iface); - TRACE("-- Interface: (%p)->(%p)\n",ppvObject,*ppvObject); - return S_OK; - } - TRACE("-- Interface: E_NOINTERFACE\n"); - return E_NOINTERFACE; + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; } -/* ITypeLib::AddRef - */ static ULONG WINAPI ITypeLib2_fnAddRef( ITypeLib2 *iface) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->ref was %u\n",This, ref - 1); + TRACE("(%p) ref=%u\n", This, ref); return ref; } -/* ITypeLib::Release - */ static ULONG WINAPI ITypeLib2_fnRelease( ITypeLib2 *iface) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->(%u)\n",This, ref); + TRACE("(%p) ref=%u\n",This, ref); if (!ref) { @@ -4295,7 +4296,7 @@ static ULONG WINAPI ITypeLib2_fnRelease( ITypeLib2 *iface) LIST_FOR_EACH_ENTRY_SAFE(pImpLib, pImpLibNext, &This->implib_list, TLBImpLib, entry) { if (pImpLib->pImpTypeLib) - ITypeLib_Release((ITypeLib *)pImpLib->pImpTypeLib); + ITypeLib2_Release(&pImpLib->pImpTypeLib->ITypeLib2_iface); SysFreeString(pImpLib->name); list_remove(&pImpLib->entry); @@ -4324,7 +4325,7 @@ static ULONG WINAPI ITypeLib2_fnRelease( ITypeLib2 *iface) */ static UINT WINAPI ITypeLib2_fnGetTypeInfoCount( ITypeLib2 *iface) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TRACE("(%p)->count is %d\n",This, This->TypeInfoCount); return This->TypeInfoCount; } @@ -4338,7 +4339,7 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeInfo( UINT index, ITypeInfo **ppTInfo) { - ITypeLibImpl *This = (ITypeLibImpl*)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TRACE("%p %u %p\n", This, index, ppTInfo); @@ -4364,7 +4365,7 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeInfoType( UINT index, TYPEKIND *pTKind) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TRACE("(%p, %d, %p)\n", This, index, pTKind); @@ -4389,8 +4390,8 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeInfoOfGuid( REFGUID guid, ITypeInfo **ppTInfo) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; - UINT i; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); + int i; TRACE("%p %s %p\n", This, debugstr_guid(guid), ppTInfo); @@ -4414,7 +4415,7 @@ static HRESULT WINAPI ITypeLib2_fnGetLibAttr( ITypeLib2 *iface, LPTLIBATTR *attr) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TRACE("(%p, %p)\n", This, attr); @@ -4437,7 +4438,7 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeComp( ITypeLib2 *iface, ITypeComp **ppTComp) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TRACE("(%p)->(%p)\n",This,ppTComp); *ppTComp = (ITypeComp *)&This->lpVtblTypeComp; @@ -4463,13 +4464,10 @@ static HRESULT WINAPI ITypeLib2_fnGetDocumentation( DWORD *pdwHelpContext, BSTR *pBstrHelpFile) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; - + ITypeLibImpl *This = impl_from_ITypeLib2(iface); HRESULT result = E_INVALIDARG; - ITypeInfo *pTInfo; - TRACE("(%p) index %d Name(%p) DocString(%p) HelpContext(%p) HelpFile(%p)\n", This, index, pBstrName, pBstrDocString, @@ -4557,8 +4555,9 @@ static HRESULT WINAPI ITypeLib2_fnIsName( ULONG lHashVal, BOOL *pfName) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; - UINT nNameBufLen = (lstrlenW(szNameBuf)+1)*sizeof(WCHAR), tic, fdc, vrc, pc; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); + int tic; + UINT nNameBufLen = (lstrlenW(szNameBuf)+1)*sizeof(WCHAR), fdc, vrc; TRACE("(%p)->(%s,%08x,%p)\n", This, debugstr_w(szNameBuf), lHashVal, pfName); @@ -4569,6 +4568,8 @@ static HRESULT WINAPI ITypeLib2_fnIsName( if(!memcmp(szNameBuf,pTInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; for(fdc = 0; fdc < pTInfo->TypeAttr.cFuncs; ++fdc) { TLBFuncDesc *pFInfo = &pTInfo->funcdescs[fdc]; + int pc; + if(!memcmp(szNameBuf,pFInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; for(pc=0; pc < pFInfo->funcdesc.cParams; pc++) if(!memcmp(szNameBuf,pFInfo->pParamDesc[pc].Name, nNameBufLen)) @@ -4603,8 +4604,9 @@ static HRESULT WINAPI ITypeLib2_fnFindName( MEMBERID *memid, UINT16 *found) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; - UINT tic, count = 0; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); + int tic; + UINT count = 0; UINT len; TRACE("(%p)->(%s %u %p %p %p)\n", This, debugstr_w(name), hash, ppTInfo, memid, found); @@ -4621,7 +4623,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName( if(!memcmp(name, pTInfo->Name, len)) goto ITypeLib2_fnFindName_exit; for(fdc = 0; fdc < pTInfo->TypeAttr.cFuncs; ++fdc) { TLBFuncDesc *func = &pTInfo->funcdescs[fdc]; - UINT pc; + int pc; if(!memcmp(name, func->Name, len)) goto ITypeLib2_fnFindName_exit; for(pc = 0; pc < func->funcdesc.cParams; pc++) { @@ -4656,10 +4658,9 @@ static VOID WINAPI ITypeLib2_fnReleaseTLibAttr( ITypeLib2 *iface, TLIBATTR *pTLibAttr) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; - TRACE("freeing (%p)\n",This); + ITypeLibImpl *This = impl_from_ITypeLib2(iface); + TRACE("(%p)->(%p)\n", This, pTLibAttr); heap_free(pTLibAttr); - } /* ITypeLib2::GetCustData @@ -4671,10 +4672,10 @@ static HRESULT WINAPI ITypeLib2_fnGetCustData( REFGUID guid, VARIANT *pVarVal) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TLBCustData *pCData; - TRACE("%p %s %p\n", This, debugstr_guid(guid), pVarVal); + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(guid), pVarVal); pCData = TLB_get_custdata_by_guid(&This->custdata_list, guid); if(!pCData) @@ -4697,7 +4698,7 @@ static HRESULT WINAPI ITypeLib2_fnGetLibStatistics( ULONG *pcUniqueNames, ULONG *pcchUniqueNames) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); FIXME("(%p): stub!\n", This); @@ -4721,7 +4722,7 @@ static HRESULT WINAPI ITypeLib2_fnGetDocumentation2( DWORD *pdwHelpStringContext, BSTR *pbstrHelpStringDll) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); HRESULT result; ITypeInfo *pTInfo; @@ -4807,8 +4808,8 @@ static HRESULT WINAPI ITypeLib2_fnGetAllCustData( ITypeLib2 * iface, CUSTDATA *pCustData) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; - TRACE("%p %p\n", iface, pCustData); + ITypeLibImpl *This = impl_from_ITypeLib2(iface); + TRACE("(%p)->(%p)\n", This, pCustData); return TLB_copy_all_custdata(&This->custdata_list, pCustData); } @@ -4838,21 +4839,21 @@ static HRESULT WINAPI ITypeLibComp_fnQueryInterface(ITypeComp * iface, REFIID ri { ITypeLibImpl *This = impl_from_ITypeComp(iface); - return ITypeLib2_QueryInterface((ITypeLib2 *)This, riid, ppv); + return ITypeLib2_QueryInterface(&This->ITypeLib2_iface, riid, ppv); } static ULONG WINAPI ITypeLibComp_fnAddRef(ITypeComp * iface) { ITypeLibImpl *This = impl_from_ITypeComp(iface); - return ITypeLib2_AddRef((ITypeLib2 *)This); + return ITypeLib2_AddRef(&This->ITypeLib2_iface); } static ULONG WINAPI ITypeLibComp_fnRelease(ITypeComp * iface) { ITypeLibImpl *This = impl_from_ITypeComp(iface); - return ITypeLib2_Release((ITypeLib2 *)This); + return ITypeLib2_Release(&This->ITypeLib2_iface); } static HRESULT WINAPI ITypeLibComp_fnBind( @@ -5001,7 +5002,7 @@ static HRESULT WINAPI ITypeLibComp_fnBindType( ITypeComp ** ppTComp) { ITypeLibImpl *This = impl_from_ITypeComp(iface); - UINT i; + int i; TRACE("(%s, %x, %p, %p)\n", debugstr_w(szName), lHash, ppTInfo, ppTComp); @@ -5096,14 +5097,14 @@ static ULONG WINAPI ITypeInfo_fnAddRef( ITypeInfo2 *iface) TRACE("(%p)->ref is %u\n",This, ref); if (ref == 1 /* incremented from 0 */) - ITypeLib2_AddRef((ITypeLib2*)This->pTypeLib); + ITypeLib2_AddRef(&This->pTypeLib->ITypeLib2_iface); return ref; } static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This) { - UINT i, j; + UINT i; TRACE("destroying ITypeInfo(%p)\n",This); @@ -5118,6 +5119,7 @@ static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This) for (i = 0; i < This->TypeAttr.cFuncs; ++i) { + int j; TLBFuncDesc *pFInfo = &This->funcdescs[i]; for(j = 0; j < pFInfo->funcdesc.cParams; j++) { @@ -5179,7 +5181,7 @@ static ULONG WINAPI ITypeInfo_fnRelease(ITypeInfo2 *iface) if (!ref) { BOOL not_attached_to_typelib = This->not_attached_to_typelib; - ITypeLib2_Release((ITypeLib2*)This->pTypeLib); + ITypeLib2_Release(&This->pTypeLib->ITypeLib2_iface); if (not_attached_to_typelib) heap_free(This); /* otherwise This will be freed when typelib is freed */ @@ -6191,6 +6193,10 @@ DispCallFunc( case VT_CY: V_UI8(pvargResult) = call_method( func, argspos - 1, args + 1, &stack_offset ); break; + case VT_HRESULT: + WARN("invalid return type %u\n", vtReturn); + heap_free( args ); + return E_INVALIDARG; default: V_UI4(pvargResult) = call_method( func, argspos - 1, args + 1, &stack_offset ); break; @@ -6269,6 +6275,10 @@ DispCallFunc( args[0] = (DWORD_PTR)pvargResult; /* arg 0 is a pointer to the result */ call_method( func, argspos, args ); break; + case VT_HRESULT: + WARN("invalid return type %u\n", vtReturn); + heap_free( args ); + return E_INVALIDARG; default: V_UI8(pvargResult) = call_method( func, argspos - 1, args + 1 ); break; @@ -7053,7 +7063,7 @@ static HRESULT WINAPI ITypeInfo_fnGetRefTypeInfo( } else { if(ref_type->pImpTLInfo->pImpTypeLib) { TRACE("typeinfo in imported typelib that is already loaded\n"); - pTLib = (ITypeLib*)ref_type->pImpTLInfo->pImpTypeLib; + pTLib = (ITypeLib*)&ref_type->pImpTLInfo->pImpTypeLib->ITypeLib2_iface; ITypeLib_AddRef(pTLib); result = S_OK; } else { @@ -7838,7 +7848,7 @@ HRESULT WINAPI CreateDispTypeInfo( *pptinfo = (ITypeInfo*)pTIClass; ITypeInfo_AddRef(*pptinfo); - ITypeLib_Release((ITypeLib *)&pTypeLibImpl->lpVtbl); + ITypeLib2_Release(&pTypeLibImpl->ITypeLib2_iface); return S_OK; diff --git a/dll/win32/oleaut32/typelib.h b/dll/win32/oleaut32/typelib.h index 15e8f02500a..fdf825fdc0a 100644 --- a/dll/win32/oleaut32/typelib.h +++ b/dll/win32/oleaut32/typelib.h @@ -597,16 +597,16 @@ WORD typeofarray #include "poppack.h" /* heap allocation helpers */ -extern void* heap_alloc_zero(unsigned size); -extern void* heap_alloc(unsigned size); -extern void* heap_realloc(void *ptr, unsigned size); -extern void heap_free(void *ptr); +extern void* heap_alloc_zero(unsigned size) DECLSPEC_HIDDEN __WINE_ALLOC_SIZE(1); +extern void* heap_alloc(unsigned size) DECLSPEC_HIDDEN __WINE_ALLOC_SIZE(1); +extern void* heap_realloc(void *ptr, unsigned size) DECLSPEC_HIDDEN; +extern void heap_free(void *ptr) DECLSPEC_HIDDEN; -HRESULT ITypeInfoImpl_GetInternalFuncDesc( ITypeInfo *iface, UINT index, const FUNCDESC **ppFuncDesc ); +HRESULT ITypeInfoImpl_GetInternalFuncDesc( ITypeInfo *iface, UINT index, const FUNCDESC **ppFuncDesc ) DECLSPEC_HIDDEN; -extern DWORD _invoke(FARPROC func,CALLCONV callconv, int nrargs, DWORD *args); +extern DWORD _invoke(FARPROC func,CALLCONV callconv, int nrargs, DWORD *args) DECLSPEC_HIDDEN; -HRESULT TMARSHAL_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv); +HRESULT TMARSHAL_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) DECLSPEC_HIDDEN; /* The OLE Automation ProxyStub Interface Class (aka Typelib Marshaler) */ DEFINE_OLEGUID( CLSID_PSDispatch, 0x00020420, 0x0000, 0x0000 ); diff --git a/dll/win32/oleaut32/typelib2.c b/dll/win32/oleaut32/typelib2.c index c855776f756..cb2c04f72f6 100644 --- a/dll/win32/oleaut32/typelib2.c +++ b/dll/win32/oleaut32/typelib2.c @@ -2053,8 +2053,10 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc( if(This->dual) This->dual->typedata = This->typedata; } else { + unsigned int j; + iter = This->typedata->next; - for(i=0; inext; insert->next = iter->next; diff --git a/dll/win32/oleaut32/varformat.c b/dll/win32/oleaut32/varformat.c index 268eca2bce7..f571443f1bf 100644 --- a/dll/win32/oleaut32/varformat.c +++ b/dll/win32/oleaut32/varformat.c @@ -1911,7 +1911,7 @@ static HRESULT VARIANT_FormatDate(LPVARIANT pVarIn, LPOLESTR lpszFormat, WCHAR fmt_buff[80]; if (!GetLocaleInfoW(lcid, dwFmt, fmt_buff, sizeof(fmt_buff)/sizeof(WCHAR)) || - !GetDateFormatW(lcid, 0, &udate.st, fmt_buff, pBuff, + !get_date_format(lcid, 0, &udate.st, fmt_buff, pBuff, sizeof(buff)/sizeof(WCHAR)-(pBuff-buff))) { hRes = E_INVALIDARG; diff --git a/dll/win32/oleaut32/variant.c b/dll/win32/oleaut32/variant.c index 5600e167b87..67608e67211 100644 --- a/dll/win32/oleaut32/variant.c +++ b/dll/win32/oleaut32/variant.c @@ -3134,9 +3134,9 @@ HRESULT WINAPI VarAnd(LPVARIANT left, LPVARIANT right, LPVARIANT result) LOCALE_USER_DEFAULT, 0, &d))) hres = VariantChangeType(&varLeft,&varLeft, VARIANT_LOCALBOOL, VT_BOOL); - if (SUCCEEDED(hres) && V_VT(&varLeft) != resvt) - hres = VariantChangeType(&varLeft,&varLeft,0,resvt); - if (FAILED(hres)) goto VarAnd_Exit; + if (SUCCEEDED(hres) && V_VT(&varLeft) != resvt) + hres = VariantChangeType(&varLeft,&varLeft,0,resvt); + if (FAILED(hres)) goto VarAnd_Exit; } if (resvt == VT_I4 && V_VT(&varRight) == VT_UI4) diff --git a/dll/win32/oleaut32/variant.h b/dll/win32/oleaut32/variant.h index 14b6c058e1b..97bebfcb842 100644 --- a/dll/win32/oleaut32/variant.h +++ b/dll/win32/oleaut32/variant.h @@ -48,12 +48,12 @@ #define VTBIT_VARIANT (1 << VT_VARIANT) #define VTBIT_15 (1 << 15) /* no variant type with this number */ -extern const char * const wine_vtypes[]; +extern const char * const wine_vtypes[] DECLSPEC_HIDDEN; #define debugstr_vt(v) (((v)&VT_TYPEMASK) <= VT_CLSID ? wine_vtypes[((v)&VT_TYPEMASK)] : \ ((v)&VT_TYPEMASK) == VT_BSTR_BLOB ? "VT_BSTR_BLOB": "Invalid") #define debugstr_VT(v) (!(v) ? "(null)" : debugstr_vt(V_TYPE((v)))) -extern const char * const wine_vflags[]; +extern const char * const wine_vflags[] DECLSPEC_HIDDEN; #define debugstr_vf(v) (wine_vflags[((v)&VT_EXTRA_TYPE)>>12]) #define debugstr_VF(v) (!(v) ? "(null)" : debugstr_vf(V_EXTRA_TYPE(v))) @@ -125,5 +125,7 @@ typedef struct tagVARIANT_NUMBER_CHARS } VARIANT_NUMBER_CHARS; -BOOL VARIANT_GetLocalisedText(LANGID, DWORD, WCHAR *); -HRESULT VARIANT_ClearInd(VARIANTARG *); +BOOL VARIANT_GetLocalisedText(LANGID, DWORD, WCHAR *) DECLSPEC_HIDDEN; +HRESULT VARIANT_ClearInd(VARIANTARG *) DECLSPEC_HIDDEN; +BOOL get_date_format(LCID, DWORD, const SYSTEMTIME *, + const WCHAR *, WCHAR *, int) DECLSPEC_HIDDEN; diff --git a/dll/win32/oleaut32/vartype.c b/dll/win32/oleaut32/vartype.c index c7bc15bacfb..5553d77a3c8 100644 --- a/dll/win32/oleaut32/vartype.c +++ b/dll/win32/oleaut32/vartype.c @@ -6579,6 +6579,120 @@ HRESULT WINAPI VarBstrFromCy(CY cyIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut) return *pbstrOut ? S_OK : E_OUTOFMEMORY; } +static inline int output_int_len(int o, int min_len, WCHAR *date, int date_len) +{ + int len, tmp; + + if(min_len >= date_len) + return -1; + + for(len=0, tmp=o; tmp; tmp/=10) len++; + if(!len) len++; + if(len >= date_len) + return -1; + + for(tmp=min_len-len; tmp>0; tmp--) + *date++ = '0'; + for(tmp=len; tmp>0; tmp--, o/=10) + date[tmp-1] = '0' + o%10; + return min_len>len ? min_len : len; +} + +/* format date string, similar to GetDateFormatW function but works on bigger range of dates */ +BOOL get_date_format(LCID lcid, DWORD flags, const SYSTEMTIME *st, + const WCHAR *fmt, WCHAR *date, int date_len) +{ + static const LCTYPE dayname[] = { + LOCALE_SDAYNAME7, LOCALE_SDAYNAME1, LOCALE_SDAYNAME2, LOCALE_SDAYNAME3, + LOCALE_SDAYNAME4, LOCALE_SDAYNAME5, LOCALE_SDAYNAME6 + }; + static const LCTYPE sdayname[] = { + LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2, + LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5, + LOCALE_SABBREVDAYNAME6 + }; + static const LCTYPE monthname[] = { + LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3, LOCALE_SMONTHNAME4, + LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6, LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, + LOCALE_SMONTHNAME9, LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12 + }; + static const LCTYPE smonthname[] = { + LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, LOCALE_SABBREVMONTHNAME3, + LOCALE_SABBREVMONTHNAME4, LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6, + LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, LOCALE_SABBREVMONTHNAME9, + LOCALE_SABBREVMONTHNAME10, LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 + }; + + if(flags & ~(LOCALE_NOUSEROVERRIDE|VAR_DATEVALUEONLY)) + FIXME("ignoring flags %x\n", flags); + flags &= LOCALE_NOUSEROVERRIDE; + + while(*fmt && date_len) { + int count = 1; + + switch(*fmt) { + case 'd': + case 'M': + case 'y': + case 'g': + while(*fmt == *(fmt+count)) + count++; + fmt += count-1; + } + + switch(*fmt) { + case 'd': + if(count >= 4) + count = GetLocaleInfoW(lcid, dayname[st->wDayOfWeek] | flags, date, date_len)-1; + else if(count == 3) + count = GetLocaleInfoW(lcid, sdayname[st->wDayOfWeek] | flags, date, date_len)-1; + else + count = output_int_len(st->wDay, count, date, date_len); + break; + case 'M': + if(count >= 4) + count = GetLocaleInfoW(lcid, monthname[st->wMonth-1] | flags, date, date_len)-1; + else if(count == 3) + count = GetLocaleInfoW(lcid, smonthname[st->wMonth-1] | flags, date, date_len)-1; + else + count = output_int_len(st->wMonth, count, date, date_len); + break; + case 'y': + if(count >= 3) + count = output_int_len(st->wYear, 0, date, date_len); + else + count = output_int_len(st->wYear%100, count, date, date_len); + break; + case 'g': + if(count == 2) { + FIXME("Should be using GetCalendarInfo(CAL_SERASTRING), defaulting to 'AD'\n"); + + *date++ = 'A'; + date_len--; + if(date_len) + *date = 'D'; + else + count = -1; + break; + } + /* fall through */ + default: + *date = *fmt; + } + + if(count < 0) + break; + fmt++; + date += count; + date_len -= count; + } + + if(!date_len) + return FALSE; + *date++ = 0; + return TRUE; +} + /****************************************************************************** * VarBstrFromDate [OLEAUT32.114] * @@ -6599,7 +6713,7 @@ HRESULT WINAPI VarBstrFromDate(DATE dateIn, LCID lcid, ULONG dwFlags, BSTR* pbst { SYSTEMTIME st; DWORD dwFormatFlags = dwFlags & LOCALE_NOUSEROVERRIDE; - WCHAR date[128], *time; + WCHAR date[128], fmt_buff[80], *time; TRACE("(%g,0x%08x,0x%08x,%p)\n", dateIn, lcid, dwFlags, pbstrOut); @@ -6622,15 +6736,15 @@ HRESULT WINAPI VarBstrFromDate(DATE dateIn, LCID lcid, ULONG dwFlags, BSTR* pbst if (whole == 0.0) dwFlags |= VAR_TIMEVALUEONLY; - else if (partial < 1e-12) + else if (partial > -1e-12 && partial < 1e-12) dwFlags |= VAR_DATEVALUEONLY; } if (dwFlags & VAR_TIMEVALUEONLY) date[0] = '\0'; else - if (!GetDateFormatW(lcid, dwFormatFlags|DATE_SHORTDATE, &st, NULL, date, - sizeof(date)/sizeof(WCHAR))) + if (!GetLocaleInfoW(lcid, LOCALE_SSHORTDATE, fmt_buff, sizeof(fmt_buff)/sizeof(WCHAR)) || + !get_date_format(lcid, dwFlags, &st, fmt_buff, date, sizeof(date)/sizeof(WCHAR))) return E_INVALIDARG; if (!(dwFlags & VAR_DATEVALUEONLY)) diff --git a/dll/win32/propsys/CMakeLists.txt b/dll/win32/propsys/CMakeLists.txt new file mode 100644 index 00000000000..14f3ab39362 --- /dev/null +++ b/dll/win32/propsys/CMakeLists.txt @@ -0,0 +1,20 @@ + +include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +add_definitions(-D__WINESRC__) + +spec2def(propsys.dll propsys.spec ADD_IMPORTLIB) + +list(APPEND SOURCE + propstore.c + propsys_main.c + propvar.c + propsys.rc + ${CMAKE_CURRENT_BINARY_DIR}/propsys_stubs.c + ${CMAKE_CURRENT_BINARY_DIR}/propsys.def) + +add_library(propsys SHARED ${SOURCE}) +set_module_type(propsys win32dll) +target_link_libraries(propsys uuid wine) +add_importlibs(propsys ole32 oleaut32 msvcrt kernel32 ntdll) +add_dependencies(propsys psdk) +add_cd_file(TARGET propsys DESTINATION reactos/system32 FOR all) diff --git a/dll/win32/propsys/propstore.c b/dll/win32/propsys/propstore.c new file mode 100644 index 00000000000..7bb6de25290 --- /dev/null +++ b/dll/win32/propsys/propstore.c @@ -0,0 +1,481 @@ +/* + * standard IPropertyStore implementation + * + * Copyright 2012 Vincent Povirk for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +#define COBJMACROS +#include + +#include + +#include +#include +#include +//#include "rpcproxy.h" +#include +#include +//#include "wine/unicode.h" +#include + +#include +//#include "propsys_private.h" + +DEFINE_GUID(FMTID_NamedProperties, 0xd5cdd505, 0x2e9c, 0x101b, 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae); + +WINE_DEFAULT_DEBUG_CHANNEL(propsys); + +typedef struct { + struct list entry; + DWORD pid; + PROPVARIANT propvar; + PSC_STATE state; +} propstore_value; + +typedef struct { + struct list entry; + GUID fmtid; + struct list values; /* list of struct propstore_value */ + DWORD count; +} propstore_format; + +typedef struct { + IPropertyStoreCache IPropertyStoreCache_iface; + LONG ref; + CRITICAL_SECTION lock; + struct list formats; /* list of struct propstore_format */ +} PropertyStore; + +static inline PropertyStore *impl_from_IPropertyStoreCache(IPropertyStoreCache *iface) +{ + return CONTAINING_RECORD(iface, PropertyStore, IPropertyStoreCache_iface); +} + +static HRESULT WINAPI PropertyStore_QueryInterface(IPropertyStoreCache *iface, REFIID iid, + void **ppv) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); + + if (!ppv) return E_INVALIDARG; + + if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IPropertyStore, iid) || + IsEqualIID(&IID_IPropertyStoreCache, iid)) + { + *ppv = &This->IPropertyStoreCache_iface; + } + else + { + FIXME("No interface for %s\n", debugstr_guid(iid)); + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI PropertyStore_AddRef(IPropertyStoreCache *iface) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + return ref; +} + +static void destroy_format(propstore_format *format) +{ + propstore_value *cursor, *cursor2; + LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, &format->values, propstore_value, entry) + { + PropVariantClear(&cursor->propvar); + HeapFree(GetProcessHeap(), 0, cursor); + } + HeapFree(GetProcessHeap(), 0, format); +} + +static ULONG WINAPI PropertyStore_Release(IPropertyStoreCache *iface) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + if (ref == 0) + { + propstore_format *cursor, *cursor2; + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); + LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, &This->formats, propstore_format, entry) + destroy_format(cursor); + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT WINAPI PropertyStore_GetCount(IPropertyStoreCache *iface, + DWORD *cProps) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_format *format; + + TRACE("%p,%p\n", iface, cProps); + + if (!cProps) + return E_POINTER; + + *cProps = 0; + + EnterCriticalSection(&This->lock); + + LIST_FOR_EACH_ENTRY(format, &This->formats, propstore_format, entry) + *cProps += format->count; + + LeaveCriticalSection(&This->lock); + + return S_OK; +} + +static HRESULT WINAPI PropertyStore_GetAt(IPropertyStoreCache *iface, + DWORD iProp, PROPERTYKEY *pkey) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_format *format=NULL, *format_candidate; + propstore_value *value; + HRESULT hr; + + TRACE("%p,%d,%p\n", iface, iProp, pkey); + + if (!pkey) + return E_POINTER; + + EnterCriticalSection(&This->lock); + + LIST_FOR_EACH_ENTRY(format_candidate, &This->formats, propstore_format, entry) + { + if (format_candidate->count > iProp) + { + format = format_candidate; + pkey->fmtid = format->fmtid; + break; + } + + iProp -= format_candidate->count; + } + + if (format) + { + LIST_FOR_EACH_ENTRY(value, &format->values, propstore_value, entry) + { + if (iProp == 0) + { + pkey->pid = value->pid; + break; + } + + iProp--; + } + + hr = S_OK; + } + else + hr = E_INVALIDARG; + + LeaveCriticalSection(&This->lock); + + return hr; +} + +static HRESULT PropertyStore_LookupValue(PropertyStore *This, REFPROPERTYKEY key, + int insert, propstore_value **result) +{ + propstore_format *format=NULL, *format_candidate; + propstore_value *value=NULL, *value_candidate; + + if (IsEqualGUID(&key->fmtid, &FMTID_NamedProperties)) + { + /* This is used in the property store format [MS-PROPSTORE] + * for named values and probably gets special treatment. */ + ERR("don't know how to handle FMTID_NamedProperties\n"); + return E_FAIL; + } + + LIST_FOR_EACH_ENTRY(format_candidate, &This->formats, propstore_format, entry) + { + if (IsEqualGUID(&format_candidate->fmtid, &key->fmtid)) + { + format = format_candidate; + break; + } + } + + if (!format) + { + if (!insert) + return TYPE_E_ELEMENTNOTFOUND; + + format = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*format)); + if (!format) + return E_OUTOFMEMORY; + + format->fmtid = key->fmtid; + list_init(&format->values); + list_add_tail(&This->formats, &format->entry); + } + + LIST_FOR_EACH_ENTRY(value_candidate, &format->values, propstore_value, entry) + { + if (value_candidate->pid == key->pid) + { + value = value_candidate; + break; + } + } + + if (!value) + { + if (!insert) + return TYPE_E_ELEMENTNOTFOUND; + + value = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*value)); + if (!value) + return E_OUTOFMEMORY; + + value->pid = key->pid; + list_add_tail(&format->values, &value->entry); + format->count++; + } + + *result = value; + + return S_OK; +} + +static HRESULT WINAPI PropertyStore_GetValue(IPropertyStoreCache *iface, + REFPROPERTYKEY key, PROPVARIANT *pv) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_value *value; + HRESULT hr; + + TRACE("%p,%p,%p\n", iface, key, pv); + + if (!pv) + return E_POINTER; + + EnterCriticalSection(&This->lock); + + hr = PropertyStore_LookupValue(This, key, 0, &value); + + if (SUCCEEDED(hr)) + hr = PropVariantCopy(pv, &value->propvar); + else if (hr == TYPE_E_ELEMENTNOTFOUND) + { + PropVariantInit(pv); + hr = S_OK; + } + + LeaveCriticalSection(&This->lock); + + return hr; +} + +static HRESULT WINAPI PropertyStore_SetValue(IPropertyStoreCache *iface, + REFPROPERTYKEY key, REFPROPVARIANT propvar) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_value *value; + HRESULT hr; + PROPVARIANT temp; + + TRACE("%p,%p,%p\n", iface, key, propvar); + + EnterCriticalSection(&This->lock); + + hr = PropertyStore_LookupValue(This, key, 1, &value); + + if (SUCCEEDED(hr)) + hr = PropVariantCopy(&temp, propvar); + + if (SUCCEEDED(hr)) + { + PropVariantClear(&value->propvar); + value->propvar = temp; + } + + LeaveCriticalSection(&This->lock); + + return hr; +} + +static HRESULT WINAPI PropertyStore_Commit(IPropertyStoreCache *iface) +{ + FIXME("%p: stub\n", iface); + return S_OK; +} + +static HRESULT WINAPI PropertyStore_GetState(IPropertyStoreCache *iface, + REFPROPERTYKEY key, PSC_STATE *pstate) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_value *value; + HRESULT hr; + + TRACE("%p,%p,%p\n", iface, key, pstate); + + EnterCriticalSection(&This->lock); + + hr = PropertyStore_LookupValue(This, key, 0, &value); + + if (SUCCEEDED(hr)) + *pstate = value->state; + + LeaveCriticalSection(&This->lock); + + if (FAILED(hr)) + *pstate = PSC_NORMAL; + + return hr; +} + +static HRESULT WINAPI PropertyStore_GetValueAndState(IPropertyStoreCache *iface, + REFPROPERTYKEY key, PROPVARIANT *ppropvar, PSC_STATE *pstate) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_value *value; + HRESULT hr; + + TRACE("%p,%p,%p,%p\n", iface, key, ppropvar, pstate); + + EnterCriticalSection(&This->lock); + + hr = PropertyStore_LookupValue(This, key, 0, &value); + + if (SUCCEEDED(hr)) + hr = PropVariantCopy(ppropvar, &value->propvar); + + if (SUCCEEDED(hr)) + *pstate = value->state; + + LeaveCriticalSection(&This->lock); + + if (FAILED(hr)) + { + PropVariantInit(ppropvar); + *pstate = PSC_NORMAL; + } + + return hr; +} + +static HRESULT WINAPI PropertyStore_SetState(IPropertyStoreCache *iface, + REFPROPERTYKEY key, PSC_STATE pstate) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_value *value; + HRESULT hr; + + TRACE("%p,%p,%d\n", iface, key, pstate); + + EnterCriticalSection(&This->lock); + + hr = PropertyStore_LookupValue(This, key, 0, &value); + + if (SUCCEEDED(hr)) + value->state = pstate; + + LeaveCriticalSection(&This->lock); + + return hr; +} + +static HRESULT WINAPI PropertyStore_SetValueAndState(IPropertyStoreCache *iface, + REFPROPERTYKEY key, const PROPVARIANT *ppropvar, PSC_STATE state) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_value *value; + HRESULT hr; + PROPVARIANT temp; + + TRACE("%p,%p,%p,%d\n", iface, key, ppropvar, state); + + EnterCriticalSection(&This->lock); + + hr = PropertyStore_LookupValue(This, key, 1, &value); + + if (SUCCEEDED(hr)) + hr = PropVariantCopy(&temp, ppropvar); + + if (SUCCEEDED(hr)) + { + PropVariantClear(&value->propvar); + value->propvar = temp; + value->state = state; + } + + LeaveCriticalSection(&This->lock); + + return hr; +} + +static const IPropertyStoreCacheVtbl PropertyStore_Vtbl = { + PropertyStore_QueryInterface, + PropertyStore_AddRef, + PropertyStore_Release, + PropertyStore_GetCount, + PropertyStore_GetAt, + PropertyStore_GetValue, + PropertyStore_SetValue, + PropertyStore_Commit, + PropertyStore_GetState, + PropertyStore_GetValueAndState, + PropertyStore_SetState, + PropertyStore_SetValueAndState +}; + +HRESULT PropertyStore_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) +{ + PropertyStore *This; + HRESULT ret; + + TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv); + + *ppv = NULL; + + if (pUnkOuter) return CLASS_E_NOAGGREGATION; + + This = HeapAlloc(GetProcessHeap(), 0, sizeof(PropertyStore)); + if (!This) return E_OUTOFMEMORY; + + This->IPropertyStoreCache_iface.lpVtbl = &PropertyStore_Vtbl; + This->ref = 1; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PropertyStore.lock"); + list_init(&This->formats); + + ret = IPropertyStoreCache_QueryInterface(&This->IPropertyStoreCache_iface, iid, ppv); + IPropertyStoreCache_Release(&This->IPropertyStoreCache_iface); + + return ret; +} diff --git a/dll/win32/propsys/propsys.rc b/dll/win32/propsys/propsys.rc new file mode 100644 index 00000000000..95ee7a90e61 --- /dev/null +++ b/dll/win32/propsys/propsys.rc @@ -0,0 +1 @@ +1 WINE_REGISTRY propsys_classes.rgs diff --git a/dll/win32/propsys/propsys.spec b/dll/win32/propsys/propsys.spec new file mode 100644 index 00000000000..26bdc0b4768 --- /dev/null +++ b/dll/win32/propsys/propsys.spec @@ -0,0 +1,210 @@ + 3 stub GetProxyDllInfo + +400 stub PROPSYS_400 +402 stub PROPSYS_402 +403 stub PROPSYS_403 +404 stub PROPSYS_404 +405 stub PROPSYS_405 +406 stub PROPSYS_406 +407 stub PROPSYS_407 +408 stub PROPSYS_408 +409 stub PROPSYS_409 +410 stub PROPSYS_410 +411 stub PROPSYS_411 +412 stub PROPSYS_412 +413 stub PROPSYS_413 +414 stub PROPSYS_414 +415 stub PROPSYS_415 +416 stub PROPSYS_416 +417 stub PROPSYS_417 +418 stub PROPSYS_418 +420 stub PROPSYS_420 +421 stub PROPSYS_421 +422 stub PROPSYS_422 + +@ stub ClearPropVariantArray +@ stub ClearVariantArray +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) +@ stdcall -private DllRegisterServer() +@ stdcall -private DllUnregisterServer() +@ stub InitPropVariantFromBooleanVector +@ stdcall InitPropVariantFromBuffer(ptr long ptr) +@ stub InitPropVariantFromCLSID +@ stub InitPropVariantFromDoubleVector +@ stub InitPropVariantFromFileTime +@ stub InitPropVariantFromFileTimeVector +@ stdcall InitPropVariantFromGUIDAsString(ptr ptr) +@ stub InitPropVariantFromInt16Vector +@ stub InitPropVariantFromInt32Vector +@ stub InitPropVariantFromInt64Vector +@ stub InitPropVariantFromPropVariantVectorElem +@ stub InitPropVariantFromResource +@ stub InitPropVariantFromStrRet +@ stub InitPropVariantFromStringAsVector +@ stub InitPropVariantFromStringVector +@ stub InitPropVariantFromUInt16Vector +@ stub InitPropVariantFromUInt32Vector +@ stub InitPropVariantFromUInt64Vector +@ stub InitPropVariantVectorFromPropVariant +@ stub InitVariantFromBooleanArray +@ stdcall InitVariantFromBuffer(ptr long ptr) +@ stub InitVariantFromDoubleArray +@ stub InitVariantFromFileTime +@ stub InitVariantFromFileTimeArray +@ stdcall InitVariantFromGUIDAsString(ptr ptr) +@ stub InitVariantFromInt16Array +@ stub InitVariantFromInt32Array +@ stub InitVariantFromInt64Array +@ stub InitVariantFromResource +@ stub InitVariantFromStrRet +@ stub InitVariantFromStringArray +@ stub InitVariantFromUInt16Array +@ stub InitVariantFromUInt32Array +@ stub InitVariantFromUInt64Array +@ stub InitVariantFromVariantArrayElem +@ stub PSCoerceToCanonicalValue +@ stub PSCreateAdapterFromPropertyStore +@ stub PSCreateDelayedMultiplexPropertyStore +@ stub PSCreateMemoryPropertyStore +@ stub PSCreateMultiplexPropertyStore +@ stub PSCreatePropertyChangeArray +@ stub PSCreatePropertyStoreFromObject +@ stub PSCreatePropertyStoreFromPropertySetStorage +@ stub PSCreateSimplePropertyChange +@ stub PSEnumeratePropertyDescriptions +@ stub PSFormatForDisplay +@ stub PSFormatForDisplayAlloc +@ stub PSFormatPropertyValue +@ stub PSGetItemPropertyHandler +@ stub PSGetItemPropertyHandlerWithCreateObject +@ stub PSGetNameFromPropertyKey +@ stub PSGetNamedPropertyFromPropertyStorage +@ stdcall PSGetPropertyDescription(ptr ptr ptr) +@ stub PSGetPropertyDescriptionByName +@ stub PSGetPropertyDescriptionListFromString +@ stub PSGetPropertyFromPropertyStorage +@ stub PSGetPropertyKeyFromName +@ stub PSGetPropertySystem +@ stub PSGetPropertyValue +@ stub PSLookupPropertyHandlerCLSID +@ stdcall PSPropertyKeyFromString(wstr ptr) +@ stdcall PSRefreshPropertySchema() +@ stdcall PSRegisterPropertySchema(wstr) +@ stub PSSetPropertyValue +@ stdcall PSStringFromPropertyKey(ptr ptr long) +@ stdcall PSUnregisterPropertySchema(wstr) +@ stdcall PropVariantChangeType(ptr ptr long long) +@ stdcall PropVariantCompareEx(ptr ptr long long) +@ stub PropVariantGetBooleanElem +@ stub PropVariantGetDoubleElem +@ stub PropVariantGetElementCount +@ stub PropVariantGetFileTimeElem +@ stub PropVariantGetInt16Elem +@ stub PropVariantGetInt32Elem +@ stub PropVariantGetInt64Elem +@ stub PropVariantGetStringElem +@ stub PropVariantGetUInt16Elem +@ stub PropVariantGetUInt32Elem +@ stub PropVariantGetUInt64Elem +@ stub PropVariantToBSTR +@ stub PropVariantToBoolean +@ stub PropVariantToBooleanVector +@ stub PropVariantToBooleanVectorAlloc +@ stub PropVariantToBooleanWithDefault +@ stub PropVariantToBuffer +@ stub PropVariantToDouble +@ stub PropVariantToDoubleVector +@ stub PropVariantToDoubleVectorAlloc +@ stub PropVariantToDoubleWithDefault +@ stub PropVariantToFileTime +@ stub PropVariantToFileTimeVector +@ stub PropVariantToFileTimeVectorAlloc +@ stdcall PropVariantToGUID(ptr ptr) +@ stdcall PropVariantToInt16(ptr ptr) +@ stub PropVariantToInt16Vector +@ stub PropVariantToInt16VectorAlloc +@ stub PropVariantToInt16WithDefault +@ stdcall PropVariantToInt32(ptr ptr) +@ stub PropVariantToInt32Vector +@ stub PropVariantToInt32VectorAlloc +@ stub PropVariantToInt32WithDefault +@ stdcall PropVariantToInt64(ptr ptr) +@ stub PropVariantToInt64Vector +@ stub PropVariantToInt64VectorAlloc +@ stub PropVariantToInt64WithDefault +@ stub PropVariantToStrRet +@ stub PropVariantToString +@ stub PropVariantToStringAlloc +@ stub PropVariantToStringVector +@ stub PropVariantToStringVectorAlloc +@ stub PropVariantToStringWithDefault +@ stdcall PropVariantToUInt16(ptr ptr) +@ stub PropVariantToUInt16Vector +@ stub PropVariantToUInt16VectorAlloc +@ stub PropVariantToUInt16WithDefault +@ stdcall PropVariantToUInt32(ptr ptr) +@ stub PropVariantToUInt32Vector +@ stub PropVariantToUInt32VectorAlloc +@ stub PropVariantToUInt32WithDefault +@ stdcall PropVariantToUInt64(ptr ptr) +@ stub PropVariantToUInt64Vector +@ stub PropVariantToUInt64VectorAlloc +@ stub PropVariantToUInt64WithDefault +@ stub PropVariantToVariant +@ stub StgDeserializePropVariant +@ stub StgSerializePropVariant +@ stub VariantCompare +@ stub VariantGetBooleanElem +@ stub VariantGetDoubleElem +@ stub VariantGetElementCount +@ stub VariantGetInt16Elem +@ stub VariantGetInt32Elem +@ stub VariantGetInt64Elem +@ stub VariantGetStringElem +@ stub VariantGetUInt16Elem +@ stub VariantGetUInt32Elem +@ stub VariantGetUInt64Elem +@ stub VariantToBoolean +@ stub VariantToBooleanArray +@ stub VariantToBooleanArrayAlloc +@ stub VariantToBooleanWithDefault +@ stub VariantToBuffer +@ stub VariantToDosDateTime +@ stub VariantToDouble +@ stub VariantToDoubleArray +@ stub VariantToDoubleArrayAlloc +@ stub VariantToDoubleWithDefault +@ stub VariantToFileTime +@ stdcall VariantToGUID(ptr ptr) +@ stub VariantToInt16 +@ stub VariantToInt16Array +@ stub VariantToInt16ArrayAlloc +@ stub VariantToInt16WithDefault +@ stub VariantToInt32 +@ stub VariantToInt32Array +@ stub VariantToInt32ArrayAlloc +@ stub VariantToInt32WithDefault +@ stub VariantToInt64 +@ stub VariantToInt64Array +@ stub VariantToInt64ArrayAlloc +@ stub VariantToInt64WithDefault +@ stub VariantToPropVariant +@ stub VariantToStrRet +@ stub VariantToString +@ stub VariantToStringAlloc +@ stub VariantToStringArray +@ stub VariantToStringArrayAlloc +@ stub VariantToStringWithDefault +@ stub VariantToUInt16 +@ stub VariantToUInt16Array +@ stub VariantToUInt16ArrayAlloc +@ stub VariantToUInt16WithDefault +@ stub VariantToUInt32 +@ stub VariantToUInt32Array +@ stub VariantToUInt32ArrayAlloc +@ stub VariantToUInt32WithDefault +@ stub VariantToUInt64 +@ stub VariantToUInt64Array +@ stub VariantToUInt64ArrayAlloc +@ stub VariantToUInt64WithDefault diff --git a/dll/win32/urlmon/rsrc.rc b/dll/win32/propsys/propsys_classes.idl similarity index 65% rename from dll/win32/urlmon/rsrc.rc rename to dll/win32/propsys/propsys_classes.idl index c86575d228d..28c23f22cf8 100644 --- a/dll/win32/urlmon/rsrc.rc +++ b/dll/win32/propsys/propsys_classes.idl @@ -1,5 +1,7 @@ /* - * Copyright 2005 Jacek Caban + * Coclasses for propsys + * + * Copyright 2012 Vincent Povirk for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,16 +18,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -/* @makedep: urlmon.rgs */ -1 WINE_REGISTRY urlmon.rgs - -/* @makedep: urlmon.inf */ -REGINST REGINST urlmon.inf - -#define WINE_FILENAME_STR "urlmon.dll" -#define WINE_FILEVERSION 6,0,2800,1485 -#define WINE_FILEVERSION_STR "6.0.2800.1485" -#define WINE_PRODUCTVERSION 6,0,2800,1485 -#define WINE_PRODUCTVERSION_STR "6.0.2800.1485" - -#include "wine/wine_common_ver.rc" +[ + helpstring("Packed Property Storage Object"), + threading(both), + uuid(9a02e012-6303-4e1e-b9a1-630f802592c5) +] +coclass InMemoryPropertyStore { interface IPropertyStoreCache; } diff --git a/dll/win32/propsys/propsys_classes.rgs b/dll/win32/propsys/propsys_classes.rgs new file mode 100644 index 00000000000..d8391782781 --- /dev/null +++ b/dll/win32/propsys/propsys_classes.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{9A02E012-6303-4E1E-B9A1-630F802592C5}' = s 'Packed Property Storage Object' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + } +} diff --git a/dll/win32/propsys/propsys_main.c b/dll/win32/propsys/propsys_main.c new file mode 100644 index 00000000000..c3294caad9c --- /dev/null +++ b/dll/win32/propsys/propsys_main.c @@ -0,0 +1,404 @@ +/* + * propsys main + * + * Copyright 1997, 2002 Alexandre Julliard + * Copyright 2008 James Hawkins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +#define COBJMACROS +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "propsys_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(propsys); + +static HINSTANCE propsys_hInstance; + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved); + + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + propsys_hInstance = hinstDLL; + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + default: + break; + } + + return TRUE; +} + +HRESULT WINAPI DllRegisterServer(void) +{ + return __wine_register_resources( propsys_hInstance ); +} + +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( propsys_hInstance ); +} + +static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv); + *ppv = iface; + }else if(IsEqualGUID(&IID_IClassFactory, riid)) { + TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv); + *ppv = iface; + } + + if(*ppv) { + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; + } + + FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv); + return E_NOINTERFACE; +} + +static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) +{ + TRACE("(%p)\n", iface); + return 2; +} + +static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) +{ + TRACE("(%p)\n", iface); + return 1; +} + +static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) +{ + TRACE("(%p)->(%x)\n", iface, fLock); + + return S_OK; +} + +static HRESULT WINAPI InMemoryPropertyStoreFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, + REFIID riid, void **ppv) +{ + TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv); + + return PropertyStore_CreateInstance(outer, riid, ppv); +} + +static const IClassFactoryVtbl InMemoryPropertyStoreFactoryVtbl = { + ClassFactory_QueryInterface, + ClassFactory_AddRef, + ClassFactory_Release, + InMemoryPropertyStoreFactory_CreateInstance, + ClassFactory_LockServer +}; + +static IClassFactory InMemoryPropertyStoreFactory = { &InMemoryPropertyStoreFactoryVtbl }; + +HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) +{ + if(IsEqualGUID(&CLSID_InMemoryPropertyStore, rclsid)) { + TRACE("(CLSID_InMemoryPropertyStore %s %p)\n", debugstr_guid(riid), ppv); + return IClassFactory_QueryInterface(&InMemoryPropertyStoreFactory, riid, ppv); + } + + FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + return CLASS_E_CLASSNOTAVAILABLE; +} + +HRESULT WINAPI DllCanUnloadNow(void) +{ + return S_FALSE; +} + +HRESULT WINAPI PSRegisterPropertySchema(PCWSTR path) +{ + FIXME("%s stub\n", debugstr_w(path)); + + return S_OK; +} + +HRESULT WINAPI PSUnregisterPropertySchema(PCWSTR path) +{ + FIXME("%s stub\n", debugstr_w(path)); + + return E_NOTIMPL; +} + +HRESULT WINAPI PSGetPropertyDescription(REFPROPERTYKEY propkey, REFIID riid, void **ppv) +{ + FIXME("%p, %p, %p\n", propkey, riid, ppv); + return E_NOTIMPL; +} + +HRESULT WINAPI PSRefreshPropertySchema(void) +{ + FIXME("\n"); + return S_OK; +} + +HRESULT WINAPI PSStringFromPropertyKey(REFPROPERTYKEY pkey, LPWSTR psz, UINT cch) +{ + static const WCHAR guid_fmtW[] = {'{','%','0','8','X','-','%','0','4','X','-', + '%','0','4','X','-','%','0','2','X','%','0','2','X','-', + '%','0','2','X','%','0','2','X','%','0','2','X', + '%','0','2','X','%','0','2','X','%','0','2','X','}',0}; + static const WCHAR pid_fmtW[] = {'%','u',0}; + + WCHAR pidW[PKEY_PIDSTR_MAX + 1]; + LPWSTR p = psz; + int len; + + TRACE("(%p, %p, %u)\n", pkey, psz, cch); + + if (!psz) + return E_POINTER; + + /* GUIDSTRING_MAX accounts for null terminator, +1 for space character. */ + if (cch <= GUIDSTRING_MAX + 1) + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + + if (!pkey) + { + psz[0] = '\0'; + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + sprintfW(psz, guid_fmtW, pkey->fmtid.Data1, pkey->fmtid.Data2, + pkey->fmtid.Data3, pkey->fmtid.Data4[0], pkey->fmtid.Data4[1], + pkey->fmtid.Data4[2], pkey->fmtid.Data4[3], pkey->fmtid.Data4[4], + pkey->fmtid.Data4[5], pkey->fmtid.Data4[6], pkey->fmtid.Data4[7]); + + /* Overwrite the null terminator with the space character. */ + p += GUIDSTRING_MAX - 1; + *p++ = ' '; + cch -= GUIDSTRING_MAX - 1 + 1; + + len = sprintfW(pidW, pid_fmtW, pkey->pid); + + if (cch >= len + 1) + { + strcpyW(p, pidW); + return S_OK; + } + else + { + WCHAR *ptr = pidW + len - 1; + + psz[0] = '\0'; + *p++ = '\0'; + cch--; + + /* Replicate a quirk of the native implementation where the contents + * of the property ID string are written backwards to the output + * buffer, skipping the rightmost digit. */ + if (cch) + { + ptr--; + while (cch--) + *p++ = *ptr--; + } + + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } +} + +static const BYTE hex2bin[] = +{ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x00 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x10 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x20 */ + 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0, /* 0x30 */ + 0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0, /* 0x40 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x50 */ + 0,10,11,12,13,14,15 /* 0x60 */ +}; + +static BOOL validate_indices(LPCWSTR s, int min, int max) +{ + int i; + + for (i = min; i <= max; i++) + { + if (!s[i]) + return FALSE; + + if (i == 0) + { + if (s[i] != '{') + return FALSE; + } + else if (i == 9 || i == 14 || i == 19 || i == 24) + { + if (s[i] != '-') + return FALSE; + } + else if (i == 37) + { + if (s[i] != '}') + return FALSE; + } + else + { + if (s[i] > 'f' || (!hex2bin[s[i]] && s[i] != '0')) + return FALSE; + } + } + + return TRUE; +} + +/* Adapted from CLSIDFromString helper in dlls/ole32/compobj.c and + * UuidFromString in dlls/rpcrt4/rpcrt4_main.c. */ +static BOOL string_to_guid(LPCWSTR s, LPGUID id) +{ + /* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */ + + if (!validate_indices(s, 0, 8)) return FALSE; + id->Data1 = (hex2bin[s[1]] << 28 | hex2bin[s[2]] << 24 | hex2bin[s[3]] << 20 | hex2bin[s[4]] << 16 | + hex2bin[s[5]] << 12 | hex2bin[s[6]] << 8 | hex2bin[s[7]] << 4 | hex2bin[s[8]]); + if (!validate_indices(s, 9, 14)) return FALSE; + id->Data2 = hex2bin[s[10]] << 12 | hex2bin[s[11]] << 8 | hex2bin[s[12]] << 4 | hex2bin[s[13]]; + if (!validate_indices(s, 15, 19)) return FALSE; + id->Data3 = hex2bin[s[15]] << 12 | hex2bin[s[16]] << 8 | hex2bin[s[17]] << 4 | hex2bin[s[18]]; + + /* these are just sequential bytes */ + + if (!validate_indices(s, 20, 21)) return FALSE; + id->Data4[0] = hex2bin[s[20]] << 4 | hex2bin[s[21]]; + if (!validate_indices(s, 22, 24)) return FALSE; + id->Data4[1] = hex2bin[s[22]] << 4 | hex2bin[s[23]]; + + if (!validate_indices(s, 25, 26)) return FALSE; + id->Data4[2] = hex2bin[s[25]] << 4 | hex2bin[s[26]]; + if (!validate_indices(s, 27, 28)) return FALSE; + id->Data4[3] = hex2bin[s[27]] << 4 | hex2bin[s[28]]; + if (!validate_indices(s, 29, 30)) return FALSE; + id->Data4[4] = hex2bin[s[29]] << 4 | hex2bin[s[30]]; + if (!validate_indices(s, 31, 32)) return FALSE; + id->Data4[5] = hex2bin[s[31]] << 4 | hex2bin[s[32]]; + if (!validate_indices(s, 33, 34)) return FALSE; + id->Data4[6] = hex2bin[s[33]] << 4 | hex2bin[s[34]]; + if (!validate_indices(s, 35, 37)) return FALSE; + id->Data4[7] = hex2bin[s[35]] << 4 | hex2bin[s[36]]; + + return TRUE; +} + +HRESULT WINAPI PSPropertyKeyFromString(LPCWSTR pszString, PROPERTYKEY *pkey) +{ + int has_minus = 0, has_comma = 0; + + TRACE("(%s, %p)\n", debugstr_w(pszString), pkey); + + if (!pszString || !pkey) + return E_POINTER; + + memset(pkey, 0, sizeof(PROPERTYKEY)); + + if (!string_to_guid(pszString, &pkey->fmtid)) + return E_INVALIDARG; + + pszString += GUIDSTRING_MAX - 1; + + if (!*pszString) + return E_INVALIDARG; + + /* Only the space seems to be recognized as whitespace. The comma is only + * recognized once and processing terminates if another comma is found. */ + while (*pszString == ' ' || *pszString == ',') + { + if (*pszString == ',') + { + if (has_comma) + return S_OK; + else + has_comma = 1; + } + pszString++; + } + + if (!*pszString) + return E_INVALIDARG; + + /* Only two minus signs are recognized if no comma is detected. The first + * sign is ignored, and the second is interpreted. If a comma is detected + * before the minus sign, then only one minus sign counts, and property ID + * interpretation begins with the next character. */ + if (has_comma) + { + if (*pszString == '-') + { + has_minus = 1; + pszString++; + } + } + else + { + if (*pszString == '-') + pszString++; + + /* Skip any intermediate spaces after the first minus sign. */ + while (*pszString == ' ') + pszString++; + + if (*pszString == '-') + { + has_minus = 1; + pszString++; + } + + /* Skip any remaining spaces after minus sign. */ + while (*pszString == ' ') + pszString++; + } + + /* Overflow is not checked. */ + while (isdigitW(*pszString)) + { + pkey->pid *= 10; + pkey->pid += (*pszString - '0'); + pszString++; + } + + if (has_minus) + pkey->pid = ~pkey->pid + 1; + + return S_OK; +} diff --git a/dll/win32/propsys/propsys_private.h b/dll/win32/propsys/propsys_private.h new file mode 100644 index 00000000000..35bbb4d5a36 --- /dev/null +++ b/dll/win32/propsys/propsys_private.h @@ -0,0 +1,21 @@ +/* + * propsys private definitions + * + * Copyright 2012 Vincent Povirk for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +HRESULT PropertyStore_CreateInstance(IUnknown *outer, REFIID riid, void **ppv) DECLSPEC_HIDDEN; diff --git a/dll/win32/propsys/propvar.c b/dll/win32/propsys/propvar.c new file mode 100644 index 00000000000..117d7f54f2a --- /dev/null +++ b/dll/win32/propsys/propvar.c @@ -0,0 +1,603 @@ +/* + * PropVariant implementation + * + * Copyright 2008 James Hawkins for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include +#include + +#define NONAMELESSUNION + +#include +#include +//#include "winerror.h" +#include +//#include "winuser.h" +#include +#include + +#include +#include + +WINE_DEFAULT_DEBUG_CHANNEL(propsys); + +static HRESULT PROPVAR_ConvertFILETIME(PROPVARIANT *ppropvarDest, + REFPROPVARIANT propvarSrc, VARTYPE vt) +{ + SYSTEMTIME time; + + FileTimeToSystemTime(&propvarSrc->u.filetime, &time); + + switch (vt) + { + case VT_LPSTR: + { + static const char format[] = "%04d/%02d/%02d:%02d:%02d:%02d.%03d"; + + ppropvarDest->u.pszVal = HeapAlloc(GetProcessHeap(), 0, + lstrlenA(format) + 1); + if (!ppropvarDest->u.pszVal) + return E_OUTOFMEMORY; + + sprintf(ppropvarDest->u.pszVal, format, time.wYear, time.wMonth, + time.wDay, time.wHour, time.wMinute, + time.wSecond, time.wMilliseconds); + + return S_OK; + } + + default: + FIXME("Unhandled target type: %d\n", vt); + } + + return E_FAIL; +} + +static HRESULT PROPVAR_ConvertNumber(REFPROPVARIANT pv, int dest_bits, + int dest_signed, LONGLONG *res) +{ + int src_signed; + + switch (pv->vt) + { + case VT_I1: + src_signed = 1; + *res = pv->u.cVal; + break; + case VT_UI1: + src_signed = 0; + *res = pv->u.bVal; + break; + case VT_I2: + src_signed = 1; + *res = pv->u.iVal; + break; + case VT_UI2: + src_signed = 0; + *res = pv->u.uiVal; + break; + case VT_I4: + src_signed = 1; + *res = pv->u.lVal; + break; + case VT_UI4: + src_signed = 0; + *res = pv->u.ulVal; + break; + case VT_I8: + src_signed = 1; + *res = pv->u.hVal.QuadPart; + break; + case VT_UI8: + src_signed = 0; + *res = pv->u.uhVal.QuadPart; + break; + case VT_EMPTY: + src_signed = 0; + *res = 0; + break; + default: + FIXME("unhandled vt %d\n", pv->vt); + return E_NOTIMPL; + } + + if (*res < 0 && src_signed != dest_signed) + return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); + + if (dest_bits < 64) + { + if (dest_signed) + { + if (*res >= ((LONGLONG)1 << (dest_bits-1)) || + *res < ((LONGLONG)-1 << (dest_bits-1))) + return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); + } + else + { + if ((ULONGLONG)(*res) >= ((ULONGLONG)1 << dest_bits)) + return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); + } + } + + return S_OK; +} + +HRESULT WINAPI PropVariantToInt16(REFPROPVARIANT propvarIn, SHORT *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("%p,%p\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 16, 1, &res); + if (SUCCEEDED(hr)) *ret = (SHORT)res; + return hr; +} + +HRESULT WINAPI PropVariantToInt32(REFPROPVARIANT propvarIn, LONG *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("%p,%p\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 32, 1, &res); + if (SUCCEEDED(hr)) *ret = (LONG)res; + return hr; +} + +HRESULT WINAPI PropVariantToInt64(REFPROPVARIANT propvarIn, LONGLONG *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("%p,%p\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 64, 1, &res); + if (SUCCEEDED(hr)) *ret = (LONGLONG)res; + return hr; +} + +HRESULT WINAPI PropVariantToUInt16(REFPROPVARIANT propvarIn, USHORT *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("%p,%p\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 16, 0, &res); + if (SUCCEEDED(hr)) *ret = (USHORT)res; + return hr; +} + +HRESULT WINAPI PropVariantToUInt32(REFPROPVARIANT propvarIn, ULONG *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("%p,%p\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 32, 0, &res); + if (SUCCEEDED(hr)) *ret = (ULONG)res; + return hr; +} + +HRESULT WINAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("%p,%p\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 64, 0, &res); + if (SUCCEEDED(hr)) *ret = (ULONGLONG)res; + return hr; +} + +/****************************************************************** + * PropVariantChangeType (PROPSYS.@) + */ +HRESULT WINAPI PropVariantChangeType(PROPVARIANT *ppropvarDest, REFPROPVARIANT propvarSrc, + PROPVAR_CHANGE_FLAGS flags, VARTYPE vt) +{ + HRESULT hr; + + FIXME("(%p, %p, %d, %d, %d): semi-stub!\n", ppropvarDest, propvarSrc, + propvarSrc->vt, flags, vt); + + switch (vt) + { + case VT_I2: + { + SHORT res; + hr = PropVariantToInt16(propvarSrc, &res); + if (SUCCEEDED(hr)) + { + ppropvarDest->vt = VT_I2; + ppropvarDest->u.iVal = res; + } + return hr; + } + case VT_UI2: + { + USHORT res; + hr = PropVariantToUInt16(propvarSrc, &res); + if (SUCCEEDED(hr)) + { + ppropvarDest->vt = VT_UI2; + ppropvarDest->u.uiVal = res; + } + return hr; + } + case VT_I4: + { + LONG res; + hr = PropVariantToInt32(propvarSrc, &res); + if (SUCCEEDED(hr)) + { + ppropvarDest->vt = VT_I4; + ppropvarDest->u.lVal = res; + } + return hr; + } + case VT_UI4: + { + ULONG res; + hr = PropVariantToUInt32(propvarSrc, &res); + if (SUCCEEDED(hr)) + { + ppropvarDest->vt = VT_UI4; + ppropvarDest->u.ulVal = res; + } + return hr; + } + case VT_I8: + { + LONGLONG res; + hr = PropVariantToInt64(propvarSrc, &res); + if (SUCCEEDED(hr)) + { + ppropvarDest->vt = VT_I8; + ppropvarDest->u.hVal.QuadPart = res; + } + return hr; + } + case VT_UI8: + { + ULONGLONG res; + hr = PropVariantToUInt64(propvarSrc, &res); + if (SUCCEEDED(hr)) + { + ppropvarDest->vt = VT_UI8; + ppropvarDest->u.uhVal.QuadPart = res; + } + return hr; + } + } + + switch (propvarSrc->vt) + { + case VT_FILETIME: + return PROPVAR_ConvertFILETIME(ppropvarDest, propvarSrc, vt); + default: + FIXME("Unhandled source type: %d\n", propvarSrc->vt); + } + + return E_FAIL; +} + +static void PROPVAR_GUIDToWSTR(REFGUID guid, WCHAR *str) +{ + static const WCHAR format[] = {'{','%','0','8','X','-','%','0','4','X','-','%','0','4','X', + '-','%','0','2','X','%','0','2','X','-','%','0','2','X','%','0','2','X','%','0','2','X', + '%','0','2','X','%','0','2','X','%','0','2','X','}',0}; + + sprintfW(str, format, guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], + guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]); +} + +HRESULT WINAPI InitPropVariantFromGUIDAsString(REFGUID guid, PROPVARIANT *ppropvar) +{ + TRACE("(%p %p)\n", guid, ppropvar); + + if(!guid) + return E_FAIL; + + ppropvar->vt = VT_LPWSTR; + ppropvar->u.pwszVal = CoTaskMemAlloc(39*sizeof(WCHAR)); + if(!ppropvar->u.pwszVal) + return E_OUTOFMEMORY; + + PROPVAR_GUIDToWSTR(guid, ppropvar->u.pwszVal); + return S_OK; +} + +HRESULT WINAPI InitVariantFromGUIDAsString(REFGUID guid, VARIANT *pvar) +{ + TRACE("(%p %p)\n", guid, pvar); + + if(!guid) { + FIXME("guid == NULL\n"); + return E_FAIL; + } + + V_VT(pvar) = VT_BSTR; + V_BSTR(pvar) = SysAllocStringLen(NULL, 38); + if(!V_BSTR(pvar)) + return E_OUTOFMEMORY; + + PROPVAR_GUIDToWSTR(guid, V_BSTR(pvar)); + return S_OK; +} + +HRESULT WINAPI InitPropVariantFromBuffer(const VOID *pv, UINT cb, PROPVARIANT *ppropvar) +{ + TRACE("(%p %u %p)\n", pv, cb, ppropvar); + + ppropvar->u.caub.pElems = CoTaskMemAlloc(cb); + if(!ppropvar->u.caub.pElems) + return E_OUTOFMEMORY; + + ppropvar->vt = VT_VECTOR|VT_UI1; + ppropvar->u.caub.cElems = cb; + memcpy(ppropvar->u.caub.pElems, pv, cb); + return S_OK; +} + +HRESULT WINAPI InitVariantFromBuffer(const VOID *pv, UINT cb, VARIANT *pvar) +{ + SAFEARRAY *arr; + void *data; + HRESULT hres; + + TRACE("(%p %u %p)\n", pv, cb, pvar); + + arr = SafeArrayCreateVector(VT_UI1, 0, cb); + if(!arr) + return E_OUTOFMEMORY; + + hres = SafeArrayAccessData(arr, &data); + if(FAILED(hres)) { + SafeArrayDestroy(arr); + return hres; + } + + memcpy(data, pv, cb); + + hres = SafeArrayUnaccessData(arr); + if(FAILED(hres)) { + SafeArrayDestroy(arr); + return hres; + } + + V_VT(pvar) = VT_ARRAY|VT_UI1; + V_ARRAY(pvar) = arr; + return S_OK; +} + +static inline DWORD PROPVAR_HexToNum(const WCHAR *hex) +{ + DWORD ret; + + if(hex[0]>='0' && hex[0]<='9') + ret = hex[0]-'0'; + else if(hex[0]>='a' && hex[0]<='f') + ret = hex[0]-'a'+10; + else if(hex[0]>='A' && hex[0]<='F') + ret = hex[0]-'A'+10; + else + return -1; + + ret <<= 4; + if(hex[1]>='0' && hex[1]<='9') + return ret + hex[1]-'0'; + else if(hex[1]>='a' && hex[1]<='f') + return ret + hex[1]-'a'+10; + else if(hex[1]>='A' && hex[1]<='F') + return ret + hex[1]-'A'+10; + else + return -1; +} + +static inline HRESULT PROPVAR_WCHARToGUID(const WCHAR *str, int len, GUID *guid) +{ + DWORD i, val=0; + const WCHAR *p; + + memset(guid, 0, sizeof(GUID)); + + if(len!=38 || str[0]!='{' || str[9]!='-' || str[14]!='-' + || str[19]!='-' || str[24]!='-' || str[37]!='}') { + WARN("Error parsing %s\n", debugstr_w(str)); + return E_INVALIDARG; + } + + p = str+1; + for(i=0; i<4 && val!=-1; i++) { + val = PROPVAR_HexToNum(p); + guid->Data1 = (guid->Data1<<8) + val; + p += 2; + } + p++; + for(i=0; i<2 && val!=-1; i++) { + val = PROPVAR_HexToNum(p); + guid->Data2 = (guid->Data2<<8) + val; + p += 2; + } + p++; + for(i=0; i<2 && val!=-1; i++) { + val = PROPVAR_HexToNum(p); + guid->Data3 = (guid->Data3<<8) + val; + p += 2; + } + p++; + for(i=0; i<8 && val!=-1; i++) { + if(i == 2) + p++; + + val = guid->Data4[i] = PROPVAR_HexToNum(p); + p += 2; + } + + if(val == -1) { + WARN("Error parsing %s\n", debugstr_w(str)); + memset(guid, 0, sizeof(GUID)); + return E_INVALIDARG; + } + return S_OK; +} + +HRESULT WINAPI PropVariantToGUID(const PROPVARIANT *ppropvar, GUID *guid) +{ + TRACE("%p %p)\n", ppropvar, guid); + + switch(ppropvar->vt) { + case VT_BSTR: + return PROPVAR_WCHARToGUID(ppropvar->u.bstrVal, SysStringLen(ppropvar->u.bstrVal), guid); + case VT_LPWSTR: + return PROPVAR_WCHARToGUID(ppropvar->u.pwszVal, strlenW(ppropvar->u.pwszVal), guid); + + default: + FIXME("unsupported vt: %d\n", ppropvar->vt); + return E_NOTIMPL; + } +} + +HRESULT WINAPI VariantToGUID(const VARIANT *pvar, GUID *guid) +{ + TRACE("(%p %p)\n", pvar, guid); + + switch(V_VT(pvar)) { + case VT_BSTR: { + HRESULT hres = PROPVAR_WCHARToGUID(V_BSTR(pvar), SysStringLen(V_BSTR(pvar)), guid); + if(hres == E_INVALIDARG) + return E_FAIL; + return hres; + } + + default: + FIXME("unsupported vt: %d\n", V_VT(pvar)); + return E_NOTIMPL; + } +} + +static int isemptyornull(const PROPVARIANT *propvar) +{ + if (propvar->vt == VT_EMPTY || propvar->vt == VT_NULL) + return 1; + if ((propvar->vt & VT_ARRAY) == VT_ARRAY) + { + int i; + for (i=0; iu.parray->cDims; i++) + { + if (propvar->u.parray->rgsabound[i].cElements != 0) + break; + } + return i == propvar->u.parray->cDims; + } + /* FIXME: vectors, byrefs, errors? */ + return 0; +} + +INT WINAPI PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2, + PROPVAR_COMPARE_UNIT unit, PROPVAR_COMPARE_FLAGS flags) +{ + const PROPVARIANT *propvar2_converted; + PROPVARIANT propvar2_static; + HRESULT hr; + INT res=-1; + + TRACE("%p,%p,%x,%x\n", propvar1, propvar2, unit, flags); + + if (isemptyornull(propvar1)) + { + if (isemptyornull(propvar2)) + return 0; + return (flags & PVCF_TREATEMPTYASGREATERTHAN) ? 1 : -1; + } + + if (isemptyornull(propvar2)) + return (flags & PVCF_TREATEMPTYASGREATERTHAN) ? -1 : 1; + + if (propvar1->vt != propvar2->vt) + { + hr = PropVariantChangeType(&propvar2_static, propvar2, 0, propvar1->vt); + + if (FAILED(hr)) + return -1; + + propvar2_converted = &propvar2_static; + } + else + propvar2_converted = propvar2; + +#define CMP_INT_VALUE(var) do { \ + if (propvar1->u.var > propvar2_converted->u.var) \ + res = 1; \ + else if (propvar1->u.var < propvar2_converted->u.var) \ + res = -1; \ + else \ + res = 0; \ + } while (0) + + switch (propvar1->vt) + { + case VT_I1: + CMP_INT_VALUE(cVal); + break; + case VT_UI1: + CMP_INT_VALUE(bVal); + break; + case VT_I2: + CMP_INT_VALUE(iVal); + break; + case VT_UI2: + CMP_INT_VALUE(uiVal); + break; + case VT_I4: + CMP_INT_VALUE(lVal); + break; + case VT_UI4: + CMP_INT_VALUE(uiVal); + break; + case VT_I8: + CMP_INT_VALUE(hVal.QuadPart); + break; + case VT_UI8: + CMP_INT_VALUE(uhVal.QuadPart); + break; + case VT_BSTR: + /* FIXME: Use string flags. */ + res = lstrcmpW(propvar1->u.bstrVal, propvar2->u.bstrVal); + break; + default: + FIXME("vartype %d not handled\n", propvar1->vt); + res = -1; + break; + } + + if (propvar2_converted == &propvar2_static) + PropVariantClear(&propvar2_static); + + return res; +} diff --git a/dll/win32/samsrv/samrpc.c b/dll/win32/samsrv/samrpc.c index 24892e596aa..fd1d4f34684 100644 --- a/dll/win32/samsrv/samrpc.c +++ b/dll/win32/samsrv/samrpc.c @@ -62,6 +62,22 @@ PGENERIC_MAPPING pServerMapping = &ServerMapping; /* FUNCTIONS *****************************************************************/ +static +LARGE_INTEGER +SampAddRelativeTimeToTime(IN LARGE_INTEGER AbsoluteTime, + IN LARGE_INTEGER RelativeTime) +{ + LARGE_INTEGER NewTime; + + NewTime.QuadPart = AbsoluteTime.QuadPart - RelativeTime.QuadPart; + + if (NewTime.QuadPart < 0) + NewTime.QuadPart = 0; + + return NewTime; +} + + VOID SampStartRpcServer(VOID) { @@ -5269,7 +5285,10 @@ SampQueryUserLogon(PSAM_DB_OBJECT UserObject, PSAMPR_USER_INFO_BUFFER *Buffer) { PSAMPR_USER_INFO_BUFFER InfoBuffer = NULL; + SAM_DOMAIN_FIXED_DATA DomainFixedData; SAM_USER_FIXED_DATA FixedData; + LARGE_INTEGER PasswordCanChange; + LARGE_INTEGER PasswordMustChange; ULONG Length = 0; NTSTATUS Status; @@ -5279,6 +5298,17 @@ SampQueryUserLogon(PSAM_DB_OBJECT UserObject, if (InfoBuffer == NULL) return STATUS_INSUFFICIENT_RESOURCES; + /* Get the fixed size domain data */ + Length = sizeof(SAM_DOMAIN_FIXED_DATA); + Status = SampGetObjectAttribute(UserObject->ParentObject, + L"F", + NULL, + (PVOID)&DomainFixedData, + &Length); + if (!NT_SUCCESS(Status)) + goto done; + + /* Get the fixed size user data */ Length = sizeof(SAM_USER_FIXED_DATA); Status = SampGetObjectAttribute(UserObject, L"F", @@ -5300,8 +5330,15 @@ SampQueryUserLogon(PSAM_DB_OBJECT UserObject, InfoBuffer->Logon.LogonCount = FixedData.LogonCount; InfoBuffer->Logon.UserAccountControl = FixedData.UserAccountControl; -// OLD_LARGE_INTEGER PasswordCanChange; -// OLD_LARGE_INTEGER PasswordMustChange; + PasswordCanChange = SampAddRelativeTimeToTime(FixedData.PasswordLastSet, + DomainFixedData.MinPasswordAge); + InfoBuffer->Logon.PasswordCanChange.LowPart = PasswordCanChange.LowPart; + InfoBuffer->Logon.PasswordCanChange.HighPart = PasswordCanChange.HighPart; + + PasswordMustChange = SampAddRelativeTimeToTime(FixedData.PasswordLastSet, + DomainFixedData.MaxPasswordAge); + InfoBuffer->Logon.PasswordMustChange.LowPart = PasswordMustChange.LowPart; + InfoBuffer->Logon.PasswordMustChange.HighPart = PasswordMustChange.HighPart; /* Get the Name string */ Status = SampGetObjectAttributeString(UserObject, @@ -6179,6 +6216,276 @@ done: } +static NTSTATUS +SampQueryUserAll(PSAM_DB_OBJECT UserObject, + PSAMPR_USER_INFO_BUFFER *Buffer) +{ + PSAMPR_USER_INFO_BUFFER InfoBuffer = NULL; + SAM_DOMAIN_FIXED_DATA DomainFixedData; + SAM_USER_FIXED_DATA FixedData; + LARGE_INTEGER PasswordCanChange; + LARGE_INTEGER PasswordMustChange; + ULONG Length = 0; + NTSTATUS Status; + + *Buffer = NULL; + + InfoBuffer = midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER)); + if (InfoBuffer == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + /* Get the fixed size domain data */ + Length = sizeof(SAM_DOMAIN_FIXED_DATA); + Status = SampGetObjectAttribute(UserObject->ParentObject, + L"F", + NULL, + (PVOID)&DomainFixedData, + &Length); + if (!NT_SUCCESS(Status)) + goto done; + + /* Get the fixed size user data */ + Length = sizeof(SAM_USER_FIXED_DATA); + Status = SampGetObjectAttribute(UserObject, + L"F", + NULL, + (PVOID)&FixedData, + &Length); + if (!NT_SUCCESS(Status)) + goto done; + + if (UserObject->Access & USER_READ_GENERAL) + { + /* Get the Name string */ + Status = SampGetObjectAttributeString(UserObject, + L"Name", + &InfoBuffer->All.UserName); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the FullName string */ + Status = SampGetObjectAttributeString(UserObject, + L"FullName", + &InfoBuffer->All.FullName); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the user ID*/ + InfoBuffer->All.UserId = FixedData.UserId; + + /* Get the primary group ID */ + InfoBuffer->All.PrimaryGroupId = FixedData.PrimaryGroupId; + + /* Get the AdminComment string */ + Status = SampGetObjectAttributeString(UserObject, + L"AdminComment", + &InfoBuffer->All.AdminComment); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the UserComment string */ + Status = SampGetObjectAttributeString(UserObject, + L"UserComment", + &InfoBuffer->All.UserComment); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + InfoBuffer->All.WhichFields |= USER_ALL_READ_GENERAL_MASK; +// USER_ALL_USERNAME | +// USER_ALL_FULLNAME | +// USER_ALL_USERID | +// USER_ALL_PRIMARYGROUPID | +// USER_ALL_ADMINCOMMENT | +// USER_ALL_USERCOMMENT; + } + + if (UserObject->Access & USER_READ_LOGON) + { + /* Get the HomeDirectory string */ + Status = SampGetObjectAttributeString(UserObject, + L"HomeDirectory", + &InfoBuffer->All.HomeDirectory); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the HomeDirectoryDrive string */ + Status = SampGetObjectAttributeString(UserObject, + L"HomeDirectoryDrive", + &InfoBuffer->Home.HomeDirectoryDrive); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the ScriptPath string */ + Status = SampGetObjectAttributeString(UserObject, + L"ScriptPath", + &InfoBuffer->All.ScriptPath); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the ProfilePath string */ + Status = SampGetObjectAttributeString(UserObject, + L"ProfilePath", + &InfoBuffer->All.ProfilePath); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the WorkStations string */ + Status = SampGetObjectAttributeString(UserObject, + L"WorkStations", + &InfoBuffer->All.WorkStations); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + InfoBuffer->All.LastLogon.LowPart = FixedData.LastLogon.LowPart; + InfoBuffer->All.LastLogon.HighPart = FixedData.LastLogon.HighPart; + + InfoBuffer->All.LastLogoff.LowPart = FixedData.LastLogoff.LowPart; + InfoBuffer->All.LastLogoff.HighPart = FixedData.LastLogoff.HighPart; + +// USER_ALL_LOGONHOURS + + InfoBuffer->All.BadPasswordCount = FixedData.BadPasswordCount; + + InfoBuffer->All.LogonCount = FixedData.LogonCount; + + PasswordCanChange = SampAddRelativeTimeToTime(FixedData.PasswordLastSet, + DomainFixedData.MinPasswordAge); + InfoBuffer->All.PasswordCanChange.LowPart = PasswordCanChange.LowPart; + InfoBuffer->All.PasswordCanChange.HighPart = PasswordCanChange.HighPart; + + PasswordMustChange = SampAddRelativeTimeToTime(FixedData.PasswordLastSet, + DomainFixedData.MaxPasswordAge); + InfoBuffer->All.PasswordMustChange.LowPart = PasswordMustChange.LowPart; + InfoBuffer->All.PasswordMustChange.HighPart = PasswordMustChange.HighPart; + + InfoBuffer->All. WhichFields |= /* USER_ALL_READ_LOGON_MASK; */ + USER_ALL_HOMEDIRECTORY | + USER_ALL_HOMEDIRECTORYDRIVE | + USER_ALL_SCRIPTPATH | + USER_ALL_PROFILEPATH | + USER_ALL_WORKSTATIONS | + USER_ALL_LASTLOGON | + USER_ALL_LASTLOGOFF | +// USER_ALL_LOGONHOURS | + USER_ALL_BADPASSWORDCOUNT | + USER_ALL_LOGONCOUNT; + USER_ALL_PASSWORDCANCHANGE | + USER_ALL_PASSWORDMUSTCHANGE; + } + + if (UserObject->Access & USER_READ_ACCOUNT) + { + InfoBuffer->All.PasswordLastSet.LowPart = FixedData.PasswordLastSet.LowPart; + InfoBuffer->All.PasswordLastSet.HighPart = FixedData.PasswordLastSet.HighPart; + + InfoBuffer->All.AccountExpires.LowPart = FixedData.AccountExpires.LowPart; + InfoBuffer->All.AccountExpires.HighPart = FixedData.AccountExpires.HighPart; + + InfoBuffer->All.UserAccountControl = FixedData.UserAccountControl; + + /* Get the Parameters string */ + Status = SampGetObjectAttributeString(UserObject, + L"Parameters", + &InfoBuffer->All.Parameters); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + InfoBuffer->All. WhichFields |= USER_ALL_READ_ACCOUNT_MASK; +// USER_ALL_PASSWORDLASTSET | +// USER_ALL_ACCOUNTEXPIRES | +// USER_ALL_USERACCOUNTCONTROL | +// USER_ALL_PARAMETERS; + } + + if (UserObject->Access & USER_READ_PREFERENCES) + { + InfoBuffer->All.CountryCode = FixedData.CountryCode; + + InfoBuffer->All.CodePage = FixedData.CodePage; + + InfoBuffer->All. WhichFields |= USER_ALL_READ_PREFERENCES_MASK; +// USER_ALL_COUNTRYCODE | +// USER_ALL_CODEPAGE; + } + + *Buffer = InfoBuffer; + +done: + if (!NT_SUCCESS(Status)) + { + if (InfoBuffer != NULL) + { + if (InfoBuffer->All.UserName.Buffer != NULL) + midl_user_free(InfoBuffer->All.UserName.Buffer); + + if (InfoBuffer->All.FullName.Buffer != NULL) + midl_user_free(InfoBuffer->All.FullName.Buffer); + + if (InfoBuffer->All.AdminComment.Buffer != NULL) + midl_user_free(InfoBuffer->All.AdminComment.Buffer); + + if (InfoBuffer->All.UserComment.Buffer != NULL) + midl_user_free(InfoBuffer->All.UserComment.Buffer); + + if (InfoBuffer->All.HomeDirectory.Buffer != NULL) + midl_user_free(InfoBuffer->All.HomeDirectory.Buffer); + + if (InfoBuffer->All.HomeDirectoryDrive.Buffer != NULL) + midl_user_free(InfoBuffer->All.HomeDirectoryDrive.Buffer); + + if (InfoBuffer->All.ScriptPath.Buffer != NULL) + midl_user_free(InfoBuffer->All.ScriptPath.Buffer); + + if (InfoBuffer->All.ProfilePath.Buffer != NULL) + midl_user_free(InfoBuffer->All.ProfilePath.Buffer); + + if (InfoBuffer->All.WorkStations.Buffer != NULL) + midl_user_free(InfoBuffer->All.WorkStations.Buffer); + + if (InfoBuffer->All.LogonHours.LogonHours != NULL) + midl_user_free(InfoBuffer->All.LogonHours.LogonHours); + + if (InfoBuffer->All.Parameters.Buffer != NULL) + midl_user_free(InfoBuffer->All.Parameters.Buffer); + + midl_user_free(InfoBuffer); + } + } + + return Status; +} + + /* Function 36 */ NTSTATUS NTAPI @@ -6232,6 +6539,7 @@ SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle, break; case UserInternal1Information: + case UserAllInformation: DesiredAccess = 0; break; @@ -6341,7 +6649,11 @@ SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle, Buffer); break; -// case UserAllInformation: + case UserAllInformation: + Status = SampQueryUserAll(UserObject, + Buffer); + break; + // case UserInternal4Information: // case UserInternal5Information: // case UserInternal4InformationNew: diff --git a/dll/win32/shell32/CMakeLists.txt b/dll/win32/shell32/CMakeLists.txt index 41660cfe658..6ee35190979 100644 --- a/dll/win32/shell32/CMakeLists.txt +++ b/dll/win32/shell32/CMakeLists.txt @@ -107,6 +107,6 @@ add_importlibs(shell32 kernel32 ntdll) -add_dependencies(shdocvw shdocvw_v1) +add_dependencies(shell32 shdocvw_v1) add_pch(shell32 precomp.h) add_cd_file(TARGET shell32 DESTINATION reactos/system32 FOR all) diff --git a/dll/win32/shlwapi/istream.c b/dll/win32/shlwapi/istream.c index 1946e7e62b7..3a87dc4ee4c 100644 --- a/dll/win32/shlwapi/istream.c +++ b/dll/win32/shlwapi/istream.c @@ -531,7 +531,7 @@ HRESULT WINAPI SHCreateStreamOnFileA(LPCSTR lpszPath, DWORD dwMode, if (!lpszPath) return HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND); - MultiByteToWideChar(0, 0, lpszPath, -1, szPath, MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, lpszPath, -1, szPath, MAX_PATH); return SHCreateStreamOnFileW(szPath, dwMode, lppStream); } diff --git a/dll/win32/shlwapi/ordinal.c b/dll/win32/shlwapi/ordinal.c index dfd50c5a5a3..d832d1bbc40 100644 --- a/dll/win32/shlwapi/ordinal.c +++ b/dll/win32/shlwapi/ordinal.c @@ -641,25 +641,6 @@ INT WINAPI SHStringFromGUIDW(REFGUID guid, LPWSTR lpszDest, INT cchMax) return iLen; } -/************************************************************************* - * @ [SHLWAPI.29] - * - * Determine if a Unicode character is a space. - * - * PARAMS - * wc [I] Character to check. - * - * RETURNS - * TRUE, if wc is a space, - * FALSE otherwise. - */ -BOOL WINAPI IsCharSpaceW(WCHAR wc) -{ - WORD CharType; - - return GetStringTypeW(CT_CTYPE1, &wc, 1, &CharType) && (CharType & C1_SPACE); -} - /************************************************************************* * @ [SHLWAPI.30] * @@ -2680,7 +2661,7 @@ DWORD WINAPI SHGetRestriction(LPCWSTR lpSubKey, LPCWSTR lpSubName, LPCWSTR lpVal lpSubKey = strRegistryPolicyW; retval = RegOpenKeyW(HKEY_LOCAL_MACHINE, lpSubKey, &hKey); - if (retval != ERROR_SUCCESS) + if (retval != ERROR_SUCCESS) retval = RegOpenKeyW(HKEY_CURRENT_USER, lpSubKey, &hKey); if (retval != ERROR_SUCCESS) return 0; @@ -2728,7 +2709,7 @@ DWORD WINAPI SHRestrictionLookup( /* we have a known policy */ /* check if this policy has been cached */ - if (*polArr == SHELL_NO_POLICY) + if (*polArr == SHELL_NO_POLICY) *polArr = SHGetRestriction(initial, polTable->appstr, polTable->keystr); return *polArr; } diff --git a/dll/win32/shlwapi/path.c b/dll/win32/shlwapi/path.c index 9fb8ac0eaf2..47fb520b522 100644 --- a/dll/win32/shlwapi/path.c +++ b/dll/win32/shlwapi/path.c @@ -3246,6 +3246,9 @@ HRESULT WINAPI PathCreateFromUrlA(LPCSTR pszUrl, LPSTR pszPath, HRESULT ret; DWORD lenW = sizeof(bufW)/sizeof(WCHAR), lenA; + if (!pszUrl || !pszPath || !pcchPath || !*pcchPath) + return E_INVALIDARG; + if(!RtlCreateUnicodeStringFromAsciiz(&urlW, pszUrl)) return E_INVALIDARG; if((ret = PathCreateFromUrlW(urlW.Buffer, pathW, &lenW, dwReserved)) == E_POINTER) { @@ -3287,61 +3290,156 @@ HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwReserved) { static const WCHAR file_colon[] = { 'f','i','l','e',':',0 }; - HRESULT hr; - DWORD nslashes = 0; - WCHAR *ptr; + static const WCHAR localhost[] = { 'l','o','c','a','l','h','o','s','t',0 }; + DWORD nslashes, unescape, len; + const WCHAR *src; + WCHAR *tpath, *dst; + HRESULT ret; TRACE("(%s,%p,%p,0x%08x)\n", debugstr_w(pszUrl), pszPath, pcchPath, dwReserved); if (!pszUrl || !pszPath || !pcchPath || !*pcchPath) return E_INVALIDARG; - - if (strncmpW(pszUrl, file_colon, 5)) + if (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pszUrl, 5, + file_colon, 5) != CSTR_EQUAL) return E_INVALIDARG; pszUrl += 5; + ret = S_OK; - while(*pszUrl == '/' || *pszUrl == '\\') { + src = pszUrl; + nslashes = 0; + while (*src == '/' || *src == '\\') { nslashes++; - pszUrl++; + src++; } - if(isalphaW(*pszUrl) && (pszUrl[1] == ':' || pszUrl[1] == '|') && (pszUrl[2] == '/' || pszUrl[2] == '\\')) - nslashes = 0; + /* We need a temporary buffer so we can compute what size to ask for. + * We know that the final string won't be longer than the current pszUrl + * plus at most two backslashes. All the other transformations make it + * shorter. + */ + len = 2 + lstrlenW(pszUrl) + 1; + if (*pcchPath < len) + tpath = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + else + tpath = pszPath; - switch(nslashes) { - case 2: - pszUrl -= 2; - break; + len = 0; + dst = tpath; + unescape = 1; + switch (nslashes) + { case 0: + /* 'file:' + escaped DOS path */ break; + case 1: + /* 'file:/' + escaped DOS path */ + /* fall through */ + case 3: + /* 'file:///' (implied localhost) + escaped DOS path */ + if (!isalphaW(*src) || (src[1] != ':' && src[1] != '|')) + src -= 1; + break; + case 2: + if (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, src, 9, + localhost, 9) == CSTR_EQUAL && + (src[9] == '/' || src[9] == '\\')) + { + /* 'file://localhost/' + escaped DOS path */ + src += 10; + } + else if (isalphaW(*src) && (src[1] == ':' || src[1] == '|')) + { + /* 'file://' + unescaped DOS path */ + unescape = 0; + } + else + { + /* 'file://hostname:port/path' (where path is escaped) + * or 'file:' + escaped UNC path (\\server\share\path) + * The second form is clearly specific to Windows and it might + * even be doing a network lookup to try to figure it out. + */ + while (*src && *src != '/' && *src != '\\') + src++; + len = src - pszUrl; + StrCpyNW(dst, pszUrl, len + 1); + dst += len; + if (isalphaW(src[1]) && (src[2] == ':' || src[2] == '|')) + { + /* 'Forget' to add a trailing '/', just like Windows */ + src++; + } + } + break; + case 4: + /* 'file://' + unescaped UNC path (\\server\share\path) */ + unescape = 0; + if (isalphaW(*src) && (src[1] == ':' || src[1] == '|')) + break; + /* fall through */ default: - pszUrl -= 1; - break; + /* 'file:/...' + escaped UNC path (\\server\share\path) */ + src -= 2; } - hr = UrlUnescapeW((LPWSTR)pszUrl, pszPath, pcchPath, 0); - if(hr != S_OK) return hr; + /* Copy the remainder of the path */ + len += lstrlenW(src); + StrCpyW(dst, src); - for(ptr = pszPath; *ptr; ptr++) - if(*ptr == '/') *ptr = '\\'; + /* First do the Windows-specific path conversions */ + for (dst = tpath; *dst; dst++) + if (*dst == '/') *dst = '\\'; + if (isalphaW(*tpath) && tpath[1] == '|') + tpath[1] = ':'; /* c| -> c: */ - while(*pszPath == '\\') - pszPath++; - - if(isalphaW(*pszPath) && pszPath[1] == '|' && pszPath[2] == '\\') /* c|\ -> c:\ */ - pszPath[1] = ':'; - - if(nslashes == 2 && (ptr = strchrW(pszPath, '\\'))) { /* \\host\c:\ -> \\hostc:\ */ - ptr++; - if(isalphaW(*ptr) && (ptr[1] == ':' || ptr[1] == '|') && ptr[2] == '\\') { - memmove(ptr - 1, ptr, (strlenW(ptr) + 1) * sizeof(WCHAR)); - (*pcchPath)--; + /* And only then unescape the path (i.e. escaped slashes are left as is) */ + if (unescape) + { + ret = UrlUnescapeW(tpath, NULL, &len, URL_UNESCAPE_INPLACE); + if (ret == S_OK) + { + /* When working in-place UrlUnescapeW() does not set len */ + len = lstrlenW(tpath); } } - TRACE("Returning %s\n",debugstr_w(pszPath)); + if (*pcchPath < len + 1) + { + ret = E_POINTER; + *pcchPath = len + 1; + } + else + { + *pcchPath = len; + if (tpath != pszPath) + StrCpyW(pszPath, tpath); + } + if (tpath != pszPath) + HeapFree(GetProcessHeap(), 0, tpath); + TRACE("Returning (%u) %s\n", *pcchPath, debugstr_w(pszPath)); + return ret; +} + +/************************************************************************* + * PathCreateFromUrlAlloc [SHLWAPI.@] + */ +HRESULT WINAPI PathCreateFromUrlAlloc(LPCWSTR pszUrl, LPWSTR *pszPath, + DWORD dwReserved) +{ + WCHAR pathW[MAX_PATH]; + DWORD size; + HRESULT hr; + + size = MAX_PATH; + hr = PathCreateFromUrlW(pszUrl, pathW, &size, dwReserved); + if (SUCCEEDED(hr)) + { + /* Yes, this is supposed to crash if pszPath is NULL */ + *pszPath = StrDupW(pathW); + } return hr; } diff --git a/dll/win32/shlwapi/reg.c b/dll/win32/shlwapi/reg.c index 18d2db0234b..af836f0de5e 100644 --- a/dll/win32/shlwapi/reg.c +++ b/dll/win32/shlwapi/reg.c @@ -2232,7 +2232,7 @@ DWORD WINAPI SHCopyKeyA(HKEY hKeySrc, LPCSTR lpszSrcSubKey, HKEY hKeyDst, DWORD TRACE("(hkey=%p,%s,%p08x,%d)\n", hKeySrc, debugstr_a(lpszSrcSubKey), hKeyDst, dwReserved); if (lpszSrcSubKey) - MultiByteToWideChar(0, 0, lpszSrcSubKey, -1, szSubKeyW, MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, lpszSrcSubKey, -1, szSubKeyW, MAX_PATH); return SHCopyKeyW(hKeySrc, lpszSrcSubKey ? szSubKeyW : NULL, hKeyDst, dwReserved); } diff --git a/dll/win32/shlwapi/shlwapi.rc b/dll/win32/shlwapi/shlwapi.rc index 1d4073ac4a0..f89bf9ae8be 100644 --- a/dll/win32/shlwapi/shlwapi.rc +++ b/dll/win32/shlwapi/shlwapi.rc @@ -1,5 +1,5 @@ /* - * Top level resource file for shlwapi + * Resources for shlwapi * * Copyright 2004 Jon Griffiths * diff --git a/dll/win32/shlwapi/shlwapi.spec b/dll/win32/shlwapi/shlwapi.spec index ba4e8221ad0..72c2060645b 100644 --- a/dll/win32/shlwapi/shlwapi.spec +++ b/dll/win32/shlwapi/shlwapi.spec @@ -566,6 +566,8 @@ @ stdcall HashData (ptr long ptr long) @ stdcall IntlStrEqWorkerA(long str str long) StrIsIntlEqualA @ stdcall IntlStrEqWorkerW(long wstr wstr long) StrIsIntlEqualW +@ stdcall IsCharSpaceA(long) +@ stdcall IsInternetESCEnabled() @ stdcall PathAddBackslashA (str) @ stdcall PathAddBackslashW (wstr) @ stdcall PathAddExtensionA (str str) @@ -586,6 +588,7 @@ @ stdcall PathCompactPathW(long wstr long) @ stdcall PathCreateFromUrlA(str ptr ptr long) @ stdcall PathCreateFromUrlW(wstr ptr ptr long) +@ stdcall PathCreateFromUrlAlloc(wstr ptr long) @ stdcall PathFileExistsA (str) @ stdcall PathFileExistsW (wstr) @ stdcall PathFindExtensionA (str) diff --git a/dll/win32/shlwapi/string.c b/dll/win32/shlwapi/string.c index 2ee2aa98b4b..cba16d720fb 100644 --- a/dll/win32/shlwapi/string.c +++ b/dll/win32/shlwapi/string.c @@ -1891,7 +1891,7 @@ HRESULT WINAPI SHStrDupA(LPCSTR lpszStr, LPWSTR * lppszDest) if (lpszStr) { - len = MultiByteToWideChar(0, 0, lpszStr, -1, 0, 0) * sizeof(WCHAR); + len = MultiByteToWideChar(CP_ACP, 0, lpszStr, -1, NULL, 0) * sizeof(WCHAR); *lppszDest = CoTaskMemAlloc(len); } else @@ -1899,7 +1899,7 @@ HRESULT WINAPI SHStrDupA(LPCSTR lpszStr, LPWSTR * lppszDest) if (*lppszDest) { - MultiByteToWideChar(0, 0, lpszStr, -1, *lppszDest, len/sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, lpszStr, -1, *lppszDest, len/sizeof(WCHAR)); hRet = S_OK; } else @@ -2828,3 +2828,28 @@ end: HeapFree(GetProcessHeap(), 0, dllname); return hr; } + +BOOL WINAPI IsCharSpaceA(CHAR c) +{ + WORD CharType; + return GetStringTypeA(GetSystemDefaultLCID(), CT_CTYPE1, &c, 1, &CharType) && (CharType & C1_SPACE); +} + +/************************************************************************* + * @ [SHLWAPI.29] + * + * Determine if a Unicode character is a space. + * + * PARAMS + * wc [I] Character to check. + * + * RETURNS + * TRUE, if wc is a space, + * FALSE otherwise. + */ +BOOL WINAPI IsCharSpaceW(WCHAR wc) +{ + WORD CharType; + + return GetStringTypeW(CT_CTYPE1, &wc, 1, &CharType) && (CharType & C1_SPACE); +} diff --git a/dll/win32/shlwapi/thread.c b/dll/win32/shlwapi/thread.c index 6006b098e88..6747a51b893 100644 --- a/dll/win32/shlwapi/thread.c +++ b/dll/win32/shlwapi/thread.c @@ -534,7 +534,7 @@ HANDLE WINAPI SHGlobalCounterCreateNamedA(LPCSTR lpszName, DWORD iInitial) TRACE("(%s,%d)\n", debugstr_a(lpszName), iInitial); if (lpszName) - MultiByteToWideChar(0, 0, lpszName, -1, szBuff, MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, lpszName, -1, szBuff, MAX_PATH); return SHGlobalCounterCreateNamedW(lpszName ? szBuff : NULL, iInitial); } diff --git a/dll/win32/shlwapi/url.c b/dll/win32/shlwapi/url.c index a503b4c4af0..6b591560b2a 100644 --- a/dll/win32/shlwapi/url.c +++ b/dll/win32/shlwapi/url.c @@ -270,8 +270,8 @@ HRESULT WINAPI UrlCanonicalizeA(LPCSTR pszUrl, LPSTR pszCanonicalized, ret = UrlCanonicalizeW(url, canonical, pcchCanonicalized, dwFlags); if(ret == S_OK) - WideCharToMultiByte(0, 0, canonical, -1, pszCanonicalized, - *pcchCanonicalized+1, 0, 0); + WideCharToMultiByte(CP_ACP, 0, canonical, -1, pszCanonicalized, + *pcchCanonicalized+1, NULL, NULL); HeapFree(GetProcessHeap(), 0, url); HeapFree(GetProcessHeap(), 0, canonical); @@ -631,8 +631,8 @@ HRESULT WINAPI UrlCombineA(LPCSTR pszBase, LPCSTR pszRelative, relative = base + INTERNET_MAX_URL_LENGTH; combined = relative + INTERNET_MAX_URL_LENGTH; - MultiByteToWideChar(0, 0, pszBase, -1, base, INTERNET_MAX_URL_LENGTH); - MultiByteToWideChar(0, 0, pszRelative, -1, relative, INTERNET_MAX_URL_LENGTH); + MultiByteToWideChar(CP_ACP, 0, pszBase, -1, base, INTERNET_MAX_URL_LENGTH); + MultiByteToWideChar(CP_ACP, 0, pszRelative, -1, relative, INTERNET_MAX_URL_LENGTH); len = *pcchCombined; ret = UrlCombineW(base, relative, pszCombined?combined:NULL, &len, dwFlags); @@ -642,14 +642,14 @@ HRESULT WINAPI UrlCombineA(LPCSTR pszBase, LPCSTR pszRelative, return ret; } - len2 = WideCharToMultiByte(0, 0, combined, len, 0, 0, 0, 0); + len2 = WideCharToMultiByte(CP_ACP, 0, combined, len, NULL, 0, NULL, NULL); if (len2 > *pcchCombined) { *pcchCombined = len2; HeapFree(GetProcessHeap(), 0, base); return E_POINTER; } - WideCharToMultiByte(0, 0, combined, len+1, pszCombined, (*pcchCombined)+1, - 0, 0); + WideCharToMultiByte(CP_ACP, 0, combined, len+1, pszCombined, (*pcchCombined)+1, + NULL, NULL); *pcchCombined = len2; HeapFree(GetProcessHeap(), 0, base); return S_OK; @@ -1601,7 +1601,7 @@ HRESULT WINAPI UrlHashW(LPCWSTR pszUrl, unsigned char *lpDest, DWORD nDestLen) /* Win32 hashes the data as an ASCII string, presumably so that both A+W * return the same digests for the same URL. */ - WideCharToMultiByte(0, 0, pszUrl, -1, szUrl, MAX_PATH, 0, 0); + WideCharToMultiByte(CP_ACP, 0, pszUrl, -1, szUrl, MAX_PATH, NULL, NULL); HashData((const BYTE*)szUrl, (int)strlen(szUrl), lpDest, nDestLen); return S_OK; } @@ -1670,7 +1670,7 @@ static HRESULT URL_GuessScheme(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut) WCHAR value[MAX_PATH], data[MAX_PATH]; WCHAR Wxx, Wyy; - MultiByteToWideChar(0, 0, + MultiByteToWideChar(CP_ACP, 0, "Software\\Microsoft\\Windows\\CurrentVersion\\URL\\Prefixes", -1, reg_path, MAX_PATH); RegOpenKeyExW(HKEY_LOCAL_MACHINE, reg_path, 0, 1, &newkey); @@ -1868,7 +1868,8 @@ BOOL WINAPI UrlIsA(LPCSTR pszUrl, URLIS Urlis) return FALSE; case URLIS_FILEURL: - return !StrCmpNA("file:", pszUrl, 5); + return (CompareStringA(LOCALE_INVARIANT, NORM_IGNORECASE, pszUrl, 5, + "file:", 5) == CSTR_EQUAL); case URLIS_DIRECTORY: last = pszUrl + strlen(pszUrl) - 1; @@ -1893,7 +1894,7 @@ BOOL WINAPI UrlIsA(LPCSTR pszUrl, URLIS Urlis) */ BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis) { - static const WCHAR stemp[] = { 'f','i','l','e',':',0 }; + static const WCHAR file_colon[] = { 'f','i','l','e',':',0 }; PARSEDURLW base; DWORD res1; LPCWSTR last; @@ -1921,7 +1922,8 @@ BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis) return FALSE; case URLIS_FILEURL: - return !strncmpW(stemp, pszUrl, 5); + return (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pszUrl, 5, + file_colon, 5) == CSTR_EQUAL); case URLIS_DIRECTORY: last = pszUrl + strlenW(pszUrl) - 1; @@ -2199,7 +2201,7 @@ HRESULT WINAPI UrlGetPartA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut, (2*INTERNET_MAX_URL_LENGTH) * sizeof(WCHAR)); out = in + INTERNET_MAX_URL_LENGTH; - MultiByteToWideChar(0, 0, pszIn, -1, in, INTERNET_MAX_URL_LENGTH); + MultiByteToWideChar(CP_ACP, 0, pszIn, -1, in, INTERNET_MAX_URL_LENGTH); len = INTERNET_MAX_URL_LENGTH; ret = UrlGetPartW(in, out, &len, dwPart, dwFlags); @@ -2209,13 +2211,13 @@ HRESULT WINAPI UrlGetPartA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut, return ret; } - len2 = WideCharToMultiByte(0, 0, out, len, 0, 0, 0, 0); + len2 = WideCharToMultiByte(CP_ACP, 0, out, len, NULL, 0, NULL, NULL); if (len2 > *pcchOut) { *pcchOut = len2+1; HeapFree(GetProcessHeap(), 0, in); return E_POINTER; } - len2 = WideCharToMultiByte(0, 0, out, len+1, pszOut, *pcchOut, 0, 0); + len2 = WideCharToMultiByte(CP_ACP, 0, out, len+1, pszOut, *pcchOut, NULL, NULL); *pcchOut = len2-1; HeapFree(GetProcessHeap(), 0, in); return ret; @@ -2529,7 +2531,7 @@ HRESULT WINAPI MLBuildResURLA(LPCSTR lpszLibName, HMODULE hMod, DWORD dwFlags, hRet = MLBuildResURLW(lpszLibName ? szLibName : NULL, hMod, dwFlags, lpszRes ? szRes : NULL, lpszDest ? szDest : NULL, dwDestLen); if (SUCCEEDED(hRet) && lpszDest) - WideCharToMultiByte(CP_ACP, 0, szDest, -1, lpszDest, dwDestLen, 0, 0); + WideCharToMultiByte(CP_ACP, 0, szDest, -1, lpszDest, dwDestLen, NULL, NULL); return hRet; } @@ -2623,3 +2625,12 @@ HRESULT WINAPI UrlFixupW(LPCWSTR url, LPWSTR translatedUrl, DWORD maxChars) return S_OK; } + +/************************************************************************* + * IsInternetESCEnabled [SHLWAPI.@] + */ +BOOL WINAPI IsInternetESCEnabled(void) +{ + FIXME(": stub\n"); + return FALSE; +} diff --git a/dll/win32/syssetup/lang/ja-JP.rc b/dll/win32/syssetup/lang/ja-JP.rc index 29012aca6cf..5bbc7b4469a 100644 --- a/dll/win32/syssetup/lang/ja-JP.rc +++ b/dll/win32/syssetup/lang/ja-JP.rc @@ -36,13 +36,13 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYS CAPTION "ReactOS セットアップ" FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN - LTEXT "ReactOSの開発者より、下記のオープンソ ース プロジェクトに感謝の意を表 明します。 これらのすべてまたは一部はReactOSの開発に利用されました。", + LTEXT "ReactOSの開発者より、下記のオープンソース プロジェクトに感謝の意を表明します。 これらのすべてまたは一部はReactOSの開発に利用されました。", IDC_STATIC,15,7,286,19 LISTBOX IDC_PROJECTS,15,30,286,75,LBS_NOSEL | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL LTEXT "ReactOSはGPLの下にライセンスされており、すべてまたは一部を再利用、 再配布する場合はGPLに従う必要があります。", IDC_STATIC,15,110,227,19 - PUSHBUTTON "GPLを表 示(&V)...",IDC_VIEWGPL,251,110,50,19 + PUSHBUTTON "GPLを表示(&V)...",IDC_VIEWGPL,251,110,50,19 LTEXT "セットアップを続行するには [次へ] をクリックしてください。",IDC_STATIC,15,136, 195,17 END @@ -91,7 +91,7 @@ CAPTION "ReactOS セットアップ" FONT 9, "MS UI Gothic" BEGIN ICON IDI_ICON4, IDC_STATIC, 21, 7, 20, 20 - LTEXT "システムのロケールを、アプリケーションで使用したい言語に設定してください。 ユーザーロケールは、数値、通貨、日付の表 示方法を制御します。 ", IDC_STATIC, 53, 7, 253, 20 + LTEXT "システムのロケールを、アプリケーションで使用したい言語に設定してください。 ユーザーロケールは、数値、通貨、日付の表示方法を制御します。 ", IDC_STATIC, 53, 7, 253, 20 LTEXT "", IDC_LOCALETEXT, 53, 29, 250, 16 LTEXT "システム、ユーザーロケール設定変更には[カスタマイズ]をクリックします。", IDC_STATIC, 53, 50, 166, 25 @@ -172,7 +172,7 @@ STRINGTABLE BEGIN IDS_ACKTITLE "承認" IDS_ACKSUBTITLE "ReactOS が利用しているプロジェクトとライセンスに関する情報" - IDS_OWNERTITLE "ソ フトウェアの個人用設定" + IDS_OWNERTITLE "ソフトウェアの個人用設定" IDS_OWNERSUBTITLE "この情報は、ReactOS の個人用設定に用いられます。" IDS_COMPUTERTITLE "コンピュータ名と Administrator パスワード" IDS_COMPUTERSUBTITLE "コンピュータ名と Administrator パスワードを入力する必要があります。" @@ -197,7 +197,7 @@ BEGIN IDS_CMT_DEVMGMT "デバイス マネージャを起動します" IDS_CMT_EVENTVIEW "イベント ビューアを起動します" IDS_CMT_EXPLORER "エクスプローラを起動します" - IDS_CMT_MSCONFIG "システムの構 成プログラムを開きます" + IDS_CMT_MSCONFIG "システムの構成プログラムを開きます" IDS_CMT_NOTEPAD "テキストエディタを起動します" IDS_CMT_RDESKTOP "リモート デスクトップを起動します" IDS_CMT_REGEDIT "レジストリ エディタを起動します" @@ -210,9 +210,9 @@ END STRINGTABLE BEGIN IDS_GAMES "ゲーム" - IDS_CMT_SOLITAIRE "ソ リティア" + IDS_CMT_SOLITAIRE "ソリティア" IDS_CMT_WINEMINE "WineMine" - IDS_CMT_SPIDER "スパイダ ソ リティア" + IDS_CMT_SPIDER "スパイダ ソリティア" END STRINGTABLE @@ -253,7 +253,7 @@ END STRINGTABLE BEGIN IDS_SHORT_CALC "電卓.lnk" - IDS_SHORT_CHARMAP "文字コード表 .lnk" + IDS_SHORT_CHARMAP "文字コード表.lnk" IDS_SHORT_CMD "コマンド プロンプト.lnk" IDS_SHORT_DEVICE "デバイス マネージャ.lnk" IDS_SHORT_DOWNLOADER "ReactOS アプリケーション マネージャ.lnk" @@ -263,7 +263,7 @@ BEGIN IDS_SHORT_KBSWITCH "キーボード レイアウト 切替器.lnk" IDS_SHORT_MAGNIFY "拡大鏡.lnk" IDS_SHORT_MPLAY32 "マルチメディア プレーヤ.lnk" - IDS_SHORT_MSCONFIG "システムの構 成.lnk" + IDS_SHORT_MSCONFIG "システムの構成.lnk" IDS_SHORT_NOTEPAD "メモ帳.lnk" IDS_SHORT_RDESKTOP "リモート デスクトップ接続.lnk" IDS_SHORT_REGEDIT "レジストリ エディタ.lnk" @@ -271,11 +271,11 @@ BEGIN IDS_SHORT_SNAP "スナップショット.lnk" IDS_SHORT_SNDVOL32 "ボリューム コントロール.lnk" IDS_SHORT_SNDREC32 "オーディオレコーダ.lnk" - IDS_SHORT_SOLITAIRE "ソ リティア.lnk" + IDS_SHORT_SOLITAIRE "ソリティア.lnk" IDS_SHORT_WINEMINE "WineMine.lnk" IDS_SHORT_WORDPAD "ワードパッド.lnk" IDS_SHORT_PAINT "ペイント.lnk" - IDS_SHORT_SPIDER "スパイダ ソ リティア.lnk" + IDS_SHORT_SPIDER "スパイダ ソリティア.lnk" END STRINGTABLE diff --git a/dll/win32/urlmon/CMakeLists.txt b/dll/win32/urlmon/CMakeLists.txt index 6f56eb87dc1..2821e68701d 100644 --- a/dll/win32/urlmon/CMakeLists.txt +++ b/dll/win32/urlmon/CMakeLists.txt @@ -1,5 +1,11 @@ -add_definitions(-D__WINESRC__) +add_definitions( + -D__WINESRC__ + -D_URLMON_ + -DENTRY_PREFIX=URLMON_ + -DPROXY_DELEGATION + -DWINE_REGISTER_DLL + -DPROXY_CLSID_IS="{0x79EAC9F1,0xBAF9,0x11CE,{0x8C,0x82,0x00,0xAA,0x00,0x4B,0xA9,0x0B}}") remove_definitions(-D_WIN32_WINNT=0x502) add_definitions(-D_WIN32_WINNT=0x600) @@ -11,6 +17,7 @@ spec2def(urlmon.dll urlmon.spec ADD_IMPORTLIB) add_rpcproxy_files(urlmon_urlmon.idl) list(APPEND SOURCE + axinstall.c bindctx.c binding.c bindprot.c @@ -24,7 +31,6 @@ list(APPEND SOURCE mimefilter.c mk.c protocol.c - protproxy.c sec_mgr.c session.c umon.c @@ -32,40 +38,15 @@ list(APPEND SOURCE uri.c urlmon_main.c usrmarshal.c - rsrc.rc + urlmon.rc ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c ${CMAKE_CURRENT_BINARY_DIR}/urlmon_urlmon_p.c ${CMAKE_CURRENT_BINARY_DIR}/urlmon_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/urlmon.def) add_library(urlmon SHARED ${SOURCE}) - set_module_type(urlmon win32dll) - -target_link_libraries(urlmon - uuid - wine - ${PSEH_LIB}) - -add_importlibs(urlmon - rpcrt4 - ole32 - oleaut32 - shlwapi - shell32 - wininet - user32 - advapi32 - msvcrt - kernel32 - ntdll) - -add_definitions( - -DENTRY_PREFIX=URLMON_ - -DPROXY_DELEGATION - -DWINE_REGISTER_DLL - -D_URLMON_) - +target_link_libraries(urlmon uuid wine ${PSEH_LIB}) +add_importlibs(urlmon rpcrt4 propsys ole32 oleaut32 shlwapi shell32 wininet user32 advapi32 advpack msvcrt kernel32 ntdll) add_pch(urlmon urlmon_main.h) -add_definitions(-DPROXY_CLSID_IS="{0x79EAC9F1,0xBAF9,0x11CE,{0x8C,0x82,0x00,0xAA,0x00,0x4B,0xA9,0x0B}}") add_cd_file(TARGET urlmon DESTINATION reactos/system32 FOR all) diff --git a/dll/win32/urlmon/axinstall.c b/dll/win32/urlmon/axinstall.c new file mode 100644 index 00000000000..ca1aef682cc --- /dev/null +++ b/dll/win32/urlmon/axinstall.c @@ -0,0 +1,525 @@ +/* + * Copyright 2012 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define OEMRESOURCE + +#include + +#include "urlmon_main.h" +#include "resource.h" + +#include "advpub.h" +#include "fdi.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(urlmon); + +static const WCHAR ctxW[] = {'c','t','x',0}; +static const WCHAR cab_extW[] = {'.','c','a','b',0}; +static const WCHAR infW[] = {'i','n','f',0}; +static const WCHAR dllW[] = {'d','l','l',0}; +static const WCHAR ocxW[] = {'o','c','x',0}; + +enum install_type { + INSTALL_UNKNOWN, + INSTALL_DLL, + INSTALL_INF +}; + +typedef struct { + IUri *uri; + IBindStatusCallback *callback; + BOOL release_on_stop; + BOOL cancel; + WCHAR *install_file; + const WCHAR *cache_file; + const WCHAR *tmp_dir; + const WCHAR *file_name; + enum install_type install_type; + HWND hwnd; + int counter; + INT_PTR timer; +} install_ctx_t; + +static void release_install_ctx(install_ctx_t *ctx) +{ + if(ctx->uri) + IUri_Release(ctx->uri); + if(ctx->callback) + IBindStatusCallback_Release(ctx->callback); + heap_free(ctx->install_file); + heap_free(ctx); +} + +static inline BOOL file_exists(const WCHAR *file_name) +{ + return GetFileAttributesW(file_name) != INVALID_FILE_ATTRIBUTES; +} + +static HRESULT extract_cab_file(install_ctx_t *ctx) +{ + size_t path_len, file_len; + WCHAR *ptr; + HRESULT hres; + + hres = ExtractFilesW(ctx->cache_file, ctx->tmp_dir, 0, NULL, NULL, 0); + if(FAILED(hres)) { + WARN("ExtractFilesW failed: %08x\n", hres); + return hres; + } + + path_len = strlenW(ctx->tmp_dir); + file_len = strlenW(ctx->file_name); + ctx->install_file = heap_alloc((path_len+file_len+2)*sizeof(WCHAR)); + if(!ctx->install_file) + return E_OUTOFMEMORY; + + memcpy(ctx->install_file, ctx->tmp_dir, path_len*sizeof(WCHAR)); + ctx->install_file[path_len] = '\\'; + memcpy(ctx->install_file+path_len+1, ctx->file_name, (file_len+1)*sizeof(WCHAR)); + + /* NOTE: Assume that file_name contains ".cab" extension */ + ptr = ctx->install_file+path_len+1+file_len-3; + + memcpy(ptr, infW, sizeof(infW)); + if(file_exists(ctx->install_file)) { + ctx->install_type = INSTALL_INF; + return S_OK; + } + + memcpy(ptr, dllW, sizeof(dllW)); + if(file_exists(ctx->install_file)) { + ctx->install_type = INSTALL_DLL; + return S_OK; + } + + memcpy(ptr, ocxW, sizeof(ocxW)); + if(file_exists(ctx->install_file)) { + ctx->install_type = INSTALL_DLL; + return S_OK; + } + + FIXME("No known install file\n"); + return E_NOTIMPL; +} + +static HRESULT setup_dll(install_ctx_t *ctx) +{ + HMODULE module; + HRESULT hres; + + HRESULT (WINAPI *reg_func)(void); + + module = LoadLibraryW(ctx->install_file); + if(!module) + return E_FAIL; + + reg_func = (void*)GetProcAddress(module, "DllRegisterServer"); + if(reg_func) { + hres = reg_func(); + }else { + WARN("no DllRegisterServer function\n"); + hres = E_FAIL; + } + + FreeLibrary(module); + return hres; +} + +static void expand_command(install_ctx_t *ctx, const WCHAR *cmd, WCHAR *buf, size_t *size) +{ + const WCHAR *ptr = cmd, *prev_ptr = cmd; + size_t len = 0, len2; + + static const WCHAR expand_dirW[] = {'%','E','X','T','R','A','C','T','_','D','I','R','%'}; + + while((ptr = strchrW(ptr, '%'))) { + if(buf) + memcpy(buf+len, prev_ptr, ptr-prev_ptr); + len += ptr-prev_ptr; + + if(!strncmpiW(ptr, expand_dirW, sizeof(expand_dirW)/sizeof(WCHAR))) { + len2 = strlenW(ctx->tmp_dir); + if(buf) + memcpy(buf+len, ctx->tmp_dir, len2*sizeof(WCHAR)); + len += len2; + ptr += sizeof(expand_dirW)/sizeof(WCHAR); + }else { + FIXME("Can't expand %s\n", debugstr_w(ptr)); + if(buf) + buf[len] = '%'; + len++; + ptr++; + } + + prev_ptr = ptr; + } + + if(buf) + strcpyW(buf+len, prev_ptr); + *size = len + strlenW(prev_ptr) + 1; +} + +static HRESULT process_hook_section(install_ctx_t *ctx, const WCHAR *sect_name) +{ + WCHAR buf[2048], val[2*MAX_PATH]; + const WCHAR *key; + DWORD len; + HRESULT hres; + + static const WCHAR runW[] = {'r','u','n',0}; + + len = GetPrivateProfileStringW(sect_name, NULL, NULL, buf, sizeof(buf)/sizeof(*buf), ctx->install_file); + if(!len) + return S_OK; + + for(key = buf; *key; key += strlenW(key)+1) { + if(!strcmpiW(key, runW)) { + WCHAR *cmd; + size_t size; + + len = GetPrivateProfileStringW(sect_name, runW, NULL, val, sizeof(val)/sizeof(*val), ctx->install_file); + + TRACE("Run %s\n", debugstr_w(val)); + + expand_command(ctx, val, NULL, &size); + + cmd = heap_alloc(size*sizeof(WCHAR)); + if(!cmd) + heap_free(cmd); + + expand_command(ctx, val, cmd, &size); + hres = RunSetupCommandW(ctx->hwnd, cmd, NULL, ctx->tmp_dir, NULL, NULL, 0, NULL); + heap_free(cmd); + if(FAILED(hres)) + return hres; + }else { + FIXME("Unsupported hook %s\n", debugstr_w(key)); + return E_NOTIMPL; + } + } + + return S_OK; +} + +static HRESULT install_inf_file(install_ctx_t *ctx) +{ + WCHAR buf[2048], sect_name[128]; + BOOL default_install = TRUE; + const WCHAR *key; + DWORD len; + HRESULT hres; + + static const WCHAR setup_hooksW[] = {'S','e','t','u','p',' ','H','o','o','k','s',0}; + static const WCHAR add_codeW[] = {'A','d','d','.','C','o','d','e',0}; + + len = GetPrivateProfileStringW(setup_hooksW, NULL, NULL, buf, sizeof(buf)/sizeof(*buf), ctx->install_file); + if(len) { + default_install = FALSE; + + for(key = buf; *key; key += strlenW(key)+1) { + TRACE("[Setup Hooks] key: %s\n", debugstr_w(key)); + + len = GetPrivateProfileStringW(setup_hooksW, key, NULL, sect_name, sizeof(sect_name)/sizeof(*sect_name), + ctx->install_file); + if(!len) { + WARN("Could not get key value\n"); + return E_FAIL; + } + + hres = process_hook_section(ctx, sect_name); + if(FAILED(hres)) + return hres; + } + } + + len = GetPrivateProfileStringW(add_codeW, NULL, NULL, buf, sizeof(buf)/sizeof(*buf), ctx->install_file); + if(len) { + FIXME("[Add.Code] section not supported\n"); + + /* Don't throw an error if we successfully ran setup hooks; + installation is likely to be complete enough */ + if(default_install) + return E_NOTIMPL; + } + + if(default_install) { + hres = RunSetupCommandW(ctx->hwnd, ctx->install_file, NULL, ctx->tmp_dir, NULL, NULL, RSC_FLAG_INF, NULL); + if(FAILED(hres)) { + WARN("RunSetupCommandW failed: %08x\n", hres); + return hres; + } + } + + return S_OK; +} + +static HRESULT install_cab_file(install_ctx_t *ctx) +{ + WCHAR tmp_path[MAX_PATH], tmp_dir[MAX_PATH]; + BOOL res = FALSE, leave_temp = FALSE; + DWORD i; + HRESULT hres; + + GetTempPathW(sizeof(tmp_path)/sizeof(WCHAR), tmp_path); + + for(i=0; !res && i < 100; i++) { + GetTempFileNameW(tmp_path, NULL, GetTickCount() + i*17037, tmp_dir); + res = CreateDirectoryW(tmp_dir, NULL); + } + if(!res) + return E_FAIL; + + ctx->tmp_dir = tmp_dir; + + TRACE("Using temporary directory %s\n", debugstr_w(tmp_dir)); + + hres = extract_cab_file(ctx); + if(SUCCEEDED(hres)) { + if(ctx->callback) + IBindStatusCallback_OnProgress(ctx->callback, 0, 0, BINDSTATUS_INSTALLINGCOMPONENTS, ctx->install_file); + + switch(ctx->install_type) { + case INSTALL_INF: + hres = install_inf_file(ctx); + break; + case INSTALL_DLL: + FIXME("Installing DLL, registering in temporary location\n"); + hres = setup_dll(ctx); + if(SUCCEEDED(hres)) + leave_temp = TRUE; + break; + default: + assert(0); + } + } + + if(!leave_temp) + RemoveDirectoryW(ctx->tmp_dir); + return hres; +} + +static void update_counter(install_ctx_t *ctx, HWND hwnd) +{ + WCHAR text[100]; + + if(--ctx->counter <= 0) { + HWND button_hwnd; + + KillTimer(hwnd, ctx->timer); + LoadStringW(urlmon_instance, IDS_AXINSTALL_INSTALL, text, sizeof(text)/sizeof(WCHAR)); + + button_hwnd = GetDlgItem(hwnd, ID_AXINSTALL_INSTALL_BTN); + EnableWindow(button_hwnd, TRUE); + }else { + WCHAR buf[100]; + LoadStringW(urlmon_instance, IDS_AXINSTALL_INSTALLN, buf, sizeof(buf)/sizeof(WCHAR)); + sprintfW(text, buf, ctx->counter); + } + + SetDlgItemTextW(hwnd, ID_AXINSTALL_INSTALL_BTN, text); +} + +static BOOL init_warning_dialog(HWND hwnd, install_ctx_t *ctx) +{ + BSTR display_uri; + HRESULT hres; + + if(!SetPropW(hwnd, ctxW, ctx)) + return FALSE; + + hres = IUri_GetDisplayUri(ctx->uri, &display_uri); + if(FAILED(hres)) + return FALSE; + + SetDlgItemTextW(hwnd, ID_AXINSTALL_LOCATION, display_uri); + SysFreeString(display_uri); + + SendDlgItemMessageW(hwnd, ID_AXINSTALL_ICON, STM_SETICON, + (WPARAM)LoadIconW(0, (const WCHAR*)OIC_WARNING), 0); + + ctx->counter = 4; + update_counter(ctx, hwnd); + ctx->timer = SetTimer(hwnd, 1, 1000, NULL); + return TRUE; +} + +static INT_PTR WINAPI warning_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch(msg) { + case WM_INITDIALOG: { + if(!init_warning_dialog(hwnd, (install_ctx_t*)lparam)) + EndDialog(hwnd, 0); + return TRUE; + } + case WM_COMMAND: + switch(wparam) { + case ID_AXINSTALL_INSTALL_BTN: { + install_ctx_t *ctx = GetPropW(hwnd, ctxW); + if(ctx) + ctx->cancel = FALSE; + EndDialog(hwnd, 0); + return FALSE; + } + case IDCANCEL: + EndDialog(hwnd, 0); + return FALSE; + } + case WM_TIMER: + update_counter(GetPropW(hwnd, ctxW), hwnd); + return TRUE; + } + + return FALSE; +} + +static BOOL install_warning(install_ctx_t *ctx) +{ + IWindowForBindingUI *window_iface; + HWND parent_hwnd = NULL; + HRESULT hres; + + if(!ctx->callback) { + FIXME("no callback\n"); + return FALSE; + } + + hres = IBindStatusCallback_QueryInterface(ctx->callback, &IID_IWindowForBindingUI, (void**)&window_iface); + if(FAILED(hres)) + return FALSE; + + hres = IWindowForBindingUI_GetWindow(window_iface, &IID_ICodeInstall, &ctx->hwnd); + IWindowForBindingUI_Release(window_iface); + if(FAILED(hres)) + return FALSE; + + ctx->cancel = TRUE; + DialogBoxParamW(urlmon_instance, MAKEINTRESOURCEW(ID_AXINSTALL_WARNING_DLG), parent_hwnd, warning_proc, (LPARAM)ctx); + return !ctx->cancel; +} + +static HRESULT install_file(install_ctx_t *ctx, const WCHAR *cache_file) +{ + BSTR path; + HRESULT hres; + + TRACE("%s\n", debugstr_w(cache_file)); + + ctx->cache_file = cache_file; + + if(!install_warning(ctx)) { + TRACE("Installation cancelled\n"); + return S_OK; + } + + hres = IUri_GetPath(ctx->uri, &path); + if(SUCCEEDED(hres)) { + const WCHAR *ptr, *ptr2, *ext; + + ptr = strrchrW(path, '/'); + if(!ptr) + ptr = path; + else + ptr++; + + ptr2 = strrchrW(ptr, '\\'); + if(ptr2) + ptr = ptr2+1; + + ctx->file_name = ptr; + ext = strrchrW(ptr, '.'); + if(!ext) + ext = ptr; + + if(!strcmpW(ext, cab_extW)) { + hres = install_cab_file(ctx); + }else { + FIXME("Unsupported extension %s\n", debugstr_w(ext)); + hres = E_NOTIMPL; + } + SysFreeString(path); + } + + return hres; +} + +static void failure_msgbox(install_ctx_t *ctx, HRESULT hres) +{ + WCHAR buf[1024], fmt[1024]; + + LoadStringW(urlmon_instance, IDS_AXINSTALL_FAILURE, fmt, sizeof(fmt)/sizeof(WCHAR)); + sprintfW(buf, fmt, hres); + MessageBoxW(ctx->hwnd, buf, NULL, MB_OK); +} + +static HRESULT distunit_on_stop(void *ctx, const WCHAR *cache_file, HRESULT hresult, const WCHAR *error_str) +{ + install_ctx_t *install_ctx = ctx; + + TRACE("(%p %s %08x %s)\n", ctx, debugstr_w(cache_file), hresult, debugstr_w(error_str)); + + if(hresult == S_OK) { + hresult = install_file(install_ctx, cache_file); + if(FAILED(hresult)) + failure_msgbox(ctx, hresult); + } + + if(install_ctx->callback) + IBindStatusCallback_OnStopBinding(install_ctx->callback, hresult, error_str); + + if(install_ctx->release_on_stop) + release_install_ctx(install_ctx); + return S_OK; +} + +/*********************************************************************** + * AsyncInstallDistributionUnit (URLMON.@) + */ +HRESULT WINAPI AsyncInstallDistributionUnit(const WCHAR *szDistUnit, const WCHAR *szTYPE, const WCHAR *szExt, + DWORD dwFileVersionMS, DWORD dwFileVersionLS, const WCHAR *szURL, IBindCtx *pbc, void *pvReserved, DWORD flags) +{ + install_ctx_t *ctx; + HRESULT hres; + + TRACE("(%s %s %s %x %x %s %p %p %x)\n", debugstr_w(szDistUnit), debugstr_w(szTYPE), debugstr_w(szExt), + dwFileVersionMS, dwFileVersionLS, debugstr_w(szURL), pbc, pvReserved, flags); + + if(szDistUnit || szTYPE || szExt) + FIXME("Unsupported arguments\n"); + + ctx = heap_alloc_zero(sizeof(*ctx)); + if(!ctx) + return E_OUTOFMEMORY; + + hres = CreateUri(szURL, 0, 0, &ctx->uri); + if(FAILED(hres)) { + heap_free(ctx); + return E_OUTOFMEMORY; + } + + ctx->callback = bsc_from_bctx(pbc); + + hres = download_to_cache(ctx->uri, distunit_on_stop, ctx, ctx->callback); + if(hres == MK_S_ASYNCHRONOUS) + ctx->release_on_stop = TRUE; + else + release_install_ctx(ctx); + + return hres; +} diff --git a/dll/win32/urlmon/bindctx.c b/dll/win32/urlmon/bindctx.c index c7bd4e45d1f..c017e8f26f7 100644 --- a/dll/win32/urlmon/bindctx.c +++ b/dll/win32/urlmon/bindctx.c @@ -23,7 +23,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); -static WCHAR BSCBHolder[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 }; +static WCHAR bscb_holderW[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 }; extern IID IID_IBindStatusCallbackHolder; @@ -51,6 +51,45 @@ static void *get_callback_iface(BindStatusCallback *This, REFIID riid) return SUCCEEDED(hres) ? ret : NULL; } +static IBindStatusCallback *bsch_from_bctx(IBindCtx *bctx) +{ + IBindStatusCallback *bsc; + IUnknown *unk; + HRESULT hres; + + hres = IBindCtx_GetObjectParam(bctx, bscb_holderW, &unk); + if(FAILED(hres)) + return NULL; + + hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&bsc); + IUnknown_Release(unk); + return SUCCEEDED(hres) ? bsc : NULL; +} + +IBindStatusCallback *bsc_from_bctx(IBindCtx *bctx) +{ + BindStatusCallback *holder; + IBindStatusCallback *bsc; + HRESULT hres; + + bsc = bsch_from_bctx(bctx); + if(!bsc) + return NULL; + + hres = IBindStatusCallback_QueryInterface(bsc, &IID_IBindStatusCallbackHolder, (void**)&holder); + if(FAILED(hres)) + return bsc; + + if(holder->callback) { + IBindStatusCallback_Release(bsc); + bsc = holder->callback; + IBindStatusCallback_AddRef(bsc); + } + + IBindStatusCallbackEx_Release(&holder->IBindStatusCallbackEx_iface); + return bsc; +} + static inline BindStatusCallback *impl_from_IBindStatusCallbackEx(IBindStatusCallbackEx *iface) { return CONTAINING_RECORD(iface, BindStatusCallback, IBindStatusCallbackEx_iface); @@ -90,7 +129,7 @@ static HRESULT WINAPI BindStatusCallback_QueryInterface(IBindStatusCallbackEx *i } if(*ppv) { - IBindStatusCallback_AddRef((IUnknown*)*ppv); + IUnknown_AddRef((IUnknown*)*ppv); return S_OK; } @@ -158,7 +197,7 @@ static HRESULT WINAPI BindStatusCallback_OnProgress(IBindStatusCallbackEx *iface { BindStatusCallback *This = impl_from_IBindStatusCallbackEx(iface); - TRACE("%p)->(%u %u %u %s)\n", This, ulProgress, ulProgressMax, ulStatusCode, + TRACE("%p)->(%u %u %s %s)\n", This, ulProgress, ulProgressMax, debugstr_bindstatus(ulStatusCode), debugstr_w(szStatusText)); return IBindStatusCallback_OnProgress(This->callback, ulProgress, @@ -261,19 +300,19 @@ static HRESULT WINAPI BSCServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv) { BindStatusCallback *This = impl_from_IServiceProvider(iface); - return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); + return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); } static ULONG WINAPI BSCServiceProvider_AddRef(IServiceProvider *iface) { BindStatusCallback *This = impl_from_IServiceProvider(iface); - return IBindStatusCallback_AddRef(&This->IBindStatusCallbackEx_iface); + return IBindStatusCallbackEx_AddRef(&This->IBindStatusCallbackEx_iface); } static ULONG WINAPI BSCServiceProvider_Release(IServiceProvider *iface) { BindStatusCallback *This = impl_from_IServiceProvider(iface); - return IBindStatusCallback_Release(&This->IBindStatusCallbackEx_iface); + return IBindStatusCallbackEx_Release(&This->IBindStatusCallbackEx_iface); } static HRESULT WINAPI BSCServiceProvider_QueryService(IServiceProvider *iface, @@ -284,17 +323,17 @@ static HRESULT WINAPI BSCServiceProvider_QueryService(IServiceProvider *iface, if(IsEqualGUID(&IID_IHttpNegotiate, guidService)) { TRACE("(%p)->(IID_IHttpNegotiate %s %p)\n", This, debugstr_guid(riid), ppv); - return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); + return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); } if(IsEqualGUID(&IID_IHttpNegotiate2, guidService)) { TRACE("(%p)->(IID_IHttpNegotiate2 %s %p)\n", This, debugstr_guid(riid), ppv); - return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); + return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); } if(IsEqualGUID(&IID_IAuthenticate, guidService)) { TRACE("(%p)->(IID_IAuthenticate %s %p)\n", This, debugstr_guid(riid), ppv); - return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); + return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); } TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv); @@ -328,19 +367,19 @@ static HRESULT WINAPI BSCHttpNegotiate_QueryInterface(IHttpNegotiate2 *iface, REFIID riid, void **ppv) { BindStatusCallback *This = impl_from_IHttpNegotiate2(iface); - return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); + return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); } static ULONG WINAPI BSCHttpNegotiate_AddRef(IHttpNegotiate2 *iface) { BindStatusCallback *This = impl_from_IHttpNegotiate2(iface); - return IBindStatusCallback_AddRef(&This->IBindStatusCallbackEx_iface); + return IBindStatusCallbackEx_AddRef(&This->IBindStatusCallbackEx_iface); } static ULONG WINAPI BSCHttpNegotiate_Release(IHttpNegotiate2 *iface) { BindStatusCallback *This = impl_from_IHttpNegotiate2(iface); - return IBindStatusCallback_Release(&This->IBindStatusCallbackEx_iface); + return IBindStatusCallbackEx_Release(&This->IBindStatusCallbackEx_iface); } static HRESULT WINAPI BSCHttpNegotiate_BeginningTransaction(IHttpNegotiate2 *iface, @@ -428,19 +467,19 @@ static inline BindStatusCallback *impl_from_IAuthenticate(IAuthenticate *iface) static HRESULT WINAPI BSCAuthenticate_QueryInterface(IAuthenticate *iface, REFIID riid, void **ppv) { BindStatusCallback *This = impl_from_IAuthenticate(iface); - return IBindStatusCallback_QueryInterface(&This->IAuthenticate_iface, riid, ppv); + return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); } static ULONG WINAPI BSCAuthenticate_AddRef(IAuthenticate *iface) { BindStatusCallback *This = impl_from_IAuthenticate(iface); - return IBindStatusCallback_AddRef(&This->IBindStatusCallbackEx_iface); + return IBindStatusCallbackEx_AddRef(&This->IBindStatusCallbackEx_iface); } static ULONG WINAPI BSCAuthenticate_Release(IAuthenticate *iface) { BindStatusCallback *This = impl_from_IAuthenticate(iface); - return IBindStatusCallback_Release(&This->IBindStatusCallbackEx_iface); + return IBindStatusCallbackEx_Release(&This->IBindStatusCallbackEx_iface); } static HRESULT WINAPI BSCAuthenticate_Authenticate(IAuthenticate *iface, @@ -516,7 +555,6 @@ HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pb { BindStatusCallback *holder; IBindStatusCallback *bsc, *prev = NULL; - IUnknown *unk; HRESULT hres; TRACE("(%p %p %p %x)\n", pbc, pbsc, ppbscPrevious, dwReserved); @@ -524,34 +562,30 @@ HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pb if (!pbc || !pbsc) return E_INVALIDARG; - hres = IBindCtx_GetObjectParam(pbc, BSCBHolder, &unk); - if(SUCCEEDED(hres)) { - hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&bsc); - IUnknown_Release(unk); + bsc = bsch_from_bctx(pbc); + if(bsc) { + hres = IBindStatusCallback_QueryInterface(bsc, &IID_IBindStatusCallbackHolder, (void**)&holder); if(SUCCEEDED(hres)) { - hres = IBindStatusCallback_QueryInterface(bsc, &IID_IBindStatusCallbackHolder, (void**)&holder); - if(SUCCEEDED(hres)) { - if(ppbscPrevious) { - IBindStatusCallback_AddRef(holder->callback); - *ppbscPrevious = holder->callback; - } - - set_callback(holder, pbsc); - - IBindStatusCallback_Release(bsc); - IBindStatusCallback_Release(&holder->IBindStatusCallbackEx_iface); - return S_OK; - }else { - prev = bsc; + if(ppbscPrevious) { + IBindStatusCallback_AddRef(holder->callback); + *ppbscPrevious = holder->callback; } + + set_callback(holder, pbsc); + + IBindStatusCallback_Release(bsc); + IBindStatusCallbackEx_Release(&holder->IBindStatusCallbackEx_iface); + return S_OK; + }else { + prev = bsc; } - IBindCtx_RevokeObjectParam(pbc, BSCBHolder); + IBindCtx_RevokeObjectParam(pbc, bscb_holderW); } hres = wrap_callback(pbsc, &bsc); if(SUCCEEDED(hres)) { - hres = IBindCtx_RegisterObjectParam(pbc, BSCBHolder, (IUnknown*)bsc); + hres = IBindCtx_RegisterObjectParam(pbc, bscb_holderW, (IUnknown*)bsc); IBindStatusCallback_Release(bsc); } if(FAILED(hres)) { @@ -579,39 +613,21 @@ HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pb */ HRESULT WINAPI RevokeBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc) { - BindStatusCallback *holder; IBindStatusCallback *callback; - IUnknown *unk; - BOOL dorevoke = FALSE; - HRESULT hres; TRACE("(%p %p)\n", pbc, pbsc); if (!pbc || !pbsc) return E_INVALIDARG; - hres = IBindCtx_GetObjectParam(pbc, BSCBHolder, &unk); - if(FAILED(hres)) + callback = bsc_from_bctx(pbc); + if(!callback) return S_OK; - hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&callback); - IUnknown_Release(unk); - if(FAILED(hres)) - return S_OK; + if(callback == pbsc) + IBindCtx_RevokeObjectParam(pbc, bscb_holderW); - hres = IBindStatusCallback_QueryInterface(callback, &IID_IBindStatusCallbackHolder, (void**)&holder); - if(SUCCEEDED(hres)) { - if(pbsc == holder->callback) - dorevoke = TRUE; - IBindStatusCallback_Release(&holder->IBindStatusCallbackEx_iface); - }else if(pbsc == callback) { - dorevoke = TRUE; - } IBindStatusCallback_Release(callback); - - if(dorevoke) - IBindCtx_RevokeObjectParam(pbc, BSCBHolder); - return S_OK; } diff --git a/dll/win32/urlmon/binding.c b/dll/win32/urlmon/binding.c index 1eb4bf7e86b..6f287511599 100644 --- a/dll/win32/urlmon/binding.c +++ b/dll/win32/urlmon/binding.c @@ -92,6 +92,7 @@ typedef struct { BOOL use_cache_file; DWORD state; HRESULT hres; + CLSID clsid; download_state_t download_state; IUnknown *obj; IMoniker *mon; @@ -107,7 +108,7 @@ static void read_protocol_data(stgmed_buf_t *stgmed_buf) DWORD read; HRESULT hres; - do hres = IInternetProtocol_Read(stgmed_buf->protocol, buf, sizeof(buf), &read); + do hres = IInternetProtocolEx_Read(stgmed_buf->protocol, buf, sizeof(buf), &read); while(hres == S_OK); } @@ -178,8 +179,8 @@ static void stop_binding(Binding *binding, HRESULT hres, LPCWSTR str) if(!(binding->state & BINDING_STOPPED)) { binding->state |= BINDING_STOPPED; - IBindStatusCallback_OnStopBinding(binding->callback, hres, str); binding->hres = hres; + IBindStatusCallback_OnStopBinding(binding->callback, hres, str); } } @@ -310,6 +311,7 @@ static void create_object(Binding *binding) heap_free(clsid_str); IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_ENDSYNCOPERATION, NULL); + binding->clsid = CLSID_NULL; stop_binding(binding, hres, NULL); if(FAILED(hres)) @@ -372,7 +374,7 @@ static ULONG WINAPI StgMedUnk_Release(IUnknown *iface) if(!ref) { if(This->file != INVALID_HANDLE_VALUE) CloseHandle(This->file); - IInternetProtocol_Release(This->protocol); + IInternetProtocolEx_Release(This->protocol); heap_free(This->cache_file); heap_free(This); @@ -398,7 +400,7 @@ static stgmed_buf_t *create_stgmed_buf(IInternetProtocolEx *protocol) ret->hres = S_OK; ret->cache_file = NULL; - IInternetProtocol_AddRef(protocol); + IInternetProtocolEx_AddRef(protocol); ret->protocol = protocol; URLMON_LockModule(); @@ -484,7 +486,7 @@ static HRESULT WINAPI ProtocolStream_Read(IStream *iface, void *pv, TRACE("(%p)->(%p %d %p)\n", This, pv, cb, pcbRead); if(This->buf->file == INVALID_HANDLE_VALUE) { - hres = This->buf->hres = IInternetProtocol_Read(This->buf->protocol, (PBYTE)pv, cb, &read); + hres = This->buf->hres = IInternetProtocolEx_Read(This->buf->protocol, (PBYTE)pv, cb, &read); }else { hres = ReadFile(This->buf->file, pv, cb, &read, NULL) ? S_OK : INET_E_DOWNLOAD_FAILURE; } @@ -881,8 +883,23 @@ static HRESULT WINAPI Binding_GetBindResult(IBinding *iface, CLSID *pclsidProtoc DWORD *pdwResult, LPOLESTR *pszResult, DWORD *pdwReserved) { Binding *This = impl_from_IBinding(iface); - FIXME("(%p)->(%p %p %p %p)\n", This, pclsidProtocol, pdwResult, pszResult, pdwReserved); - return E_NOTIMPL; + + TRACE("(%p)->(%p %p %p %p)\n", This, pclsidProtocol, pdwResult, pszResult, pdwReserved); + + if(!pdwResult || !pszResult || pdwReserved) + return E_INVALIDARG; + + if(!(This->state & BINDING_STOPPED)) { + *pclsidProtocol = CLSID_NULL; + *pdwResult = 0; + *pszResult = NULL; + return S_OK; + } + + *pclsidProtocol = This->hres==S_OK ? CLSID_NULL : This->clsid; + *pdwResult = This->hres; + *pszResult = NULL; + return S_OK; } static const IBindingVtbl BindingVtbl = { @@ -963,7 +980,7 @@ static HRESULT WINAPI InternetProtocolSink_ReportProgress(IInternetProtocolSink { Binding *This = impl_from_IInternetProtocolSink(iface); - TRACE("(%p)->(%u %s)\n", This, ulStatusCode, debugstr_w(szStatusText)); + TRACE("(%p)->(%s %s)\n", This, debugstr_bindstatus(ulStatusCode), debugstr_w(szStatusText)); switch(ulStatusCode) { case BINDSTATUS_FINDINGRESOURCE: @@ -983,6 +1000,7 @@ static HRESULT WINAPI InternetProtocolSink_ReportProgress(IInternetProtocolSink on_progress(This, 0, 0, BINDSTATUS_SENDINGREQUEST, szStatusText); break; case BINDSTATUS_PROTOCOLCLASSID: + CLSIDFromString(szStatusText, &This->clsid); break; case BINDSTATUS_MIMETYPEAVAILABLE: case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE: @@ -1077,8 +1095,19 @@ static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progres formatetc.tymed = stgmed.tymed; formatetc.cfFormat = This->clipboard_format; - IBindStatusCallback_OnDataAvailable(This->callback, bscf, progress, + hres = IBindStatusCallback_OnDataAvailable(This->callback, bscf, progress, &formatetc, &stgmed); + if(hres != S_OK) { + if(This->download_state != END_DOWNLOAD) { + This->download_state = END_DOWNLOAD; + IBindStatusCallback_OnProgress(This->callback, progress, progress_max, + BINDSTATUS_ENDDOWNLOADDATA, This->url); + } + + WARN("OnDataAvailable returned %x\n", hres); + stop_binding(This, hres, NULL); + return; + } if(This->download_state == END_DOWNLOAD) stop_binding(This, S_OK, NULL); @@ -1104,6 +1133,7 @@ static HRESULT WINAPI InternetProtocolSink_ReportResult(IInternetProtocolSink *i TRACE("(%p)->(%08x %d %s)\n", This, hrResult, dwError, debugstr_w(szResult)); stop_binding(This, hrResult, szResult); + IInternetProtocolEx_Terminate(&This->protocol->IInternetProtocolEx_iface, 0); return S_OK; } @@ -1150,19 +1180,7 @@ static HRESULT WINAPI InternetBindInfo_GetBindInfo(IInternetBindInfo *iface, TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo); *grfBINDF = This->bindf; - - *pbindinfo = This->bindinfo; - - if(pbindinfo->szExtraInfo || pbindinfo->szCustomVerb) - FIXME("copy strings\n"); - - if(pbindinfo->stgmedData.pUnkForRelease) - IUnknown_AddRef(pbindinfo->stgmedData.pUnkForRelease); - - if(pbindinfo->pUnk) - IUnknown_AddRef(pbindinfo->pUnk); - - return S_OK; + return CopyBindInfo(&This->bindinfo, pbindinfo); } static HRESULT WINAPI InternetBindInfo_GetBindString(IInternetBindInfo *iface, diff --git a/dll/win32/urlmon/bindprot.c b/dll/win32/urlmon/bindprot.c index ed8c5f4a733..7326e761fc7 100644 --- a/dll/win32/urlmon/bindprot.c +++ b/dll/win32/urlmon/bindprot.c @@ -34,32 +34,38 @@ struct _task_header_t { #define WM_MK_CONTINUE (WM_USER+101) #define WM_MK_RELEASE (WM_USER+102) +static void process_tasks(BindProtocol *This) +{ + task_header_t *task; + + while(1) { + EnterCriticalSection(&This->section); + + task = This->task_queue_head; + if(task) { + This->task_queue_head = task->next; + if(!This->task_queue_head) + This->task_queue_tail = NULL; + } + + LeaveCriticalSection(&This->section); + + if(!task) + break; + + This->continue_call++; + task->proc(This, task); + This->continue_call--; + } +} + static LRESULT WINAPI notif_wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_MK_CONTINUE: { BindProtocol *This = (BindProtocol*)lParam; - task_header_t *task; - while(1) { - EnterCriticalSection(&This->section); - - task = This->task_queue_head; - if(task) { - This->task_queue_head = task->next; - if(!This->task_queue_head) - This->task_queue_tail = NULL; - } - - LeaveCriticalSection(&This->section); - - if(!task) - break; - - This->continue_call++; - task->proc(This, task); - This->continue_call--; - } + process_tasks(This); IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface); return 0; @@ -165,48 +171,45 @@ static void push_task(BindProtocol *This, task_header_t *task, task_proc_t proc) } } -static inline BOOL do_direct_notif(BindProtocol *This) +static inline BOOL is_apartment_thread(BindProtocol *This) { - return !(This->pi & PI_APARTMENTTHREADED) || (This->apartment_thread == GetCurrentThreadId() && !This->continue_call); + return This->apartment_thread == GetCurrentThreadId(); } -static HRESULT handle_mime_filter(BindProtocol *This, IInternetProtocol *mime_filter, LPCWSTR mime) +static inline BOOL do_direct_notif(BindProtocol *This) +{ + return !(This->pi & PI_APARTMENTTHREADED) || (is_apartment_thread(This) && !This->continue_call); +} + +static HRESULT handle_mime_filter(BindProtocol *This, IInternetProtocol *mime_filter) { PROTOCOLFILTERDATA filter_data = { sizeof(PROTOCOLFILTERDATA), NULL, NULL, NULL, 0 }; - IInternetProtocolSink *protocol_sink, *old_sink; - ProtocolProxy *filter_proxy; HRESULT hres; - hres = IInternetProtocol_QueryInterface(mime_filter, &IID_IInternetProtocolSink, (void**)&protocol_sink); - if(FAILED(hres)) - return hres; - - hres = create_protocol_proxy(&This->default_protocol_handler.IInternetProtocol_iface, This->protocol_sink, &filter_proxy); + hres = IInternetProtocol_QueryInterface(mime_filter, &IID_IInternetProtocolSink, (void**)&This->protocol_sink_handler); if(FAILED(hres)) { - IInternetProtocolSink_Release(protocol_sink); + This->protocol_sink_handler = &This->default_protocol_handler.IInternetProtocolSink_iface; return hres; } - old_sink = This->protocol_sink; - This->protocol_sink = protocol_sink; - This->filter_proxy = filter_proxy; - IInternetProtocol_AddRef(mime_filter); This->protocol_handler = mime_filter; - filter_data.pProtocol = &filter_proxy->IInternetProtocol_iface; - hres = IInternetProtocol_Start(mime_filter, mime, &filter_proxy->IInternetProtocolSink_iface, + filter_data.pProtocol = &This->default_protocol_handler.IInternetProtocol_iface; + hres = IInternetProtocol_Start(mime_filter, This->mime, &This->default_protocol_handler.IInternetProtocolSink_iface, &This->IInternetBindInfo_iface, PI_FILTER_MODE|PI_FORCE_ASYNC, (HANDLE_PTR)&filter_data); if(FAILED(hres)) { - IInternetProtocolSink_Release(old_sink); + IInternetProtocolSink_Release(This->protocol_sink_handler); + IInternetProtocol_Release(This->protocol_handler); + This->protocol_sink_handler = &This->default_protocol_handler.IInternetProtocolSink_iface; + This->protocol_handler = &This->default_protocol_handler.IInternetProtocol_iface; return hres; } - IInternetProtocolSink_ReportProgress(old_sink, BINDSTATUS_LOADINGMIMEHANDLER, NULL); - IInternetProtocolSink_Release(old_sink); + /* NOTE: IE9 calls it on the new protocol_sink. It doesn't make sense to is seems to be a bug there. */ + IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_LOADINGMIMEHANDLER, NULL); - This->pi &= ~PI_MIMEVERIFICATION; /* FIXME: more tests */ return S_OK; } @@ -216,25 +219,21 @@ static void mime_available(BindProtocol *This, LPCWSTR mime, BOOL verified) HRESULT hres; heap_free(This->mime); - This->mime = NULL; + This->mime = heap_strdupW(mime); - mime_filter = get_mime_filter(mime); - if(mime_filter) { + if(This->protocol_handler==&This->default_protocol_handler.IInternetProtocol_iface + && (mime_filter = get_mime_filter(mime))) { TRACE("Got mime filter for %s\n", debugstr_w(mime)); - hres = handle_mime_filter(This, mime_filter, mime); + hres = handle_mime_filter(This, mime_filter); IInternetProtocol_Release(mime_filter); if(FAILED(hres)) FIXME("MIME filter failed: %08x\n", hres); - }else { - This->mime = heap_strdupW(mime); + } - if(verified || !(This->pi & PI_MIMEVERIFICATION)) { - This->reported_mime = TRUE; - - if(This->protocol_sink) - IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_MIMETYPEAVAILABLE, mime); - } + if(This->reported_mime || verified || !(This->pi & PI_MIMEVERIFICATION)) { + This->reported_mime = TRUE; + IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_MIMETYPEAVAILABLE, mime); } } @@ -337,15 +336,18 @@ static ULONG WINAPI BindProtocol_Release(IInternetProtocolEx *iface) IInternetBindInfo_Release(This->bind_info); if(This->protocol_handler && This->protocol_handler != &This->default_protocol_handler.IInternetProtocol_iface) IInternetProtocol_Release(This->protocol_handler); - if(This->filter_proxy) - IInternetProtocol_Release(&This->filter_proxy->IInternetProtocol_iface); + if(This->protocol_sink_handler && + This->protocol_sink_handler != &This->default_protocol_handler.IInternetProtocolSink_iface) + IInternetProtocolSink_Release(This->protocol_sink_handler); if(This->uri) IUri_Release(This->uri); + SysFreeString(This->display_uri); set_binding_sink(This, NULL, NULL); if(This->notif_hwnd) release_notif_hwnd(This->notif_hwnd); + This->section.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->section); heap_free(This->mime); @@ -544,17 +546,16 @@ static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr &This->IInternetBindInfo_iface, 0, NULL); IInternetProtocolEx_Release(protocolex); }else { - BSTR display_uri; - - hres = IUri_GetDisplayUri(pUri, &display_uri); + hres = IUri_GetDisplayUri(pUri, &This->display_uri); if(FAILED(hres)) return hres; - hres = IInternetProtocol_Start(protocol, display_uri, &This->IInternetProtocolSink_iface, + hres = IInternetProtocol_Start(protocol, This->display_uri, &This->IInternetProtocolSink_iface, &This->IInternetBindInfo_iface, 0, 0); - SysFreeString(display_uri); } + if(SUCCEEDED(hres)) + process_tasks(This); return hres; } @@ -606,7 +607,29 @@ static inline BindProtocol *impl_from_IInternetProtocol(IInternetProtocol *iface static HRESULT WINAPI ProtocolHandler_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) { - ERR("should not be called\n"); + BindProtocol *This = impl_from_IInternetProtocol(iface); + + *ppv = NULL; + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = &This->default_protocol_handler.IInternetProtocol_iface; + }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { + TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); + *ppv = &This->default_protocol_handler.IInternetProtocol_iface; + }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { + TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); + *ppv = &This->default_protocol_handler.IInternetProtocol_iface; + }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) { + TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv); + *ppv = &This->default_protocol_handler.IInternetProtocolSink_iface; + } + + if(*ppv) { + IInternetProtocol_AddRef(iface); + return S_OK; + } + + WARN("not supported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; } @@ -667,11 +690,6 @@ static HRESULT WINAPI ProtocolHandler_Terminate(IInternetProtocol *iface, DWORD IInternetProtocol_Terminate(This->protocol, 0); - if(This->filter_proxy) { - IInternetProtocol_Release(&This->filter_proxy->IInternetProtocol_iface); - This->filter_proxy = NULL; - } - set_binding_sink(This, NULL, NULL); if(This->bind_info) { @@ -722,7 +740,11 @@ static HRESULT WINAPI ProtocolHandler_Read(IInternetProtocol *iface, void *pv, if(read < cb) { ULONG cread = 0; + if(is_apartment_thread(This)) + This->continue_call++; hres = IInternetProtocol_Read(This->protocol, (BYTE*)pv+read, cb-read, &cread); + if(is_apartment_thread(This)) + This->continue_call--; read += cread; } @@ -772,6 +794,188 @@ static const IInternetProtocolVtbl InternetProtocolHandlerVtbl = { ProtocolHandler_UnlockRequest }; +static inline BindProtocol *impl_from_IInternetProtocolSinkHandler(IInternetProtocolSink *iface) +{ + return CONTAINING_RECORD(iface, BindProtocol, default_protocol_handler.IInternetProtocolSink_iface); +} + +static HRESULT WINAPI ProtocolSinkHandler_QueryInterface(IInternetProtocolSink *iface, + REFIID riid, void **ppvObject) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + return IInternetProtocol_QueryInterface(&This->default_protocol_handler.IInternetProtocol_iface, + riid, ppvObject); +} + +static ULONG WINAPI ProtocolSinkHandler_AddRef(IInternetProtocolSink *iface) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface); +} + +static ULONG WINAPI ProtocolSinkHandler_Release(IInternetProtocolSink *iface) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface); +} + +static HRESULT WINAPI ProtocolSinkHandler_Switch(IInternetProtocolSink *iface, + PROTOCOLDATA *pProtocolData) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + + TRACE("(%p)->(%p)\n", This, pProtocolData); + + if(!This->protocol_sink) { + IInternetProtocol_Continue(This->protocol_handler, pProtocolData); + return S_OK; + } + + return IInternetProtocolSink_Switch(This->protocol_sink, pProtocolData); +} + +static HRESULT WINAPI ProtocolSinkHandler_ReportProgress(IInternetProtocolSink *iface, + ULONG status_code, LPCWSTR status_text) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + + TRACE("(%p)->(%s %s)\n", This, debugstr_bindstatus(status_code), debugstr_w(status_text)); + + if(!This->protocol_sink) + return S_OK; + + switch(status_code) { + case BINDSTATUS_FINDINGRESOURCE: + case BINDSTATUS_CONNECTING: + case BINDSTATUS_REDIRECTING: + case BINDSTATUS_SENDINGREQUEST: + case BINDSTATUS_CACHEFILENAMEAVAILABLE: + case BINDSTATUS_DIRECTBIND: + case BINDSTATUS_ACCEPTRANGES: + case BINDSTATUS_DECODING: + IInternetProtocolSink_ReportProgress(This->protocol_sink, status_code, status_text); + break; + + case BINDSTATUS_BEGINDOWNLOADDATA: + IInternetProtocolSink_ReportData(This->protocol_sink, This->bscf, This->progress, This->progress_max); + break; + + case BINDSTATUS_MIMETYPEAVAILABLE: + mime_available(This, status_text, FALSE); + break; + + case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE: + mime_available(This, status_text, TRUE); + break; + + default: + FIXME("unsupported ulStatusCode %u\n", status_code); + } + + return S_OK; +} + +static HRESULT WINAPI ProtocolSinkHandler_ReportData(IInternetProtocolSink *iface, + DWORD bscf, ULONG progress, ULONG progress_max) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + + TRACE("(%p)->(%x %u %u)\n", This, bscf, progress, progress_max); + + This->bscf = bscf; + This->progress = progress; + This->progress_max = progress_max; + + if(!This->protocol_sink) + return S_OK; + + if((This->pi & PI_MIMEVERIFICATION) && !This->reported_mime) { + BYTE buf[BUFFER_SIZE]; + DWORD read = 0; + LPWSTR mime; + HRESULT hres; + + do { + read = 0; + hres = IInternetProtocol_Read(This->protocol, buf, + sizeof(buf)-This->buf_size, &read); + if(FAILED(hres) && hres != E_PENDING) + return hres; + + if(!This->buf) { + This->buf = heap_alloc(BUFFER_SIZE); + if(!This->buf) + return E_OUTOFMEMORY; + }else if(read + This->buf_size > BUFFER_SIZE) { + BYTE *tmp; + + tmp = heap_realloc(This->buf, read+This->buf_size); + if(!tmp) + return E_OUTOFMEMORY; + This->buf = tmp; + } + + memcpy(This->buf+This->buf_size, buf, read); + This->buf_size += read; + }while(This->buf_size < MIME_TEST_SIZE && hres == S_OK); + + if(This->buf_size < MIME_TEST_SIZE && hres != S_FALSE) + return S_OK; + + bscf = BSCF_FIRSTDATANOTIFICATION; + if(hres == S_FALSE) + bscf |= BSCF_LASTDATANOTIFICATION|BSCF_DATAFULLYAVAILABLE; + + if(!This->reported_mime) { + BSTR raw_uri; + + hres = IUri_GetRawUri(This->uri, &raw_uri); + if(FAILED(hres)) + return hres; + + hres = FindMimeFromData(NULL, raw_uri, This->buf, min(This->buf_size, MIME_TEST_SIZE), + This->mime, 0, &mime, 0); + SysFreeString(raw_uri); + if(FAILED(hres)) + return hres; + + heap_free(This->mime); + This->mime = heap_strdupW(mime); + CoTaskMemFree(mime); + This->reported_mime = TRUE; + if(This->protocol_sink) + IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_MIMETYPEAVAILABLE, This->mime); + } + } + + if(!This->protocol_sink) + return S_OK; + + return IInternetProtocolSink_ReportData(This->protocol_sink, bscf, progress, progress_max); +} + +static HRESULT WINAPI ProtocolSinkHandler_ReportResult(IInternetProtocolSink *iface, + HRESULT hrResult, DWORD dwError, LPCWSTR szResult) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + + TRACE("(%p)->(%08x %d %s)\n", This, hrResult, dwError, debugstr_w(szResult)); + + if(This->protocol_sink) + return IInternetProtocolSink_ReportResult(This->protocol_sink, hrResult, dwError, szResult); + return S_OK; +} + +static const IInternetProtocolSinkVtbl InternetProtocolSinkHandlerVtbl = { + ProtocolSinkHandler_QueryInterface, + ProtocolSinkHandler_AddRef, + ProtocolSinkHandler_Release, + ProtocolSinkHandler_Switch, + ProtocolSinkHandler_ReportProgress, + ProtocolSinkHandler_ReportData, + ProtocolSinkHandler_ReportResult +}; + static inline BindProtocol *impl_from_IInternetBindInfo(IInternetBindInfo *iface) { return CONTAINING_RECORD(iface, BindProtocol, IInternetBindInfo_iface); @@ -939,12 +1143,16 @@ static HRESULT WINAPI BPInternetProtocolSink_Switch(IInternetProtocolSink *iface return E_OUTOFMEMORY; memcpy(data, pProtocolData, sizeof(PROTOCOLDATA)); - if(!do_direct_notif(This)) { + if((This->pi&PI_APARTMENTTHREADED && pProtocolData->grfFlags&PI_FORCE_ASYNC) + || !do_direct_notif(This)) { switch_task_t *task; task = heap_alloc(sizeof(switch_task_t)); if(!task) + { + heap_free(data); return E_OUTOFMEMORY; + } task->data = data; @@ -952,44 +1160,7 @@ static HRESULT WINAPI BPInternetProtocolSink_Switch(IInternetProtocolSink *iface return S_OK; } - if(!This->protocol_sink) { - IInternetProtocol_Continue(This->protocol_handler, data); - return S_OK; - } - - return IInternetProtocolSink_Switch(This->protocol_sink, data); -} - -static void report_progress(BindProtocol *This, ULONG status_code, LPCWSTR status_text) -{ - switch(status_code) { - case BINDSTATUS_FINDINGRESOURCE: - case BINDSTATUS_CONNECTING: - case BINDSTATUS_REDIRECTING: - case BINDSTATUS_SENDINGREQUEST: - case BINDSTATUS_CACHEFILENAMEAVAILABLE: - case BINDSTATUS_DIRECTBIND: - case BINDSTATUS_ACCEPTRANGES: - if(This->protocol_sink) - IInternetProtocolSink_ReportProgress(This->protocol_sink, status_code, status_text); - break; - - case BINDSTATUS_BEGINDOWNLOADDATA: - if(This->protocol_sink) - IInternetProtocolSink_ReportData(This->protocol_sink, This->bscf, This->progress, This->progress_max); - break; - - case BINDSTATUS_MIMETYPEAVAILABLE: - mime_available(This, status_text, FALSE); - break; - - case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE: - mime_available(This, status_text, TRUE); - break; - - default: - FIXME("unsupported ulStatusCode %u\n", status_code); - } + return IInternetProtocolSink_Switch(This->protocol_sink_handler, data); } typedef struct { @@ -1003,7 +1174,7 @@ static void on_progress_proc(BindProtocol *This, task_header_t *t) { on_progress_task_t *task = (on_progress_task_t*)t; - report_progress(This, task->status_code, task->status_text); + IInternetProtocolSink_ReportProgress(This->protocol_sink_handler, task->status_code, task->status_text); heap_free(task->status_text); heap_free(task); @@ -1017,7 +1188,7 @@ static HRESULT WINAPI BPInternetProtocolSink_ReportProgress(IInternetProtocolSin TRACE("(%p)->(%u %s)\n", This, ulStatusCode, debugstr_w(szStatusText)); if(do_direct_notif(This)) { - report_progress(This, ulStatusCode, szStatusText); + IInternetProtocolSink_ReportProgress(This->protocol_sink_handler, ulStatusCode, szStatusText); }else { on_progress_task_t *task; @@ -1032,76 +1203,6 @@ static HRESULT WINAPI BPInternetProtocolSink_ReportProgress(IInternetProtocolSin return S_OK; } -static HRESULT report_data(BindProtocol *This, DWORD bscf, ULONG progress, ULONG progress_max) -{ - This->bscf = bscf; - This->progress = progress; - This->progress_max = progress_max; - - if(!This->protocol_sink) - return S_OK; - - if((This->pi & PI_MIMEVERIFICATION) && !This->reported_mime) { - BYTE buf[BUFFER_SIZE]; - DWORD read = 0; - LPWSTR mime; - HRESULT hres; - - do { - read = 0; - hres = IInternetProtocol_Read(This->protocol, buf, - sizeof(buf)-This->buf_size, &read); - if(FAILED(hres) && hres != E_PENDING) - return hres; - - if(!This->buf) { - This->buf = heap_alloc(BUFFER_SIZE); - if(!This->buf) - return E_OUTOFMEMORY; - }else if(read + This->buf_size > BUFFER_SIZE) { - BYTE *tmp; - - tmp = heap_realloc(This->buf, read+This->buf_size); - if(!tmp) - return E_OUTOFMEMORY; - This->buf = tmp; - } - - memcpy(This->buf+This->buf_size, buf, read); - This->buf_size += read; - }while(This->buf_size < MIME_TEST_SIZE && hres == S_OK); - - if(This->buf_size < MIME_TEST_SIZE && hres != S_FALSE) - return S_OK; - - bscf = BSCF_FIRSTDATANOTIFICATION; - if(hres == S_FALSE) - bscf |= BSCF_LASTDATANOTIFICATION|BSCF_DATAFULLYAVAILABLE; - - if(!This->reported_mime) { - BSTR raw_uri; - - hres = IUri_GetRawUri(This->uri, &raw_uri); - if(FAILED(hres)) - return hres; - - hres = FindMimeFromData(NULL, raw_uri, This->buf, min(This->buf_size, MIME_TEST_SIZE), - This->mime, 0, &mime, 0); - SysFreeString(raw_uri); - if(FAILED(hres)) - return hres; - - mime_available(This, mime, TRUE); - CoTaskMemFree(mime); - } - } - - if(!This->protocol_sink) - return S_OK; - - return IInternetProtocolSink_ReportData(This->protocol_sink, bscf, progress, progress_max); -} - typedef struct { task_header_t header; DWORD bscf; @@ -1113,7 +1214,9 @@ static void report_data_proc(BindProtocol *This, task_header_t *t) { report_data_task_t *task = (report_data_task_t*)t; - report_data(This, task->bscf, task->progress, task->progress_max); + IInternetProtocolSink_ReportData(This->protocol_sink_handler, + task->bscf, task->progress, task->progress_max); + heap_free(task); } @@ -1122,7 +1225,7 @@ static HRESULT WINAPI BPInternetProtocolSink_ReportData(IInternetProtocolSink *i { BindProtocol *This = impl_from_IInternetProtocolSink(iface); - TRACE("(%p)->(%d %u %u)\n", This, grfBSCF, ulProgress, ulProgressMax); + TRACE("(%p)->(%x %u %u)\n", This, grfBSCF, ulProgress, ulProgressMax); if(!This->protocol_sink) return S_OK; @@ -1142,7 +1245,8 @@ static HRESULT WINAPI BPInternetProtocolSink_ReportData(IInternetProtocolSink *i return S_OK; } - return report_data(This, grfBSCF, ulProgress, ulProgressMax); + return IInternetProtocolSink_ReportData(This->protocol_sink_handler, + grfBSCF, ulProgress, ulProgressMax); } typedef struct { @@ -1157,8 +1261,7 @@ static void report_result_proc(BindProtocol *This, task_header_t *t) { report_result_task_t *task = (report_result_task_t*)t; - if(This->protocol_sink) - IInternetProtocolSink_ReportResult(This->protocol_sink, task->hres, task->err, task->str); + IInternetProtocolSink_ReportResult(This->protocol_sink_handler, task->hres, task->err, task->str); heap_free(task->str); heap_free(task); @@ -1173,7 +1276,6 @@ static HRESULT WINAPI BPInternetProtocolSink_ReportResult(IInternetProtocolSink if(!This->protocol_sink) return E_FAIL; - This->reported_result = TRUE; if(!do_direct_notif(This)) { @@ -1191,7 +1293,7 @@ static HRESULT WINAPI BPInternetProtocolSink_ReportResult(IInternetProtocolSink return S_OK; } - return IInternetProtocolSink_ReportResult(This->protocol_sink, hrResult, dwError, szResult); + return IInternetProtocolSink_ReportResult(This->protocol_sink_handler, hrResult, dwError, szResult); } static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl = { @@ -1307,13 +1409,16 @@ HRESULT create_binding_protocol(BOOL from_urlmon, BindProtocol **protocol) ret->IWinInetHttpInfo_iface.lpVtbl = &WinInetHttpInfoVtbl; ret->default_protocol_handler.IInternetProtocol_iface.lpVtbl = &InternetProtocolHandlerVtbl; + ret->default_protocol_handler.IInternetProtocolSink_iface.lpVtbl = &InternetProtocolSinkHandlerVtbl; ret->ref = 1; ret->from_urlmon = from_urlmon; ret->apartment_thread = GetCurrentThreadId(); ret->notif_hwnd = get_notif_hwnd(); ret->protocol_handler = &ret->default_protocol_handler.IInternetProtocol_iface; + ret->protocol_sink_handler = &ret->default_protocol_handler.IInternetProtocolSink_iface; InitializeCriticalSection(&ret->section); + ret->section.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": BindProtocol.section"); URLMON_LockModule(); diff --git a/dll/win32/urlmon/download.c b/dll/win32/urlmon/download.c index e86ad93defc..d83bc287d9b 100644 --- a/dll/win32/urlmon/download.c +++ b/dll/win32/urlmon/download.c @@ -31,6 +31,10 @@ typedef struct { IBinding *binding; LPWSTR file_name; LPWSTR cache_file; + DWORD bindf; + + stop_cache_binding_proc_t onstop_proc; + void *ctx; } DownloadBSC; static inline DownloadBSC *impl_from_IBindStatusCallback(IBindStatusCallback *iface) @@ -62,7 +66,7 @@ static HRESULT WINAPI DownloadBSC_QueryInterface(IBindStatusCallback *iface, } if(*ppv) { - IBindStatusCallback_AddRef((IUnknown*)*ppv); + IUnknown_AddRef((IUnknown*)*ppv); return S_OK; } @@ -189,6 +193,7 @@ static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface, HRESULT hresult, LPCWSTR szError) { DownloadBSC *This = impl_from_IBindStatusCallback(iface); + HRESULT hres = S_OK; TRACE("(%p)->(%08x %s)\n", This, hresult, debugstr_w(szError)); @@ -204,7 +209,9 @@ static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface, } } - if(This->callback) + if(This->onstop_proc) + hres = This->onstop_proc(This->ctx, This->cache_file, hresult, szError); + else if(This->callback) IBindStatusCallback_OnStopBinding(This->callback, hresult, szError); if(This->binding) { @@ -212,7 +219,7 @@ static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface, This->binding = NULL; } - return S_OK; + return hres; } static HRESULT WINAPI DownloadBSC_GetBindInfo(IBindStatusCallback *iface, @@ -235,7 +242,7 @@ static HRESULT WINAPI DownloadBSC_GetBindInfo(IBindStatusCallback *iface, ReleaseBindInfo(&bindinfo); } - *grfBINDF = BINDF_PULLDATA | BINDF_NEEDFILE | (bindf & BINDF_ENFORCERESTRICTED); + *grfBINDF = BINDF_PULLDATA | BINDF_NEEDFILE | (bindf & BINDF_ENFORCERESTRICTED) | This->bindf; return S_OK; } @@ -323,39 +330,84 @@ static const IServiceProviderVtbl ServiceProviderVtbl = { DwlServiceProvider_QueryService }; -static HRESULT DownloadBSC_Create(IBindStatusCallback *callback, LPCWSTR file_name, IBindStatusCallback **ret_callback) +static HRESULT DownloadBSC_Create(IBindStatusCallback *callback, LPCWSTR file_name, DownloadBSC **ret_callback) { - DownloadBSC *ret = heap_alloc(sizeof(*ret)); + DownloadBSC *ret; + + ret = heap_alloc_zero(sizeof(*ret)); + if(!ret) + return E_OUTOFMEMORY; ret->IBindStatusCallback_iface.lpVtbl = &BindStatusCallbackVtbl; ret->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl; ret->ref = 1; - ret->file_name = heap_strdupW(file_name); - ret->cache_file = NULL; - ret->binding = NULL; + + if(file_name) { + ret->file_name = heap_strdupW(file_name); + if(!ret->file_name) { + heap_free(ret); + return E_OUTOFMEMORY; + } + } if(callback) IBindStatusCallback_AddRef(callback); ret->callback = callback; - *ret_callback = &ret->IBindStatusCallback_iface; + *ret_callback = ret; return S_OK; } HRESULT create_default_callback(IBindStatusCallback **ret) { - IBindStatusCallback *callback; + DownloadBSC *callback; HRESULT hres; hres = DownloadBSC_Create(NULL, NULL, &callback); if(FAILED(hres)) return hres; - hres = wrap_callback(callback, ret); - IBindStatusCallback_Release(callback); + hres = wrap_callback(&callback->IBindStatusCallback_iface, ret); + IBindStatusCallback_Release(&callback->IBindStatusCallback_iface); return hres; } +HRESULT download_to_cache(IUri *uri, stop_cache_binding_proc_t proc, void *ctx, IBindStatusCallback *callback) +{ + DownloadBSC *dwl_bsc; + IBindCtx *bindctx; + IMoniker *mon; + IUnknown *unk; + HRESULT hres; + + hres = DownloadBSC_Create(callback, NULL, &dwl_bsc); + if(FAILED(hres)) + return hres; + + dwl_bsc->onstop_proc = proc; + dwl_bsc->ctx = ctx; + dwl_bsc->bindf = BINDF_ASYNCHRONOUS; + + hres = CreateAsyncBindCtx(0, &dwl_bsc->IBindStatusCallback_iface, NULL, &bindctx); + IBindStatusCallback_Release(&dwl_bsc->IBindStatusCallback_iface); + if(FAILED(hres)) + return hres; + + hres = CreateURLMonikerEx2(NULL, uri, &mon, 0); + if(FAILED(hres)) { + IBindCtx_Release(bindctx); + return hres; + } + + hres = IMoniker_BindToStorage(mon, bindctx, NULL, &IID_IUnknown, (void**)&unk); + IMoniker_Release(mon); + IBindCtx_Release(bindctx); + if(SUCCEEDED(hres) && unk) + IUnknown_Release(unk); + return hres; + +} + /*********************************************************************** * URLDownloadToFileW (URLMON.@) * @@ -375,7 +427,7 @@ HRESULT create_default_callback(IBindStatusCallback **ret) HRESULT WINAPI URLDownloadToFileW(LPUNKNOWN pCaller, LPCWSTR szURL, LPCWSTR szFileName, DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB) { - IBindStatusCallback *callback; + DownloadBSC *callback; IUnknown *unk; IMoniker *mon; IBindCtx *bindctx; @@ -390,8 +442,8 @@ HRESULT WINAPI URLDownloadToFileW(LPUNKNOWN pCaller, LPCWSTR szURL, LPCWSTR szFi if(FAILED(hres)) return hres; - hres = CreateAsyncBindCtx(0, callback, NULL, &bindctx); - IBindStatusCallback_Release(callback); + hres = CreateAsyncBindCtx(0, &callback->IBindStatusCallback_iface, NULL, &bindctx); + IBindStatusCallback_Release(&callback->IBindStatusCallback_iface); if(FAILED(hres)) return hres; diff --git a/dll/win32/urlmon/file.c b/dll/win32/urlmon/file.c index bab87fe994b..4bb366a2ff9 100644 --- a/dll/win32/urlmon/file.c +++ b/dll/win32/urlmon/file.c @@ -68,7 +68,7 @@ static HRESULT WINAPI FileProtocol_QueryInterface(IInternetProtocolEx *iface, RE } if(*ppv) { - IInternetProtocol_AddRef(iface); + IInternetProtocolEx_AddRef(iface); return S_OK; } @@ -245,12 +245,13 @@ static HRESULT WINAPI FileProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr DWORD grfPI, HANDLE *dwReserved) { FileProtocol *This = impl_from_IInternetProtocolEx(iface); + WCHAR path[MAX_PATH]; BINDINFO bindinfo; DWORD grfBINDF = 0; - DWORD scheme; + DWORD scheme, size; LPWSTR mime = NULL; WCHAR null_char = 0; - BSTR path, url; + BSTR url; HRESULT hres; TRACE("(%p)->(%p %p %p %08x %p)\n", This, pUri, pOIProtSink, @@ -288,14 +289,14 @@ static HRESULT WINAPI FileProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_SENDINGREQUEST, &null_char); - hres = IUri_GetPath(pUri, &path); + size = 0; + hres = CoInternetParseIUri(pUri, PARSE_PATH_FROM_URL, 0, path, sizeof(path)/sizeof(WCHAR), &size, 0); if(FAILED(hres)) { - ERR("GetPath failed: %08x\n", hres); + WARN("CoInternetParseIUri failed: %08x\n", hres); return report_result(pOIProtSink, hres, 0); } hres = open_file(This, path, pOIProtSink); - SysFreeString(path); if(FAILED(hres)) return hres; diff --git a/dll/win32/urlmon/ftp.c b/dll/win32/urlmon/ftp.c index 5a69bba99b9..ec6b9d34d53 100644 --- a/dll/win32/urlmon/ftp.c +++ b/dll/win32/urlmon/ftp.c @@ -144,7 +144,7 @@ static HRESULT WINAPI FtpProtocol_QueryInterface(IInternetProtocolEx *iface, REF } if(*ppv) { - IInternetProtocol_AddRef(iface); + IInternetProtocolEx_AddRef(iface); return S_OK; } diff --git a/dll/win32/urlmon/http.c b/dll/win32/urlmon/http.c index 0f781f0a7ad..c859a8c8b12 100644 --- a/dll/win32/urlmon/http.c +++ b/dll/win32/urlmon/http.c @@ -79,18 +79,13 @@ static LPWSTR query_http_info(HttpProtocol *This, DWORD option) return ret; } -static inline BOOL set_security_flag(HttpProtocol *This, DWORD new_flag) +static inline BOOL set_security_flag(HttpProtocol *This, DWORD flags) { - DWORD flags, size = sizeof(flags); BOOL res; - res = InternetQueryOptionW(This->base.request, INTERNET_OPTION_SECURITY_FLAGS, &flags, &size); - if(res) { - flags |= new_flag; - res = InternetSetOptionW(This->base.request, INTERNET_OPTION_SECURITY_FLAGS, &flags, size); - } + res = InternetSetOptionW(This->base.request, INTERNET_OPTION_SECURITY_FLAGS, &flags, sizeof(flags)); if(!res) - ERR("Failed to set security flag(s): %x\n", new_flag); + ERR("Failed to set security flags: %x\n", flags); return res; } @@ -103,6 +98,11 @@ static inline HRESULT internet_error_to_hres(DWORD error) case ERROR_INTERNET_SEC_CERT_CN_INVALID: case ERROR_INTERNET_INVALID_CA: case ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED: + case ERROR_INTERNET_SEC_INVALID_CERT: + case ERROR_INTERNET_SEC_CERT_ERRORS: + case ERROR_INTERNET_SEC_CERT_REV_FAILED: + case ERROR_INTERNET_SEC_CERT_NO_REV: + case ERROR_INTERNET_SEC_CERT_REVOKED: return INET_E_INVALID_CERTIFICATE; case ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR: case ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR: @@ -119,16 +119,26 @@ static HRESULT handle_http_error(HttpProtocol *This, DWORD error) IWindowForBindingUI *wfb_ui; IHttpSecurity *http_security; BOOL security_problem; + DWORD dlg_flags; + HWND hwnd; + DWORD res; HRESULT hres; + TRACE("(%p %u)\n", This, error); + switch(error) { case ERROR_INTERNET_SEC_CERT_DATE_INVALID: case ERROR_INTERNET_SEC_CERT_CN_INVALID: case ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR: case ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR: - case ERROR_HTTP_REDIRECT_NEEDS_CONFIRMATION: case ERROR_INTERNET_INVALID_CA: case ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED: + case ERROR_INTERNET_SEC_INVALID_CERT: + case ERROR_INTERNET_SEC_CERT_ERRORS: + case ERROR_INTERNET_SEC_CERT_REV_FAILED: + case ERROR_INTERNET_SEC_CERT_NO_REV: + case ERROR_INTERNET_SEC_CERT_REVOKED: + case ERROR_HTTP_REDIRECT_NEEDS_CONFIRMATION: security_problem = TRUE; break; default: @@ -149,6 +159,8 @@ static HRESULT handle_http_error(HttpProtocol *This, DWORD error) hres = IHttpSecurity_OnSecurityProblem(http_security, error); IHttpSecurity_Release(http_security); + TRACE("OnSecurityProblem returned %08x\n", hres); + if(hres != S_FALSE) { BOOL res = FALSE; @@ -180,42 +192,43 @@ static HRESULT handle_http_error(HttpProtocol *This, DWORD error) } } - hres = IServiceProvider_QueryService(serv_prov, &IID_IWindowForBindingUI, &IID_IWindowForBindingUI, - (void**)&wfb_ui); - if(SUCCEEDED(hres)) { - HWND hwnd; - const IID *iid_reason; - - if(security_problem) - iid_reason = &IID_IHttpSecurity; - else if(error == ERROR_INTERNET_INCORRECT_PASSWORD) - iid_reason = &IID_IAuthenticate; - else - iid_reason = &IID_IWindowForBindingUI; - - hres = IWindowForBindingUI_GetWindow(wfb_ui, iid_reason, &hwnd); - if(SUCCEEDED(hres) && hwnd) - { - DWORD res; - - res = InternetErrorDlg(hwnd, This->base.request, error, - FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS | FLAGS_ERROR_UI_FLAGS_GENERATE_DATA, - NULL); - - if(res == ERROR_INTERNET_FORCE_RETRY || res == ERROR_SUCCESS) - hres = RPC_E_RETRY; - else - hres = E_FAIL; + switch(error) { + case ERROR_INTERNET_SEC_CERT_REV_FAILED: + if(hres != S_FALSE) { + /* Silently ignore the error. We will get more detailed error from wininet anyway. */ + set_security_flag(This, SECURITY_FLAG_IGNORE_REVOCATION); + hres = RPC_E_RETRY; + break; } - IWindowForBindingUI_Release(wfb_ui); + /* fallthrough */ + default: + hres = IServiceProvider_QueryService(serv_prov, &IID_IWindowForBindingUI, &IID_IWindowForBindingUI, (void**)&wfb_ui); + if(SUCCEEDED(hres)) { + const IID *iid_reason; + + if(security_problem) + iid_reason = &IID_IHttpSecurity; + else if(error == ERROR_INTERNET_INCORRECT_PASSWORD) + iid_reason = &IID_IAuthenticate; + else + iid_reason = &IID_IWindowForBindingUI; + + hres = IWindowForBindingUI_GetWindow(wfb_ui, iid_reason, &hwnd); + IWindowForBindingUI_Release(wfb_ui); + } + + if(FAILED(hres)) hwnd = NULL; + + dlg_flags = FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS | FLAGS_ERROR_UI_FLAGS_GENERATE_DATA; + if(This->base.bindf & BINDF_NO_UI) + dlg_flags |= FLAGS_ERROR_UI_FLAGS_NO_UI; + + res = InternetErrorDlg(hwnd, This->base.request, error, dlg_flags, NULL); + hres = res == ERROR_INTERNET_FORCE_RETRY || res == ERROR_SUCCESS ? RPC_E_RETRY : internet_error_to_hres(error); } IServiceProvider_Release(serv_prov); - - if(hres == RPC_E_RETRY) - return hres; - - return internet_error_to_hres(error); + return hres; } static ULONG send_http_request(HttpProtocol *This) @@ -276,7 +289,7 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, IUri *uri, DWORD reques LPOLESTR accept_mimes[257]; const WCHAR **accept_types; BYTE security_id[512]; - DWORD len, port; + DWORD len, port, flags; ULONG num, error; BOOL res, b; HRESULT hres; @@ -419,19 +432,31 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, IUri *uri, DWORD reques } } + flags = INTERNET_ERROR_MASK_COMBINED_SEC_CERT; + res = InternetSetOptionW(This->base.request, INTERNET_OPTION_ERROR_MASK, &flags, sizeof(flags)); + if(!res) + WARN("InternetSetOption(INTERNET_OPTION_ERROR_MASK) failed: %u\n", GetLastError()); + b = TRUE; res = InternetSetOptionW(This->base.request, INTERNET_OPTION_HTTP_DECODING, &b, sizeof(b)); if(!res) - WARN("InternetSetOption(INTERNET_OPTION_HTTP_DECODING) failed: %08x\n", GetLastError()); + WARN("InternetSetOption(INTERNET_OPTION_HTTP_DECODING) failed: %u\n", GetLastError()); do { error = send_http_request(This); - if(error == ERROR_IO_PENDING || error == ERROR_SUCCESS) + switch(error) { + case ERROR_IO_PENDING: return S_OK; - - hres = handle_http_error(This, error); - + case ERROR_SUCCESS: + /* + * If sending response ended synchronously, it means that we have the whole data + * available locally (most likely in cache). + */ + return protocol_syncbinding(&This->base); + default: + hres = handle_http_error(This, error); + } } while(hres == RPC_E_RETRY); WARN("HttpSendRequest failed: %d\n", error); @@ -528,10 +553,8 @@ static void HttpProtocol_close_connection(Protocol *prot) This->http_negotiate = NULL; } - if(This->full_header) { - heap_free(This->full_header); - This->full_header = NULL; - } + heap_free(This->full_header); + This->full_header = NULL; } static void HttpProtocol_on_error(Protocol *prot, DWORD error) @@ -595,7 +618,7 @@ static HRESULT WINAPI HttpProtocol_QueryInterface(IInternetProtocolEx *iface, RE } if(*ppv) { - IInternetProtocol_AddRef(iface); + IInternetProtocolEx_AddRef(iface); return S_OK; } diff --git a/dll/win32/urlmon/internet.c b/dll/win32/urlmon/internet.c index 8955524151f..63503b0010f 100644 --- a/dll/win32/urlmon/internet.c +++ b/dll/win32/urlmon/internet.c @@ -549,39 +549,34 @@ static HRESULT set_internet_feature(INTERNETFEATURELIST feature, DWORD flags, BO static BOOL get_feature_from_reg(HKEY feature_control, LPCWSTR feature_name, LPCWSTR process_name, BOOL *enabled) { - BOOL ret = FALSE; + DWORD type, value, size; HKEY feature; DWORD res; static const WCHAR wildcardW[] = {'*',0}; res = RegOpenKeyW(feature_control, feature_name, &feature); - if(res == ERROR_SUCCESS) { - DWORD type, value, size; + if(res != ERROR_SUCCESS) + return FALSE; + size = sizeof(DWORD); + res = RegQueryValueExW(feature, process_name, NULL, &type, (BYTE*)&value, &size); + if(res != ERROR_SUCCESS || type != REG_DWORD) { size = sizeof(DWORD); - res = RegQueryValueExW(feature, process_name, NULL, &type, (BYTE*)&value, &size); - if(type != REG_DWORD) - WARN("Unexpected registry value type %d (expected REG_DWORD) for %s\n", type, debugstr_w(process_name)); - - if(res == ERROR_SUCCESS && type == REG_DWORD) { - *enabled = value == 1; - ret = TRUE; - } else { - size = sizeof(DWORD); - res = RegQueryValueExW(feature, wildcardW, NULL, &type, (BYTE*)&value, &size); - if(type != REG_DWORD) - WARN("Unexpected registry value type %d (expected REG_DWORD) for %s\n", type, debugstr_w(wildcardW)); - - if(res == ERROR_SUCCESS && type == REG_DWORD) { - *enabled = value == 1; - ret = TRUE; - } - } - RegCloseKey(feature); + res = RegQueryValueExW(feature, wildcardW, NULL, &type, (BYTE*)&value, &size); } - return ret; + RegCloseKey(feature); + if(res != ERROR_SUCCESS) + return FALSE; + + if(type != REG_DWORD) { + WARN("Unexpected registry value type %d (expected REG_DWORD) for %s\n", type, debugstr_w(wildcardW)); + return FALSE; + } + + *enabled = value == 1; + return TRUE; } /* Assumes 'process_features_cs' is held. */ @@ -698,3 +693,102 @@ HRESULT WINAPI CoInternetIsFeatureEnabled(INTERNETFEATURELIST FeatureEntry, DWOR TRACE("(%d, %08x)\n", FeatureEntry, dwFlags); return get_internet_feature(FeatureEntry, dwFlags); } + +/*********************************************************************** + * CoInternetIsFeatureEnabledForUrl (URLMON.@) + */ +HRESULT WINAPI CoInternetIsFeatureEnabledForUrl(INTERNETFEATURELIST FeatureEntry, DWORD dwFlags, LPCWSTR szURL, + IInternetSecurityManager *pSecMgr) +{ + DWORD urlaction = 0; + HRESULT hres; + + TRACE("(%d %08x %s %p)\n", FeatureEntry, dwFlags, debugstr_w(szURL), pSecMgr); + + if(FeatureEntry == FEATURE_MIME_SNIFFING) + urlaction = URLACTION_FEATURE_MIME_SNIFFING; + else if(FeatureEntry == FEATURE_WINDOW_RESTRICTIONS) + urlaction = URLACTION_FEATURE_WINDOW_RESTRICTIONS; + else if(FeatureEntry == FEATURE_ZONE_ELEVATION) + urlaction = URLACTION_FEATURE_ZONE_ELEVATION; + + if(!szURL || !urlaction || !pSecMgr) + return CoInternetIsFeatureEnabled(FeatureEntry, dwFlags); + + switch(dwFlags) { + case GET_FEATURE_FROM_THREAD: + case GET_FEATURE_FROM_THREAD_LOCALMACHINE: + case GET_FEATURE_FROM_THREAD_INTRANET: + case GET_FEATURE_FROM_THREAD_TRUSTED: + case GET_FEATURE_FROM_THREAD_INTERNET: + case GET_FEATURE_FROM_THREAD_RESTRICTED: + FIXME("unsupported flags %x\n", dwFlags); + return E_NOTIMPL; + + case GET_FEATURE_FROM_PROCESS: + hres = CoInternetIsFeatureEnabled(FeatureEntry, dwFlags); + if(hres != S_OK) + return hres; + /* fall through */ + + default: { + DWORD policy = URLPOLICY_DISALLOW; + + hres = IInternetSecurityManager_ProcessUrlAction(pSecMgr, szURL, urlaction, + (BYTE*)&policy, sizeof(DWORD), NULL, 0, PUAF_NOUI, 0); + if(hres!=S_OK || policy!=URLPOLICY_ALLOW) + return S_OK; + return S_FALSE; + } + } +} + +/*********************************************************************** + * CoInternetIsFeatureZoneElevationEnabled (URLMON.@) + */ +HRESULT WINAPI CoInternetIsFeatureZoneElevationEnabled(LPCWSTR szFromURL, LPCWSTR szToURL, + IInternetSecurityManager *pSecMgr, DWORD dwFlags) +{ + HRESULT hres; + + TRACE("(%s %s %p %x)\n", debugstr_w(szFromURL), debugstr_w(szToURL), pSecMgr, dwFlags); + + if(!pSecMgr || !szToURL) + return CoInternetIsFeatureEnabled(FEATURE_ZONE_ELEVATION, dwFlags); + + switch(dwFlags) { + case GET_FEATURE_FROM_THREAD: + case GET_FEATURE_FROM_THREAD_LOCALMACHINE: + case GET_FEATURE_FROM_THREAD_INTRANET: + case GET_FEATURE_FROM_THREAD_TRUSTED: + case GET_FEATURE_FROM_THREAD_INTERNET: + case GET_FEATURE_FROM_THREAD_RESTRICTED: + FIXME("unsupported flags %x\n", dwFlags); + return E_NOTIMPL; + + case GET_FEATURE_FROM_PROCESS: + hres = CoInternetIsFeatureEnabled(FEATURE_ZONE_ELEVATION, dwFlags); + if(hres != S_OK) + return hres; + /* fall through */ + + default: { + DWORD policy = URLPOLICY_DISALLOW; + + hres = IInternetSecurityManager_ProcessUrlAction(pSecMgr, szToURL, + URLACTION_FEATURE_ZONE_ELEVATION, (BYTE*)&policy, sizeof(DWORD), + NULL, 0, PUAF_NOUI, 0); + if(FAILED(hres)) + return S_OK; + + switch(policy) { + case URLPOLICY_ALLOW: + return S_FALSE; + case URLPOLICY_QUERY: + FIXME("Ask user dialog not implemented\n"); + default: + return S_OK; + } + } + } +} diff --git a/dll/win32/urlmon/mk.c b/dll/win32/urlmon/mk.c index 82f0604b601..28dfebfcb98 100644 --- a/dll/win32/urlmon/mk.c +++ b/dll/win32/urlmon/mk.c @@ -57,7 +57,7 @@ static HRESULT WINAPI MkProtocol_QueryInterface(IInternetProtocolEx *iface, REFI } if(*ppv) { - IInternetProtocol_AddRef(iface); + IInternetProtocolEx_AddRef(iface); return S_OK; } diff --git a/dll/win32/urlmon/protocol.c b/dll/win32/urlmon/protocol.c index 9108f24e1c3..be88614cd3c 100644 --- a/dll/win32/urlmon/protocol.c +++ b/dll/win32/urlmon/protocol.c @@ -70,6 +70,55 @@ static void all_data_read(Protocol *protocol) report_result(protocol, S_OK); } +static HRESULT start_downloading(Protocol *protocol) +{ + HRESULT hres; + + hres = protocol->vtbl->start_downloading(protocol); + if(FAILED(hres)) { + protocol_close_connection(protocol); + report_result(protocol, hres); + return S_OK; + } + + if(protocol->bindf & BINDF_NEEDFILE) { + WCHAR cache_file[MAX_PATH]; + DWORD buflen = sizeof(cache_file); + + if(InternetQueryOptionW(protocol->request, INTERNET_OPTION_DATAFILE_NAME, cache_file, &buflen)) { + report_progress(protocol, BINDSTATUS_CACHEFILENAMEAVAILABLE, cache_file); + }else { + FIXME("Could not get cache file\n"); + } + } + + protocol->flags |= FLAG_FIRST_CONTINUE_COMPLETE; + return S_OK; +} + +HRESULT protocol_syncbinding(Protocol *protocol) +{ + BOOL res; + HRESULT hres; + + protocol->flags |= FLAG_SYNC_READ; + + hres = start_downloading(protocol); + if(FAILED(hres)) + return hres; + + res = InternetQueryDataAvailable(protocol->request, &protocol->query_available, 0, 0); + if(res) + protocol->available_bytes = protocol->query_available; + else + WARN("InternetQueryDataAvailable failed: %u\n", GetLastError()); + + protocol->flags |= FLAG_FIRST_DATA_REPORTED|FLAG_LAST_DATA_REPORTED; + IInternetProtocolSink_ReportData(protocol->protocol_sink, BSCF_LASTDATANOTIFICATION|BSCF_DATAFULLYAVAILABLE, + protocol->available_bytes, protocol->content_length); + return S_OK; +} + static void request_complete(Protocol *protocol, INTERNET_ASYNC_RESULT *ar) { PROTOCOLDATA data; @@ -89,13 +138,13 @@ static void request_complete(Protocol *protocol, INTERNET_ASYNC_RESULT *ar) } if(protocol->flags & FLAG_FIRST_CONTINUE_COMPLETE) - data.pData = (LPVOID)BINDSTATUS_ENDDOWNLOADCOMPONENTS; + data.pData = UlongToPtr(BINDSTATUS_ENDDOWNLOADCOMPONENTS); else - data.pData = (LPVOID)BINDSTATUS_DOWNLOADINGDATA; + data.pData = UlongToPtr(BINDSTATUS_DOWNLOADINGDATA); }else { protocol->flags |= FLAG_ERROR; - data.pData = (LPVOID)ar->dwError; + data.pData = UlongToPtr(ar->dwError); } if (protocol->bindf & BINDF_FROMURLMON) @@ -115,10 +164,19 @@ static void WINAPI internet_status_callback(HINTERNET internet, DWORD_PTR contex report_progress(protocol, BINDSTATUS_FINDINGRESOURCE, (LPWSTR)status_info); break; - case INTERNET_STATUS_CONNECTING_TO_SERVER: - TRACE("%p INTERNET_STATUS_CONNECTING_TO_SERVER\n", protocol); - report_progress(protocol, BINDSTATUS_CONNECTING, (LPWSTR)status_info); + case INTERNET_STATUS_CONNECTING_TO_SERVER: { + WCHAR *info; + + TRACE("%p INTERNET_STATUS_CONNECTING_TO_SERVER %s\n", protocol, (const char*)status_info); + + info = heap_strdupAtoW(status_info); + if(!info) + return; + + report_progress(protocol, BINDSTATUS_CONNECTING, info); + heap_free(info); break; + } case INTERNET_STATUS_SENDING_REQUEST: TRACE("%p INTERNET_STATUS_SENDING_REQUEST\n", protocol); @@ -286,12 +344,10 @@ HRESULT protocol_start(Protocol *protocol, IInternetProtocol *prot, IUri *uri, HRESULT protocol_continue(Protocol *protocol, PROTOCOLDATA *data) { + BOOL is_start; HRESULT hres; - if (!data) { - WARN("Expected pProtocolData to be non-NULL\n"); - return S_OK; - } + is_start = !data || data->pData == UlongToPtr(BINDSTATUS_DOWNLOADINGDATA); if(!protocol->request) { WARN("Expected request to be non-NULL\n"); @@ -305,52 +361,56 @@ HRESULT protocol_continue(Protocol *protocol, PROTOCOLDATA *data) if(protocol->flags & FLAG_ERROR) { protocol->flags &= ~FLAG_ERROR; - protocol->vtbl->on_error(protocol, (DWORD)data->pData); + protocol->vtbl->on_error(protocol, PtrToUlong(data->pData)); return S_OK; } if(protocol->post_stream) return write_post_stream(protocol); - if(data->pData == (LPVOID)BINDSTATUS_DOWNLOADINGDATA) { - hres = protocol->vtbl->start_downloading(protocol); - if(FAILED(hres)) { - protocol_close_connection(protocol); - report_result(protocol, hres); + if(is_start) { + hres = start_downloading(protocol); + if(FAILED(hres)) return S_OK; - } - - if(protocol->bindf & BINDF_NEEDFILE) { - WCHAR cache_file[MAX_PATH]; - DWORD buflen = sizeof(cache_file); - - if(InternetQueryOptionW(protocol->request, INTERNET_OPTION_DATAFILE_NAME, - cache_file, &buflen)) { - report_progress(protocol, BINDSTATUS_CACHEFILENAMEAVAILABLE, cache_file); - }else { - FIXME("Could not get cache file\n"); - } - } - - protocol->flags |= FLAG_FIRST_CONTINUE_COMPLETE; } - if(data->pData >= (LPVOID)BINDSTATUS_DOWNLOADINGDATA && !protocol->available_bytes) { - BOOL res; + if(!data || data->pData >= UlongToPtr(BINDSTATUS_DOWNLOADINGDATA)) { + if(!protocol->available_bytes) { + if(protocol->query_available) { + protocol->available_bytes = protocol->query_available; + }else { + BOOL res; + + /* InternetQueryDataAvailable may immediately fork and perform its asynchronous + * read, so clear the flag _before_ calling so it does not incorrectly get cleared + * after the status callback is called */ + protocol->flags &= ~FLAG_REQUEST_COMPLETE; + res = InternetQueryDataAvailable(protocol->request, &protocol->query_available, 0, 0); + if(res) { + TRACE("available %u bytes\n", protocol->query_available); + if(!protocol->query_available) { + if(is_start) { + TRACE("empty file\n"); + all_data_read(protocol); + }else { + WARN("unexpected end of file?\n"); + report_result(protocol, INET_E_DOWNLOAD_FAILURE); + } + return S_OK; + } + protocol->available_bytes = protocol->query_available; + }else if(GetLastError() != ERROR_IO_PENDING) { + protocol->flags |= FLAG_REQUEST_COMPLETE; + WARN("InternetQueryDataAvailable failed: %d\n", GetLastError()); + report_result(protocol, INET_E_DATA_NOT_AVAILABLE); + return S_OK; + } + } - /* InternetQueryDataAvailable may immediately fork and perform its asynchronous - * read, so clear the flag _before_ calling so it does not incorrectly get cleared - * after the status callback is called */ - protocol->flags &= ~FLAG_REQUEST_COMPLETE; - res = InternetQueryDataAvailable(protocol->request, &protocol->available_bytes, 0, 0); - if(res) { protocol->flags |= FLAG_REQUEST_COMPLETE; - report_data(protocol); - }else if(GetLastError() != ERROR_IO_PENDING) { - protocol->flags |= FLAG_REQUEST_COMPLETE; - WARN("InternetQueryDataAvailable failed: %d\n", GetLastError()); - report_result(protocol, INET_E_DATA_NOT_AVAILABLE); } + + report_data(protocol); } return S_OK; @@ -367,7 +427,7 @@ HRESULT protocol_read(Protocol *protocol, void *buf, ULONG size, ULONG *read_ret return S_FALSE; } - if(!(protocol->flags & FLAG_REQUEST_COMPLETE) || !protocol->available_bytes) { + if(!(protocol->flags & FLAG_SYNC_READ) && (!(protocol->flags & FLAG_REQUEST_COMPLETE) || !protocol->available_bytes)) { *read_ret = 0; return E_PENDING; } @@ -393,12 +453,14 @@ HRESULT protocol_read(Protocol *protocol, void *buf, ULONG size, ULONG *read_ret protocol->current_position += len; protocol->available_bytes -= len; + TRACE("current_position %d, available_bytes %d\n", protocol->current_position, protocol->available_bytes); + if(!protocol->available_bytes) { /* InternetQueryDataAvailable may immediately fork and perform its asynchronous * read, so clear the flag _before_ calling so it does not incorrectly get cleared * after the status callback is called */ protocol->flags &= ~FLAG_REQUEST_COMPLETE; - res = InternetQueryDataAvailable(protocol->request, &protocol->available_bytes, 0, 0); + res = InternetQueryDataAvailable(protocol->request, &protocol->query_available, 0, 0); if(!res) { if (GetLastError() == ERROR_IO_PENDING) { hres = E_PENDING; @@ -410,10 +472,12 @@ HRESULT protocol_read(Protocol *protocol, void *buf, ULONG size, ULONG *read_ret break; } - if(!protocol->available_bytes) { + if(!protocol->query_available) { all_data_read(protocol); break; } + + protocol->available_bytes = protocol->query_available; } } diff --git a/dll/win32/urlmon/protproxy.c b/dll/win32/urlmon/protproxy.c deleted file mode 100644 index 30df7cef060..00000000000 --- a/dll/win32/urlmon/protproxy.c +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Copyright 2009 Jacek Caban for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "urlmon_main.h" -#include - -WINE_DEFAULT_DEBUG_CHANNEL(urlmon); - -static inline ProtocolProxy *impl_from_IInternetProtocol(IInternetProtocol *iface) -{ - return CONTAINING_RECORD(iface, ProtocolProxy, IInternetProtocol_iface); -} - -static HRESULT WINAPI ProtocolProxy_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - *ppv = NULL; - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IInternetProtocol_iface; - }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { - TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); - *ppv = &This->IInternetProtocol_iface; - }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { - TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); - *ppv = &This->IInternetProtocol_iface; - }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) { - TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv); - *ppv = &This->IInternetProtocolSink_iface; - } - - if(*ppv) { - IInternetProtocol_AddRef(iface); - return S_OK; - } - - WARN("not supported interface %s\n", debugstr_guid(riid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI ProtocolProxy_AddRef(IInternetProtocol *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - LONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p) ref=%d\n", This, ref); - return ref; -} - -static ULONG WINAPI ProtocolProxy_Release(IInternetProtocol *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%d\n", This, ref); - - if(!ref) { - if(This->protocol_sink) - IInternetProtocolSink_Release(This->protocol_sink); - if(This->protocol) - IInternetProtocol_Release(This->protocol); - - heap_free(This); - - URLMON_UnlockModule(); - } - - return ref; -} - -static HRESULT WINAPI ProtocolProxy_Start(IInternetProtocol *iface, LPCWSTR szUrl, - IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, - DWORD grfPI, HANDLE_PTR dwReserved) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink, - pOIBindInfo, grfPI, dwReserved); - - return IInternetProtocol_Start(This->protocol, szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved); -} - -static HRESULT WINAPI ProtocolProxy_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - TRACE("(%p)->(%p)\n", This, pProtocolData); - - return IInternetProtocol_Continue(This->protocol, pProtocolData); -} - -static HRESULT WINAPI ProtocolProxy_Abort(IInternetProtocol *iface, HRESULT hrReason, - DWORD dwOptions) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions); - return E_NOTIMPL; -} - -static HRESULT WINAPI ProtocolProxy_Terminate(IInternetProtocol *iface, DWORD dwOptions) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - TRACE("(%p)->(%08x)\n", This, dwOptions); - - return IInternetProtocol_Terminate(This->protocol, dwOptions); -} - -static HRESULT WINAPI ProtocolProxy_Suspend(IInternetProtocol *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; -} - -static HRESULT WINAPI ProtocolProxy_Resume(IInternetProtocol *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; -} - -static HRESULT WINAPI ProtocolProxy_Read(IInternetProtocol *iface, void *pv, - ULONG cb, ULONG *pcbRead) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead); - - return IInternetProtocol_Read(This->protocol, pv, cb, pcbRead); -} - -static HRESULT WINAPI ProtocolProxy_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, - DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition); - return E_NOTIMPL; -} - -static HRESULT WINAPI ProtocolProxy_LockRequest(IInternetProtocol *iface, DWORD dwOptions) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - TRACE("(%p)->(%08x)\n", This, dwOptions); - - return IInternetProtocol_LockRequest(This->protocol, dwOptions); -} - -static HRESULT WINAPI ProtocolProxy_UnlockRequest(IInternetProtocol *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - TRACE("(%p)\n", This); - - return IInternetProtocol_UnlockRequest(This->protocol); -} - -static const IInternetProtocolVtbl ProtocolProxyVtbl = { - ProtocolProxy_QueryInterface, - ProtocolProxy_AddRef, - ProtocolProxy_Release, - ProtocolProxy_Start, - ProtocolProxy_Continue, - ProtocolProxy_Abort, - ProtocolProxy_Terminate, - ProtocolProxy_Suspend, - ProtocolProxy_Resume, - ProtocolProxy_Read, - ProtocolProxy_Seek, - ProtocolProxy_LockRequest, - ProtocolProxy_UnlockRequest -}; - -static inline ProtocolProxy *impl_from_IInternetProtocolSink(IInternetProtocolSink *iface) -{ - return CONTAINING_RECORD(iface, ProtocolProxy, IInternetProtocolSink_iface); -} - -static HRESULT WINAPI ProtocolProxySink_QueryInterface(IInternetProtocolSink *iface, - REFIID riid, void **ppv) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - return IInternetProtocol_QueryInterface(&This->IInternetProtocol_iface, riid, ppv); -} - -static ULONG WINAPI ProtocolProxySink_AddRef(IInternetProtocolSink *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - return IInternetProtocol_AddRef(&This->IInternetProtocol_iface); -} - -static ULONG WINAPI ProtocolProxySink_Release(IInternetProtocolSink *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - return IInternetProtocol_Release(&This->IInternetProtocol_iface); -} - -static HRESULT WINAPI ProtocolProxySink_Switch(IInternetProtocolSink *iface, - PROTOCOLDATA *pProtocolData) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - - TRACE("(%p)->(%p)\n", This, pProtocolData); - - return IInternetProtocolSink_Switch(This->protocol_sink, pProtocolData); -} - -static HRESULT WINAPI ProtocolProxySink_ReportProgress(IInternetProtocolSink *iface, - ULONG ulStatusCode, LPCWSTR szStatusText) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - - TRACE("(%p)->(%u %s)\n", This, ulStatusCode, debugstr_w(szStatusText)); - - switch(ulStatusCode) { - case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE: - IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_MIMETYPEAVAILABLE, szStatusText); - break; - default: - IInternetProtocolSink_ReportProgress(This->protocol_sink, ulStatusCode, szStatusText); - } - - return S_OK; -} - -static HRESULT WINAPI ProtocolProxySink_ReportData(IInternetProtocolSink *iface, - DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - - TRACE("(%p)->(%d %u %u)\n", This, grfBSCF, ulProgress, ulProgressMax); - - return IInternetProtocolSink_ReportData(This->protocol_sink, grfBSCF, ulProgress, ulProgressMax); -} - -static HRESULT WINAPI ProtocolProxySink_ReportResult(IInternetProtocolSink *iface, - HRESULT hrResult, DWORD dwError, LPCWSTR szResult) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - - TRACE("(%p)->(%08x %d %s)\n", This, hrResult, dwError, debugstr_w(szResult)); - - return IInternetProtocolSink_ReportResult(This->protocol_sink, hrResult, dwError, szResult); -} - -static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl = { - ProtocolProxySink_QueryInterface, - ProtocolProxySink_AddRef, - ProtocolProxySink_Release, - ProtocolProxySink_Switch, - ProtocolProxySink_ReportProgress, - ProtocolProxySink_ReportData, - ProtocolProxySink_ReportResult -}; - -HRESULT create_protocol_proxy(IInternetProtocol *protocol, IInternetProtocolSink *protocol_sink, ProtocolProxy **ret) -{ - ProtocolProxy *sink; - - sink = heap_alloc(sizeof(ProtocolProxy)); - if(!sink) - return E_OUTOFMEMORY; - - sink->IInternetProtocol_iface.lpVtbl = &ProtocolProxyVtbl; - sink->IInternetProtocolSink_iface.lpVtbl = &InternetProtocolSinkVtbl; - sink->ref = 1; - - IInternetProtocol_AddRef(protocol); - sink->protocol = protocol; - - IInternetProtocolSink_AddRef(protocol_sink); - sink->protocol_sink = protocol_sink; - - *ret = sink; - return S_OK; -} diff --git a/dll/win32/urlmon/resource.h b/dll/win32/urlmon/resource.h new file mode 100644 index 00000000000..3ff2ac690a5 --- /dev/null +++ b/dll/win32/urlmon/resource.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define ID_AXINSTALL_WARNING_DLG 1000 +#define ID_AXINSTALL_LOCATION 1001 +#define ID_AXINSTALL_INSTALL_BTN 1002 +#define ID_AXINSTALL_ICON 1003 + +#define IDS_AXINSTALL_FAILURE 1100 +#define IDS_AXINSTALL_INSTALLN 1101 +#define IDS_AXINSTALL_INSTALL 1102 diff --git a/dll/win32/urlmon/sec_mgr.c b/dll/win32/urlmon/sec_mgr.c index b5901c175bf..9bccc0a3437 100644 --- a/dll/win32/urlmon/sec_mgr.c +++ b/dll/win32/urlmon/sec_mgr.c @@ -57,6 +57,20 @@ static const WCHAR wszZoneMapDomainsKey[] = {'S','o','f','t','w','a','r','e','\\ 'Z','o','n','e','M','a','p','\\', 'D','o','m','a','i','n','s',0}; +static inline BOOL is_drive_path(const WCHAR *path) +{ + return isalphaW(*path) && *(path+1) == ':'; +} + +/* List of schemes types Windows seems to expect to be hierarchical. */ +static inline BOOL is_hierarchical_scheme(URL_SCHEME type) { + return(type == URL_SCHEME_HTTP || type == URL_SCHEME_FTP || + type == URL_SCHEME_GOPHER || type == URL_SCHEME_NNTP || + type == URL_SCHEME_TELNET || type == URL_SCHEME_WAIS || + type == URL_SCHEME_FILE || type == URL_SCHEME_HTTPS || + type == URL_SCHEME_RES); +} + /******************************************************************** * get_string_from_reg [internal] * @@ -256,18 +270,24 @@ static BOOL get_zone_for_scheme(HKEY key, LPCWSTR schema, DWORD *zone) /* See if the key contains a value for the scheme first. */ res = RegQueryValueExW(key, schema, NULL, &type, (BYTE*)zone, &size); - if(type != REG_DWORD) + if(res == ERROR_SUCCESS) { + if(type == REG_DWORD) + return TRUE; WARN("Unexpected value type %d for value %s, expected REG_DWORD\n", type, debugstr_w(schema)); - - if(res != ERROR_SUCCESS || type != REG_DWORD) { - /* Try to get the zone for the wildcard scheme. */ - size = sizeof(DWORD); - res = RegQueryValueExW(key, wildcardW, NULL, &type, (BYTE*)zone, &size); - if(type != REG_DWORD) - WARN("Unexpected value type %d for value %s, expected REG_DWORD\n", type, debugstr_w(wildcardW)); } - return res == ERROR_SUCCESS && type == REG_DWORD; + /* Try to get the zone for the wildcard scheme. */ + size = sizeof(DWORD); + res = RegQueryValueExW(key, wildcardW, NULL, &type, (BYTE*)zone, &size); + if(res != ERROR_SUCCESS) + return FALSE; + + if(type != REG_DWORD) { + WARN("Unexpected value type %d for value %s, expected REG_DWORD\n", type, debugstr_w(wildcardW)); + return FALSE; + } + + return TRUE; } /******************************************************************** @@ -433,50 +453,51 @@ static HRESULT search_for_domain_mapping(HKEY domains, LPCWSTR schema, LPCWSTR h return hres; } -static HRESULT get_zone_from_domains(LPCWSTR url, LPCWSTR schema, DWORD *zone) +static HRESULT get_zone_from_domains(IUri *uri, DWORD *zone) { HRESULT hres; - WCHAR *host_name; - DWORD host_len = lstrlenW(url)+1; + BSTR host, scheme; DWORD res; HKEY domains; + DWORD scheme_type; - host_name = heap_alloc(host_len*sizeof(WCHAR)); - if(!host_name) - return E_OUTOFMEMORY; - - hres = CoInternetParseUrl(url, PARSE_DOMAIN, 0, host_name, host_len, &host_len, 0); - if(hres == S_FALSE) { - WCHAR *tmp = heap_realloc(host_name, (host_len+1)*sizeof(WCHAR)); - if(!tmp) { - heap_free(host_name); - return E_OUTOFMEMORY; - } - - host_name = tmp; - hres = CoInternetParseUrl(url, PARSE_DOMAIN, 0, host_name, host_len+1, &host_len, 0); - } + hres = IUri_GetScheme(uri, &scheme_type); + if(FAILED(hres)) + return hres; /* Windows doesn't play nice with unknown scheme types when it tries * to check if a host name maps into any domains. - * - * The reason is with how CoInternetParseUrl handles unknown scheme types - * when it's parsing the domain of a URL (IE it always returns E_FAIL). - * - * Windows doesn't compenstate for this and simply doesn't check if - * the URL maps into any domains. */ - if(hres != S_OK) { - heap_free(host_name); - if(hres == E_FAIL) - return S_FALSE; + if(scheme_type == URL_SCHEME_UNKNOWN) + return S_FALSE; + + hres = IUri_GetHost(uri, &host); + if(FAILED(hres)) + return hres; + + /* Known hierarchical scheme types must have a host. If they don't Windows + * assigns URLZONE_INVALID to the zone. + */ + if((scheme_type != URL_SCHEME_UNKNOWN && scheme_type != URL_SCHEME_FILE) + && is_hierarchical_scheme(scheme_type) && !*host) { + *zone = URLZONE_INVALID; + + SysFreeString(host); + + /* The MapUrlToZone functions return S_OK when this condition occurs. */ + return S_OK; + } + + hres = IUri_GetSchemeName(uri, &scheme); + if(FAILED(hres)) { + SysFreeString(host); return hres; } /* First try CURRENT_USER. */ res = RegOpenKeyW(HKEY_CURRENT_USER, wszZoneMapDomainsKey, &domains); if(res == ERROR_SUCCESS) { - hres = search_for_domain_mapping(domains, schema, host_name, host_len, zone); + hres = search_for_domain_mapping(domains, scheme, host, SysStringLen(host), zone); RegCloseKey(domains); } else WARN("Failed to open HKCU's %s key\n", debugstr_w(wszZoneMapDomainsKey)); @@ -485,55 +506,48 @@ static HRESULT get_zone_from_domains(LPCWSTR url, LPCWSTR schema, DWORD *zone) if(hres == S_FALSE) { res = RegOpenKeyW(HKEY_LOCAL_MACHINE, wszZoneMapDomainsKey, &domains); if(res == ERROR_SUCCESS) { - hres = search_for_domain_mapping(domains, schema, host_name, host_len, zone); + hres = search_for_domain_mapping(domains, scheme, host, SysStringLen(host), zone); RegCloseKey(domains); } else WARN("Failed to open HKLM's %s key\n", debugstr_w(wszZoneMapDomainsKey)); } - heap_free(host_name); + SysFreeString(host); + SysFreeString(scheme); return hres; } -static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone, LPWSTR *ret_url) +static HRESULT map_security_uri_to_zone(IUri *uri, DWORD *zone) { - LPWSTR secur_url; - WCHAR schema[64]; - DWORD size=0; HRESULT hres; + BSTR scheme; *zone = URLZONE_INVALID; - hres = CoInternetGetSecurityUrl(url, &secur_url, PSU_SECURITY_URL_ONLY, 0); - if(hres != S_OK) { - size = strlenW(url)*sizeof(WCHAR); + hres = IUri_GetSchemeName(uri, &scheme); + if(FAILED(hres)) + return hres; - secur_url = heap_alloc(size); - if(!secur_url) - return E_OUTOFMEMORY; + if(!strcmpiW(scheme, fileW)) { + BSTR path; + WCHAR *ptr, *path_start, root[20]; - memcpy(secur_url, url, size); - } + hres = IUri_GetPath(uri, &path); + if(FAILED(hres)) { + SysFreeString(scheme); + return hres; + } - hres = CoInternetParseUrl(secur_url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(WCHAR), &size, 0); - if(FAILED(hres) || !*schema) { - heap_free(secur_url); - return E_INVALIDARG; - } + if(*path == '/' && is_drive_path(path+1)) + path_start = path+1; + else + path_start = path; - /* file protocol is a special case */ - if(!strcmpW(schema, fileW)) { - WCHAR path[MAX_PATH], root[20]; - WCHAR *ptr; - - hres = CoInternetParseUrl(secur_url, PARSE_PATH_FROM_URL, 0, path, - sizeof(path)/sizeof(WCHAR), &size, 0); - - if(SUCCEEDED(hres) && (ptr = strchrW(path, '\\')) && ptr-path < sizeof(root)/sizeof(WCHAR)) { + if((ptr = strchrW(path_start, ':')) && ptr-path_start+1 < sizeof(root)/sizeof(WCHAR)) { UINT type; - memcpy(root, path, (ptr-path)*sizeof(WCHAR)); - root[ptr-path] = 0; + memcpy(root, path_start, (ptr-path_start+1)*sizeof(WCHAR)); + root[ptr-path_start+1] = 0; type = GetDriveTypeW(root); @@ -556,22 +570,73 @@ static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone, LPWSTR *ret_url) FIXME("unsupported drive type %d\n", type); } } + SysFreeString(path); } if(*zone == URLZONE_INVALID) { - hres = get_zone_from_domains(secur_url, schema, zone); + hres = get_zone_from_domains(uri, zone); if(hres == S_FALSE) - hres = get_zone_from_reg(schema, zone); + hres = get_zone_from_reg(scheme, zone); } + SysFreeString(scheme); + return hres; +} + +static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone, LPWSTR *ret_url) +{ + IUri *secur_uri; + LPWSTR secur_url; + HRESULT hres; + + *zone = URLZONE_INVALID; + + hres = CoInternetGetSecurityUrl(url, &secur_url, PSU_SECURITY_URL_ONLY, 0); + if(hres != S_OK) { + DWORD size = strlenW(url)*sizeof(WCHAR); + + secur_url = CoTaskMemAlloc(size); + if(!secur_url) + return E_OUTOFMEMORY; + + memcpy(secur_url, url, size); + } + + hres = CreateUri(secur_url, Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, 0, &secur_uri); + if(FAILED(hres)) { + CoTaskMemFree(secur_url); + return hres; + } + + hres = map_security_uri_to_zone(secur_uri, zone); + IUri_Release(secur_uri); + if(FAILED(hres) || !ret_url) - heap_free(secur_url); + CoTaskMemFree(secur_url); else *ret_url = secur_url; return hres; } +static HRESULT map_uri_to_zone(IUri *uri, DWORD *zone, IUri **ret_uri) +{ + HRESULT hres; + IUri *secur_uri; + + hres = CoInternetGetSecurityUrlEx(uri, &secur_uri, PSU_SECURITY_URL_ONLY, 0); + if(FAILED(hres)) + return hres; + + hres = map_security_uri_to_zone(secur_uri, zone); + if(FAILED(hres) || !ret_uri) + IUri_Release(secur_uri); + else + *ret_uri = secur_uri; + + return hres; +} + static HRESULT open_zone_key(HKEY parent_key, DWORD zone, HKEY *hkey) { static const WCHAR wszFormat[] = {'%','s','%','u',0}; @@ -646,12 +711,133 @@ static HRESULT get_action_policy(DWORD zone, DWORD action, BYTE *policy, DWORD s return hres; } +static HRESULT generate_security_id(IUri *uri, BYTE *secid, DWORD *secid_len, DWORD zone) +{ + DWORD len; + HRESULT hres; + DWORD scheme_type; + + if(zone == URLZONE_INVALID) + return E_INVALIDARG; + + hres = IUri_GetScheme(uri, &scheme_type); + if(FAILED(hres)) + return hres; + + /* Windows handles opaque URLs differently then hierarchical ones. */ + if(!is_hierarchical_scheme(scheme_type) && scheme_type != URL_SCHEME_WILDCARD) { + BSTR display_uri; + + hres = IUri_GetDisplayUri(uri, &display_uri); + if(FAILED(hres)) + return hres; + + len = WideCharToMultiByte(CP_ACP, 0, display_uri, -1, NULL, 0, NULL, NULL)-1; + + if(len+sizeof(DWORD) > *secid_len) { + SysFreeString(display_uri); + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + WideCharToMultiByte(CP_ACP, 0, display_uri, -1, (LPSTR)secid, len, NULL, NULL); + SysFreeString(display_uri); + + *(DWORD*)(secid+len) = zone; + } else { + BSTR host, scheme; + DWORD host_len, scheme_len; + BYTE *ptr; + + hres = IUri_GetHost(uri, &host); + if(FAILED(hres)) + return hres; + + /* The host can't be empty for Wildcard URIs. */ + if(scheme_type == URL_SCHEME_WILDCARD && !*host) { + SysFreeString(host); + return E_INVALIDARG; + } + + hres = IUri_GetSchemeName(uri, &scheme); + if(FAILED(hres)) { + SysFreeString(host); + return hres; + } + + host_len = WideCharToMultiByte(CP_ACP, 0, host, -1, NULL, 0, NULL, NULL)-1; + scheme_len = WideCharToMultiByte(CP_ACP, 0, scheme, -1, NULL, 0, NULL, NULL)-1; + + len = host_len+scheme_len+sizeof(BYTE); + + if(len+sizeof(DWORD) > *secid_len) { + SysFreeString(host); + SysFreeString(scheme); + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + WideCharToMultiByte(CP_ACP, 0, scheme, -1, (LPSTR)secid, len, NULL, NULL); + SysFreeString(scheme); + + ptr = secid+scheme_len; + *ptr++ = ':'; + + WideCharToMultiByte(CP_ACP, 0, host, -1, (LPSTR)ptr, host_len, NULL, NULL); + SysFreeString(host); + + ptr += host_len; + + *(DWORD*)ptr = zone; + } + + *secid_len = len+sizeof(DWORD); + + return S_OK; +} + +static HRESULT get_security_id_for_url(LPCWSTR url, BYTE *secid, DWORD *secid_len) +{ + HRESULT hres; + DWORD zone = URLZONE_INVALID; + LPWSTR secur_url = NULL; + IUri *uri; + + hres = map_url_to_zone(url, &zone, &secur_url); + if(FAILED(hres)) + return hres == 0x80041001 ? E_INVALIDARG : hres; + + hres = CreateUri(secur_url, Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, 0, &uri); + CoTaskMemFree(secur_url); + if(FAILED(hres)) + return hres; + + hres = generate_security_id(uri, secid, secid_len, zone); + IUri_Release(uri); + + return hres; +} + +static HRESULT get_security_id_for_uri(IUri *uri, BYTE *secid, DWORD *secid_len) +{ + HRESULT hres; + IUri *secur_uri; + DWORD zone = URLZONE_INVALID; + + hres = map_uri_to_zone(uri, &zone, &secur_uri); + if(FAILED(hres)) + return hres; + + hres = generate_security_id(secur_uri, secid, secid_len, zone); + IUri_Release(secur_uri); + + return hres; +} + /*********************************************************************** * InternetSecurityManager implementation * */ typedef struct { - IInternetSecurityManager IInternetSecurityManager_iface; + IInternetSecurityManagerEx2 IInternetSecurityManagerEx2_iface; LONG ref; @@ -659,44 +845,38 @@ typedef struct { IInternetSecurityManager *custom_manager; } SecManagerImpl; -static inline SecManagerImpl *impl_from_IInternetSecurityManager(IInternetSecurityManager *iface) +static inline SecManagerImpl *impl_from_IInternetSecurityManagerEx2(IInternetSecurityManagerEx2 *iface) { - return CONTAINING_RECORD(iface, SecManagerImpl, IInternetSecurityManager_iface); + return CONTAINING_RECORD(iface, SecManagerImpl, IInternetSecurityManagerEx2_iface); } -static HRESULT WINAPI SecManagerImpl_QueryInterface(IInternetSecurityManager* iface,REFIID riid,void** ppvObject) +static HRESULT WINAPI SecManagerImpl_QueryInterface(IInternetSecurityManagerEx2* iface,REFIID riid,void** ppvObject) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppvObject); + TRACE("(%p)->(%s %p)\n",This,debugstr_guid(riid),ppvObject); - /* Perform a sanity check on the parameters.*/ - if ( (This==0) || (ppvObject==0) ) + if(!ppvObject) return E_INVALIDARG; - /* Initialize the return parameter */ - *ppvObject = 0; - - /* Compare the riid with the interface IDs implemented by this object.*/ - if (IsEqualIID(&IID_IUnknown, riid) || - IsEqualIID(&IID_IInternetSecurityManager, riid)) + if(IsEqualIID(&IID_IUnknown, riid) || + IsEqualIID(&IID_IInternetSecurityManager, riid) || + IsEqualIID(&IID_IInternetSecurityManagerEx, riid) || + IsEqualIID(&IID_IInternetSecurityManagerEx2, riid)) { *ppvObject = iface; - - /* Check that we obtained an interface.*/ - if (!*ppvObject) { + } else { WARN("not supported interface %s\n", debugstr_guid(riid)); + *ppvObject = NULL; return E_NOINTERFACE; } - /* Query Interface always increases the reference count by one when it is successful */ - IInternetSecurityManager_AddRef(iface); - + IInternetSecurityManagerEx2_AddRef(iface); return S_OK; } -static ULONG WINAPI SecManagerImpl_AddRef(IInternetSecurityManager* iface) +static ULONG WINAPI SecManagerImpl_AddRef(IInternetSecurityManagerEx2* iface) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); ULONG refCount = InterlockedIncrement(&This->ref); TRACE("(%p) ref=%u\n", This, refCount); @@ -704,9 +884,9 @@ static ULONG WINAPI SecManagerImpl_AddRef(IInternetSecurityManager* iface) return refCount; } -static ULONG WINAPI SecManagerImpl_Release(IInternetSecurityManager* iface) +static ULONG WINAPI SecManagerImpl_Release(IInternetSecurityManagerEx2* iface) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%u\n", This, refCount); @@ -726,10 +906,10 @@ static ULONG WINAPI SecManagerImpl_Release(IInternetSecurityManager* iface) return refCount; } -static HRESULT WINAPI SecManagerImpl_SetSecuritySite(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_SetSecuritySite(IInternetSecurityManagerEx2 *iface, IInternetSecurityMgrSite *pSite) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); TRACE("(%p)->(%p)\n", This, pSite); @@ -761,10 +941,10 @@ static HRESULT WINAPI SecManagerImpl_SetSecuritySite(IInternetSecurityManager *i return S_OK; } -static HRESULT WINAPI SecManagerImpl_GetSecuritySite(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_GetSecuritySite(IInternetSecurityManagerEx2 *iface, IInternetSecurityMgrSite **ppSite) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); TRACE("(%p)->(%p)\n", This, ppSite); @@ -778,11 +958,11 @@ static HRESULT WINAPI SecManagerImpl_GetSecuritySite(IInternetSecurityManager *i return S_OK; } -static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManagerEx2 *iface, LPCWSTR pwszUrl, DWORD *pdwZone, DWORD dwFlags) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); HRESULT hres; TRACE("(%p)->(%s %p %08x)\n", iface, debugstr_w(pwszUrl), pdwZone, dwFlags); @@ -805,20 +985,17 @@ static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManager *ifac return map_url_to_zone(pwszUrl, pdwZone, NULL); } -static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManagerEx2 *iface, LPCWSTR pwszUrl, BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); - LPWSTR url, ptr, ptr2; - DWORD zone, len; - HRESULT hres; - - static const WCHAR wszFile[] = {'f','i','l','e',':'}; + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); TRACE("(%p)->(%s %p %p %08lx)\n", iface, debugstr_w(pwszUrl), pbSecurityId, pcbSecurityId, dwReserved); if(This->custom_manager) { + HRESULT hres; + hres = IInternetSecurityManager_GetSecurityId(This->custom_manager, pwszUrl, pbSecurityId, pcbSecurityId, dwReserved); if(hres != INET_E_DEFAULT_ACTION) @@ -831,64 +1008,17 @@ static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *ifa if(dwReserved) FIXME("dwReserved is not supported\n"); - hres = map_url_to_zone(pwszUrl, &zone, &url); - if(FAILED(hres)) - return hres == 0x80041001 ? E_INVALIDARG : hres; - - /* file protocol is a special case */ - if(strlenW(url) >= sizeof(wszFile)/sizeof(WCHAR) - && !memcmp(url, wszFile, sizeof(wszFile)) && strchrW(url, '\\')) { - - static const BYTE secidFile[] = {'f','i','l','e',':'}; - - heap_free(url); - - if(*pcbSecurityId < sizeof(secidFile)+sizeof(zone)) - return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - - memcpy(pbSecurityId, secidFile, sizeof(secidFile)); - *(DWORD*)(pbSecurityId+sizeof(secidFile)) = zone; - - *pcbSecurityId = sizeof(secidFile)+sizeof(zone); - return S_OK; - } - - ptr = strchrW(url, ':'); - ptr2 = ++ptr; - while(*ptr2 == '/') - ptr2++; - if(ptr2 != ptr) - memmove(ptr, ptr2, (strlenW(ptr2)+1)*sizeof(WCHAR)); - - ptr = strchrW(ptr, '/'); - if(ptr) - *ptr = 0; - - len = WideCharToMultiByte(CP_ACP, 0, url, -1, NULL, 0, NULL, NULL)-1; - - if(len+sizeof(DWORD) > *pcbSecurityId) { - heap_free(url); - return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - } - - WideCharToMultiByte(CP_ACP, 0, url, -1, (LPSTR)pbSecurityId, len, NULL, NULL); - heap_free(url); - - *(DWORD*)(pbSecurityId+len) = zone; - - *pcbSecurityId = len+sizeof(DWORD); - - return S_OK; + return get_security_id_for_url(pwszUrl, pbSecurityId, pcbSecurityId); } -static HRESULT WINAPI SecManagerImpl_ProcessUrlAction(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_ProcessUrlAction(IInternetSecurityManagerEx2 *iface, LPCWSTR pwszUrl, DWORD dwAction, BYTE *pPolicy, DWORD cbPolicy, BYTE *pContext, DWORD cbContext, DWORD dwFlags, DWORD dwReserved) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); DWORD zone, policy; HRESULT hres; @@ -937,13 +1067,13 @@ static HRESULT WINAPI SecManagerImpl_ProcessUrlAction(IInternetSecurityManager * } -static HRESULT WINAPI SecManagerImpl_QueryCustomPolicy(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_QueryCustomPolicy(IInternetSecurityManagerEx2 *iface, LPCWSTR pwszUrl, REFGUID guidKey, BYTE **ppPolicy, DWORD *pcbPolicy, BYTE *pContext, DWORD cbContext, DWORD dwReserved) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); HRESULT hres; TRACE("(%p)->(%s %s %p %p %p %08x %08x )\n", iface, debugstr_w(pwszUrl), debugstr_guid(guidKey), @@ -960,10 +1090,10 @@ static HRESULT WINAPI SecManagerImpl_QueryCustomPolicy(IInternetSecurityManager return HRESULT_FROM_WIN32(ERROR_NOT_FOUND); } -static HRESULT WINAPI SecManagerImpl_SetZoneMapping(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_SetZoneMapping(IInternetSecurityManagerEx2 *iface, DWORD dwZone, LPCWSTR pwszPattern, DWORD dwFlags) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); HRESULT hres; TRACE("(%p)->(%08x %s %08x)\n", iface, dwZone, debugstr_w(pwszPattern),dwFlags); @@ -979,10 +1109,10 @@ static HRESULT WINAPI SecManagerImpl_SetZoneMapping(IInternetSecurityManager *if return E_NOTIMPL; } -static HRESULT WINAPI SecManagerImpl_GetZoneMappings(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_GetZoneMappings(IInternetSecurityManagerEx2 *iface, DWORD dwZone, IEnumString **ppenumString, DWORD dwFlags) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); HRESULT hres; TRACE("(%p)->(%08x %p %08x)\n", iface, dwZone, ppenumString,dwFlags); @@ -998,7 +1128,97 @@ static HRESULT WINAPI SecManagerImpl_GetZoneMappings(IInternetSecurityManager *i return E_NOTIMPL; } -static const IInternetSecurityManagerVtbl VT_SecManagerImpl = +static HRESULT WINAPI SecManagerImpl_ProcessUrlActionEx(IInternetSecurityManagerEx2 *iface, + LPCWSTR pwszUrl, DWORD dwAction, BYTE *pPolicy, DWORD cbPolicy, BYTE *pContext, DWORD cbContext, + DWORD dwFlags, DWORD dwReserved, DWORD *pdwOutFlags) +{ + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); + FIXME("(%p)->(%s %08x %p %d %p %d %08x %08x %p) stub\n", This, debugstr_w(pwszUrl), dwAction, pPolicy, cbPolicy, + pContext, cbContext, dwFlags, dwReserved, pdwOutFlags); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecManagerImpl_MapUrlToZoneEx2(IInternetSecurityManagerEx2 *iface, + IUri *pUri, DWORD *pdwZone, DWORD dwFlags, LPWSTR *ppwszMappedUrl, DWORD *pdwOutFlags) +{ + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); + + TRACE("(%p)->(%p %p %08x %p %p)\n", This, pUri, pdwZone, dwFlags, ppwszMappedUrl, pdwOutFlags); + + if(This->custom_manager) { + HRESULT hres; + IInternetSecurityManagerEx2 *sec_mgr2; + + hres = IInternetSecurityManager_QueryInterface(This->custom_manager, &IID_IInternetSecurityManagerEx2, + (void**)&sec_mgr2); + if(SUCCEEDED(hres)) { + hres = IInternetSecurityManagerEx2_MapUrlToZoneEx2(sec_mgr2, pUri, pdwZone, dwFlags, ppwszMappedUrl, pdwOutFlags); + IInternetSecurityManagerEx2_Release(sec_mgr2); + } else { + BSTR url; + + hres = IUri_GetDisplayUri(pUri, &url); + if(FAILED(hres)) + return hres; + + hres = IInternetSecurityManager_MapUrlToZone(This->custom_manager, url, pdwZone, dwFlags); + SysFreeString(url); + } + + if(hres != INET_E_DEFAULT_ACTION) + return hres; + } + + if(!pdwZone) + return E_INVALIDARG; + + if(!pUri) { + *pdwZone = URLZONE_INVALID; + return E_INVALIDARG; + } + + if(dwFlags) + FIXME("Unsupported flags: %08x\n", dwFlags); + + return map_uri_to_zone(pUri, pdwZone, NULL); +} + +static HRESULT WINAPI SecManagerImpl_ProcessUrlActionEx2(IInternetSecurityManagerEx2 *iface, + IUri *pUri, DWORD dwAction, BYTE *pPolicy, DWORD cbPolicy, BYTE *pContext, DWORD cbContext, + DWORD dwFlags, DWORD_PTR dwReserved, DWORD *pdwOutFlags) +{ + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); + FIXME("(%p)->(%p %08x %p %d %p %d %08x %08x %p) stub\n", This, pUri, dwAction, pPolicy, + cbPolicy, pContext, cbContext, dwFlags, (DWORD)dwReserved, pdwOutFlags); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecManagerImpl_GetSecurityIdEx2(IInternetSecurityManagerEx2 *iface, + IUri *pUri, BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved) +{ + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); + TRACE("(%p)->(%p %p %p %08x) stub\n", This, pUri, pbSecurityId, pcbSecurityId, (DWORD)dwReserved); + + if(dwReserved) + FIXME("dwReserved is not supported yet\n"); + + if(!pUri || !pcbSecurityId || !pbSecurityId) + return E_INVALIDARG; + + return get_security_id_for_uri(pUri, pbSecurityId, pcbSecurityId); +} + +static HRESULT WINAPI SecManagerImpl_QueryCustomPolicyEx2(IInternetSecurityManagerEx2 *iface, + IUri *pUri, REFGUID guidKey, BYTE **ppPolicy, DWORD *pcbPolicy, BYTE *pContext, + DWORD cbContext, DWORD_PTR dwReserved) +{ + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); + FIXME("(%p)->(%p %s %p %p %p %d %08x) stub\n", This, pUri, debugstr_guid(guidKey), ppPolicy, pcbPolicy, + pContext, cbContext, (DWORD)dwReserved); + return E_NOTIMPL; +} + +static const IInternetSecurityManagerEx2Vtbl VT_SecManagerImpl = { SecManagerImpl_QueryInterface, SecManagerImpl_AddRef, @@ -1010,7 +1230,12 @@ static const IInternetSecurityManagerVtbl VT_SecManagerImpl = SecManagerImpl_ProcessUrlAction, SecManagerImpl_QueryCustomPolicy, SecManagerImpl_SetZoneMapping, - SecManagerImpl_GetZoneMappings + SecManagerImpl_GetZoneMappings, + SecManagerImpl_ProcessUrlActionEx, + SecManagerImpl_MapUrlToZoneEx2, + SecManagerImpl_ProcessUrlActionEx2, + SecManagerImpl_GetSecurityIdEx2, + SecManagerImpl_QueryCustomPolicyEx2 }; HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) @@ -1021,7 +1246,7 @@ HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) This = heap_alloc(sizeof(*This)); /* Initialize the virtual function table. */ - This->IInternetSecurityManager_iface.lpVtbl = &VT_SecManagerImpl; + This->IInternetSecurityManagerEx2_iface.lpVtbl = &VT_SecManagerImpl; This->ref = 1; This->mgrsite = NULL; @@ -1138,7 +1363,7 @@ static HRESULT WINAPI ZoneMgrImpl_QueryInterface(IInternetZoneManagerEx2* iface, } *ppvObject = iface; - IInternetZoneManager_AddRef(iface); + IInternetZoneManagerEx2_AddRef(iface); return S_OK; } @@ -1512,7 +1737,7 @@ static HRESULT WINAPI ZoneMgrImpl_GetZoneAttributesEx(IInternetZoneManagerEx2* i if (dwFlags) FIXME("dwFlags 0x%x ignored\n", dwFlags); - return IInternetZoneManager_GetZoneAttributes(iface, dwZone, pZoneAttributes); + return IInternetZoneManagerEx2_GetZoneAttributes(iface, dwZone, pZoneAttributes); } @@ -1817,12 +2042,6 @@ HRESULT WINAPI CoInternetGetSecurityUrlEx(IUri *pUri, IUri **ppSecUri, PSUACTION if(FAILED(hres)) return hres; - hres = CreateUri(ret_url, Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME, 0, ppSecUri); - if(FAILED(hres)) { - CoTaskMemFree(ret_url); - return hres; - } - /* File URIs have to hierarchical. */ hres = IUri_GetScheme(pUri, (DWORD*)&scheme_type); if(SUCCEEDED(hres) && scheme_type == URL_SCHEME_FILE) { @@ -1839,3 +2058,12 @@ HRESULT WINAPI CoInternetGetSecurityUrlEx(IUri *pUri, IUri **ppSecUri, PSUACTION CoTaskMemFree(ret_url); return hres; } + +/******************************************************************** + * CompareSecurityIds (URLMON.@) + */ +HRESULT WINAPI CompareSecurityIds(BYTE *secid1, DWORD size1, BYTE *secid2, DWORD size2, DWORD reserved) +{ + FIXME("(%p %d %p %d %x)\n", secid1, size1, secid2, size2, reserved); + return E_NOTIMPL; +} diff --git a/dll/win32/urlmon/session.c b/dll/win32/urlmon/session.c index c92549eeec8..7d8b40b20bb 100644 --- a/dll/win32/urlmon/session.c +++ b/dll/win32/urlmon/session.c @@ -23,25 +23,25 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); -typedef struct name_space { +typedef struct { LPWSTR protocol; IClassFactory *cf; CLSID clsid; BOOL urlmon; - struct name_space *next; + struct list entry; } name_space; -typedef struct mime_filter { +typedef struct { IClassFactory *cf; CLSID clsid; LPWSTR mime; - struct mime_filter *next; + struct list entry; } mime_filter; -static name_space *name_space_list = NULL; -static mime_filter *mime_filter_list = NULL; +static struct list name_space_list = LIST_INIT(name_space_list); +static struct list mime_filter_list = LIST_INIT(mime_filter_list); static CRITICAL_SECTION session_cs; static CRITICAL_SECTION_DEBUG session_cs_dbg = @@ -63,8 +63,8 @@ static name_space *find_name_space(LPCWSTR protocol) { name_space *iter; - for(iter = name_space_list; iter; iter = iter->next) { - if(!strcmpW(iter->protocol, protocol)) + LIST_FOR_EACH_ENTRY(iter, &name_space_list, name_space, entry) { + if(!strcmpiW(iter->protocol, protocol)) return iter; } @@ -119,7 +119,7 @@ static HRESULT get_protocol_cf(LPCWSTR schema, DWORD schema_len, CLSID *pclsid, return SUCCEEDED(hres) ? S_OK : MK_E_SYNTAX; } -static HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR protocol, BOOL urlmon_protocol) +HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR protocol, BOOL urlmon_protocol) { name_space *new_name_space; @@ -134,8 +134,7 @@ static HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR proto EnterCriticalSection(&session_cs); - new_name_space->next = name_space_list; - name_space_list = new_name_space; + list_add_head(&name_space_list, &new_name_space->entry); LeaveCriticalSection(&session_cs); @@ -144,44 +143,28 @@ static HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR proto static HRESULT unregister_namespace(IClassFactory *cf, LPCWSTR protocol) { - name_space *iter, *last = NULL; + name_space *iter; EnterCriticalSection(&session_cs); - for(iter = name_space_list; iter; iter = iter->next) { - if(iter->cf == cf && !strcmpW(iter->protocol, protocol)) - break; - last = iter; - } + LIST_FOR_EACH_ENTRY(iter, &name_space_list, name_space, entry) { + if(iter->cf == cf && !strcmpiW(iter->protocol, protocol)) { + list_remove(&iter->entry); - if(iter) { - if(last) - last->next = iter->next; - else - name_space_list = iter->next; + LeaveCriticalSection(&session_cs); + + if(!iter->urlmon) + IClassFactory_Release(iter->cf); + heap_free(iter->protocol); + heap_free(iter); + return S_OK; + } } LeaveCriticalSection(&session_cs); - - if(iter) { - if(!iter->urlmon) - IClassFactory_Release(iter->cf); - heap_free(iter->protocol); - heap_free(iter); - } - return S_OK; } - -void register_urlmon_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR protocol, BOOL do_register) -{ - if(do_register) - register_namespace(cf, clsid, protocol, TRUE); - else - unregister_namespace(cf, protocol); -} - BOOL is_registered_protocol(LPCWSTR url) { DWORD schema_len; @@ -277,14 +260,22 @@ HRESULT get_protocol_handler(IUri *uri, CLSID *clsid, BOOL *urlmon_protocol, ICl IInternetProtocol *get_mime_filter(LPCWSTR mime) { + static const WCHAR filtersW[] = {'P','r','o','t','o','c','o','l','s', + '\\','F','i','l','t','e','r',0 }; + static const WCHAR CLSIDW[] = {'C','L','S','I','D',0}; + IClassFactory *cf = NULL; IInternetProtocol *ret; mime_filter *iter; + HKEY hlist, hfilter; + WCHAR clsidw[64]; + CLSID clsid; + DWORD res, type, size; HRESULT hres; EnterCriticalSection(&session_cs); - for(iter = mime_filter_list; iter; iter = iter->next) { + LIST_FOR_EACH_ENTRY(iter, &mime_filter_list, mime_filter, entry) { if(!strcmpW(iter->mime, mime)) { cf = iter->cf; break; @@ -293,12 +284,44 @@ IInternetProtocol *get_mime_filter(LPCWSTR mime) LeaveCriticalSection(&session_cs); - if(!cf) + if(cf) { + hres = IClassFactory_CreateInstance(cf, NULL, &IID_IInternetProtocol, (void**)&ret); + if(FAILED(hres)) { + WARN("CreateInstance failed: %08x\n", hres); + return NULL; + } + + return ret; + } + + res = RegOpenKeyW(HKEY_CLASSES_ROOT, filtersW, &hlist); + if(res != ERROR_SUCCESS) { + TRACE("Could not open MIME filters key\n"); + return NULL; + } + + res = RegOpenKeyW(hlist, mime, &hfilter); + CloseHandle(hlist); + if(res != ERROR_SUCCESS) return NULL; - hres = IClassFactory_CreateInstance(cf, NULL, &IID_IInternetProtocol, (void**)&ret); + size = sizeof(clsidw); + res = RegQueryValueExW(hfilter, CLSIDW, NULL, &type, (LPBYTE)clsidw, &size); + CloseHandle(hfilter); + if(res!=ERROR_SUCCESS || type!=REG_SZ) { + WARN("Could not get filter CLSID for %s\n", debugstr_w(mime)); + return NULL; + } + + hres = CLSIDFromString(clsidw, &clsid); if(FAILED(hres)) { - WARN("CreateInstance failed: %08x\n", hres); + WARN("CLSIDFromString failed for %s (%x)\n", debugstr_w(mime), hres); + return NULL; + } + + hres = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IInternetProtocol, (void**)&ret); + if(FAILED(hres)) { + WARN("CoCreateInstance failed: %08x\n", hres); return NULL; } @@ -379,8 +402,7 @@ static HRESULT WINAPI InternetSession_RegisterMimeFilter(IInternetSession *iface EnterCriticalSection(&session_cs); - filter->next = mime_filter_list; - mime_filter_list = filter; + list_add_head(&mime_filter_list, &filter->entry); LeaveCriticalSection(&session_cs); @@ -390,33 +412,26 @@ static HRESULT WINAPI InternetSession_RegisterMimeFilter(IInternetSession *iface static HRESULT WINAPI InternetSession_UnregisterMimeFilter(IInternetSession *iface, IClassFactory *pCF, LPCWSTR pwzType) { - mime_filter *iter, *prev = NULL; + mime_filter *iter; TRACE("(%p %s)\n", pCF, debugstr_w(pwzType)); EnterCriticalSection(&session_cs); - for(iter = mime_filter_list; iter; iter = iter->next) { - if(iter->cf == pCF && !strcmpW(iter->mime, pwzType)) - break; - prev = iter; - } + LIST_FOR_EACH_ENTRY(iter, &mime_filter_list, mime_filter, entry) { + if(iter->cf == pCF && !strcmpW(iter->mime, pwzType)) { + list_remove(&iter->entry); - if(iter) { - if(prev) - prev->next = iter->next; - else - mime_filter_list = iter->next; + LeaveCriticalSection(&session_cs); + + IClassFactory_Release(iter->cf); + heap_free(iter->mime); + heap_free(iter); + return S_OK; + } } LeaveCriticalSection(&session_cs); - - if(iter) { - IClassFactory_Release(iter->cf); - heap_free(iter->mime); - heap_free(iter); - } - return S_OK; } @@ -517,31 +532,38 @@ static LPWSTR user_agent; static void ensure_useragent(void) { - DWORD size = sizeof(DWORD), res, type; - HKEY hkey; + OSVERSIONINFOW info = {sizeof(info)}; + const WCHAR *os_type, *is_nt; + WCHAR buf[512]; + BOOL is_wow; - static const WCHAR user_agentW[] = {'U','s','e','r',' ','A','g','e','n','t',0}; + static const WCHAR formatW[] = + {'M','o','z','i','l','l','a','/','4','.','0', + ' ','(','c','o','m','p','a','t','i','b','l','e',';', + ' ','M','S','I','E',' ','8','.','0',';', + ' ','W','i','n','d','o','w','s',' ','%','s','%','d','.','%','d',';', + ' ','%','s',';',' ','T','r','i','d','e','n','t','/','5','.','0',')',0}; + static const WCHAR ntW[] = {'N','T',' ',0}; + static const WCHAR win32W[] = {'W','i','n','3','2',0}; + static const WCHAR win64W[] = {'W','i','n','6','4',0}; + static const WCHAR wow64W[] = {'W','O','W','6','4',0}; + static const WCHAR emptyW[] = {0}; if(user_agent) return; - res = RegOpenKeyW(HKEY_CURRENT_USER, internet_settings_keyW, &hkey); - if(res != ERROR_SUCCESS) - return; + GetVersionExW(&info); + is_nt = info.dwPlatformId == VER_PLATFORM_WIN32_NT ? ntW : emptyW; - res = RegQueryValueExW(hkey, user_agentW, NULL, &type, NULL, &size); - if(res == ERROR_SUCCESS && type == REG_SZ) { - user_agent = heap_alloc(size); - res = RegQueryValueExW(hkey, user_agentW, NULL, &type, (LPBYTE)user_agent, &size); - if(res != ERROR_SUCCESS) { - heap_free(user_agent); - user_agent = NULL; - } - }else { - WARN("Could not find User Agent value: %u\n", res); - } + if(sizeof(void*) == 8) + os_type = win64W; + else if(IsWow64Process(GetCurrentProcess(), &is_wow) && is_wow) + os_type = wow64W; + else + os_type = win32W; - RegCloseKey(hkey); + sprintfW(buf, formatW, is_nt, info.dwMajorVersion, info.dwMinorVersion, os_type); + user_agent = heap_strdupW(buf); } LPWSTR get_useragent(void) @@ -691,5 +713,21 @@ HRESULT WINAPI ObtainUserAgentString(DWORD dwOption, LPSTR pcszUAOut, DWORD *cbS void free_session(void) { + name_space *ns_iter, *ns_last; + mime_filter *mf_iter, *mf_last; + + LIST_FOR_EACH_ENTRY_SAFE(ns_iter, ns_last, &name_space_list, name_space, entry) { + if(!ns_iter->urlmon) + IClassFactory_Release(ns_iter->cf); + heap_free(ns_iter->protocol); + heap_free(ns_iter); + } + + LIST_FOR_EACH_ENTRY_SAFE(mf_iter, mf_last, &mime_filter_list, mime_filter, entry) { + IClassFactory_Release(mf_iter->cf); + heap_free(mf_iter->mime); + heap_free(mf_iter); + } + heap_free(user_agent); } diff --git a/dll/win32/urlmon/umon.c b/dll/win32/urlmon/umon.c index 7594fa7dff9..926fb7a66bf 100644 --- a/dll/win32/urlmon/umon.c +++ b/dll/win32/urlmon/umon.c @@ -37,7 +37,8 @@ typedef struct { LONG ref; - LPOLESTR URLName; /* URL string identified by this URLmoniker */ + IUri *uri; + BSTR URLName; } URLMoniker; static inline URLMoniker *impl_from_IMoniker(IMoniker *iface) @@ -76,7 +77,7 @@ static HRESULT WINAPI URLMoniker_QueryInterface(IMoniker *iface, REFIID riid, vo return E_NOINTERFACE; } - IMoniker_AddRef((IUnknown*)*ppv); + IUnknown_AddRef((IUnknown*)*ppv); return S_OK; } @@ -98,7 +99,9 @@ static ULONG WINAPI URLMoniker_Release(IMoniker *iface) TRACE("(%p) ref=%u\n",This, refCount); if (!refCount) { - heap_free(This->URLName); + if(This->uri) + IUri_Release(This->uri); + SysFreeString(This->URLName); heap_free(This); URLMON_UnlockModule(); @@ -136,9 +139,12 @@ static HRESULT WINAPI URLMoniker_IsDirty(IMoniker *iface) static HRESULT WINAPI URLMoniker_Load(IMoniker* iface,IStream* pStm) { URLMoniker *This = impl_from_IMoniker(iface); - HRESULT res; + WCHAR *new_uri_str; + IUri *new_uri; + BSTR new_url; ULONG size; ULONG got; + HRESULT hres; TRACE("(%p,%p)\n",This,pStm); @@ -150,23 +156,37 @@ static HRESULT WINAPI URLMoniker_Load(IMoniker* iface,IStream* pStm) * Writes a ULONG containing length of unicode string, followed * by that many unicode characters */ - res = IStream_Read(pStm, &size, sizeof(ULONG), &got); - if(SUCCEEDED(res)) { - if(got == sizeof(ULONG)) { - heap_free(This->URLName); - This->URLName = heap_alloc(size); - if(!This->URLName) - res = E_OUTOFMEMORY; - else { - res = IStream_Read(pStm, This->URLName, size, NULL); - This->URLName[size/sizeof(WCHAR) - 1] = 0; - } - } - else - res = E_FAIL; + hres = IStream_Read(pStm, &size, sizeof(ULONG), &got); + if(FAILED(hres)) + return hres; + if(got != sizeof(ULONG)) + return E_FAIL; + + new_uri_str = heap_alloc(size+sizeof(WCHAR)); + if(!new_uri_str) + return E_OUTOFMEMORY; + + hres = IStream_Read(pStm, new_uri_str, size, NULL); + new_uri_str[size/sizeof(WCHAR)] = 0; + if(SUCCEEDED(hres)) + hres = CreateUri(new_uri_str, 0, 0, &new_uri); + heap_free(new_uri_str); + if(FAILED(hres)) + return hres; + + hres = IUri_GetDisplayUri(new_uri, &new_url); + if(FAILED(hres)) { + IUri_Release(new_uri); + return hres; } - return res; + SysFreeString(This->URLName); + if(This->uri) + IUri_Release(This->uri); + + This->uri = new_uri; + This->URLName = new_url; + return S_OK; } static HRESULT WINAPI URLMoniker_Save(IMoniker *iface, IStream* pStm, BOOL fClearDirty) @@ -180,7 +200,7 @@ static HRESULT WINAPI URLMoniker_Save(IMoniker *iface, IStream* pStm, BOOL fClea if(!pStm) return E_INVALIDARG; - size = (strlenW(This->URLName) + 1)*sizeof(WCHAR); + size = (SysStringLen(This->URLName) + 1)*sizeof(WCHAR); res=IStream_Write(pStm,&size,sizeof(ULONG),NULL); if(SUCCEEDED(res)) res=IStream_Write(pStm,This->URLName,size,NULL); @@ -198,7 +218,7 @@ static HRESULT WINAPI URLMoniker_GetSizeMax(IMoniker* iface, ULARGE_INTEGER *pcb if(!pcbSize) return E_INVALIDARG; - pcbSize->QuadPart = sizeof(ULONG) + ((strlenW(This->URLName)+1) * sizeof(WCHAR)); + pcbSize->QuadPart = sizeof(ULONG) + ((SysStringLen(This->URLName)+1) * sizeof(WCHAR)); return S_OK; } @@ -207,10 +227,9 @@ static HRESULT WINAPI URLMoniker_BindToObject(IMoniker *iface, IBindCtx* pbc, IM { URLMoniker *This = impl_from_IMoniker(iface); IRunningObjectTable *obj_tbl; - IUri *uri; HRESULT hres; - TRACE("(%p)->(%p,%p,%s,%p): stub\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppv); + TRACE("(%p)->(%p,%p,%s,%p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppv); hres = IBindCtx_GetRunningObjectTable(pbc, &obj_tbl); if(SUCCEEDED(hres)) { @@ -218,22 +237,18 @@ static HRESULT WINAPI URLMoniker_BindToObject(IMoniker *iface, IBindCtx* pbc, IM IRunningObjectTable_Release(obj_tbl); } - hres = CreateUri(This->URLName, Uri_CREATE_FILE_USE_DOS_PATH, 0, &uri); - if(FAILED(hres)) - return hres; + if(!This->uri) { + *ppv = NULL; + return MK_E_SYNTAX; + } - hres = bind_to_object(iface, uri, pbc, riid, ppv); - - IUri_Release(uri); - return hres; + return bind_to_object(&This->IMoniker_iface, This->uri, pbc, riid, ppv); } static HRESULT WINAPI URLMoniker_BindToStorage(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, void **ppvObject) { URLMoniker *This = impl_from_IMoniker(iface); - IUri *uri; - HRESULT hres; TRACE("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObject); @@ -244,14 +259,10 @@ static HRESULT WINAPI URLMoniker_BindToStorage(IMoniker* iface, IBindCtx* pbc, if(pmkToLeft) FIXME("Unsupported pmkToLeft\n"); - hres = CreateUri(This->URLName, Uri_CREATE_FILE_USE_DOS_PATH, 0, &uri); - if(FAILED(hres)) - return hres; + if(!This->uri) + return MK_E_SYNTAX; - hres = bind_to_storage(uri, pbc, riid, ppvObject); - - IUri_Release(uri); - return hres; + return bind_to_storage(This->uri, pbc, riid, ppvObject); } static HRESULT WINAPI URLMoniker_Reduce(IMoniker *iface, IBindCtx *pbc, @@ -320,7 +331,7 @@ static HRESULT WINAPI URLMoniker_IsEqual(IMoniker *iface, IMoniker *pmkOtherMoni if(result == 0) res = S_OK; } - IUnknown_Release(bind); + IBindCtx_Release(bind); return res; } @@ -409,7 +420,7 @@ static HRESULT WINAPI URLMoniker_GetDisplayName(IMoniker *iface, IBindCtx *pbc, /* FIXME: If this is a partial URL, try and get a URL moniker from SZ_URLCONTEXT in the bind context, then look at pmkToLeft to try and complete the URL */ - len = lstrlenW(This->URLName)+1; + len = SysStringLen(This->URLName)+1; *ppszDisplayName = CoTaskMemAlloc(len*sizeof(WCHAR)); if(!*ppszDisplayName) return E_OUTOFMEMORY; @@ -492,10 +503,16 @@ static HRESULT WINAPI UriContainer_GetIUri(IUriContainer *iface, IUri **ppIUri) { URLMoniker *This = impl_from_IUriContainer(iface); - FIXME("(%p)->(%p)\n", This, ppIUri); + TRACE("(%p)->(%p)\n", This, ppIUri); - *ppIUri = NULL; - return S_FALSE; + if(!This->uri) { + *ppIUri = NULL; + return S_FALSE; + } + + IUri_AddRef(This->uri); + *ppIUri = This->uri; + return S_OK; } static const IUriContainerVtbl UriContainerVtbl = { @@ -505,61 +522,66 @@ static const IUriContainerVtbl UriContainerVtbl = { UriContainer_GetIUri }; -static URLMoniker *alloc_moniker(void) -{ - URLMoniker *ret; - - ret = heap_alloc(sizeof(URLMoniker)); - if(!ret) - return NULL; - - ret->IMoniker_iface.lpVtbl = &URLMonikerVtbl; - ret->IUriContainer_iface.lpVtbl = &UriContainerVtbl; - ret->ref = 1; - ret->URLName = NULL; - - return ret; -} - -static HRESULT URLMoniker_Init(URLMoniker *This, LPCOLESTR lpszLeftURLName, LPCOLESTR lpszURLName) +static HRESULT create_moniker(IUri *uri, URLMoniker **ret) { + URLMoniker *mon; HRESULT hres; - DWORD sizeStr = 0; - TRACE("(%p,%s,%s)\n",This,debugstr_w(lpszLeftURLName),debugstr_w(lpszURLName)); + mon = heap_alloc(sizeof(*mon)); + if(!mon) + return E_OUTOFMEMORY; - This->URLName = heap_alloc(INTERNET_MAX_URL_LENGTH*sizeof(WCHAR)); + mon->IMoniker_iface.lpVtbl = &URLMonikerVtbl; + mon->IUriContainer_iface.lpVtbl = &UriContainerVtbl; + mon->ref = 1; - if(lpszLeftURLName) - hres = CoInternetCombineUrl(lpszLeftURLName, lpszURLName, URL_FILE_USE_PATHURL, - This->URLName, INTERNET_MAX_URL_LENGTH, &sizeStr, 0); - else - hres = CoInternetParseUrl(lpszURLName, PARSE_CANONICALIZE, URL_FILE_USE_PATHURL, - This->URLName, INTERNET_MAX_URL_LENGTH, &sizeStr, 0); + if(uri) { + /* FIXME: try to avoid it */ + hres = IUri_GetDisplayUri(uri, &mon->URLName); + if(FAILED(hres)) { + heap_free(mon); + return hres; + } - if(FAILED(hres)) { - heap_free(This->URLName); - return hres; + IUri_AddRef(uri); + mon->uri = uri; + }else { + mon->URLName = NULL; + mon->uri = NULL; } URLMON_LockModule(); - - if(sizeStr != INTERNET_MAX_URL_LENGTH) - This->URLName = heap_realloc(This->URLName, (sizeStr+1)*sizeof(WCHAR)); - - TRACE("URLName = %s\n", debugstr_w(This->URLName)); - + *ret = mon; return S_OK; } HRESULT StdURLMoniker_Construct(IUnknown *outer, void **ppv) { + URLMoniker *mon; + HRESULT hres; + TRACE("(%p %p)\n", outer, ppv); - *ppv = alloc_moniker(); - return *ppv ? S_OK : E_OUTOFMEMORY; + hres = create_moniker(NULL, &mon); + if(FAILED(hres)) + return hres; + + *ppv = &mon->IMoniker_iface; + return S_OK; } +static const DWORD create_flags_map[3] = { + Uri_CREATE_FILE_USE_DOS_PATH, /* URL_MK_LEGACY */ + 0, /* URL_MK_UNIFORM */ + Uri_CREATE_NO_CANONICALIZE /* URL_MK_NO_CANONICALIZE */ +}; + +static const DWORD combine_flags_map[3] = { + URL_FILE_USE_PATHURL, /* URL_MK_LEGACY */ + 0, /* URL_MK_UNIFORM */ + URL_DONT_SIMPLIFY /* URL_MK_NO_CANONICALIZE */ +}; + /*********************************************************************** * CreateURLMonikerEx (URLMON.@) * @@ -578,9 +600,9 @@ HRESULT StdURLMoniker_Construct(IUnknown *outer, void **ppv) */ HRESULT WINAPI CreateURLMonikerEx(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk, DWORD dwFlags) { + IUri *uri, *base_uri = NULL; URLMoniker *obj; HRESULT hres; - LPOLESTR lefturl = NULL; TRACE("(%p, %s, %p, %08x)\n", pmkContext, debugstr_w(szURL), ppmk, dwFlags); @@ -590,28 +612,91 @@ HRESULT WINAPI CreateURLMonikerEx(IMoniker *pmkContext, LPCWSTR szURL, IMoniker if (!szURL || !ppmk) return E_INVALIDARG; - if (dwFlags & URL_MK_UNIFORM) FIXME("ignoring flag URL_MK_UNIFORM\n"); - - if(!(obj = alloc_moniker())) - return E_OUTOFMEMORY; + if(dwFlags >= sizeof(create_flags_map)/sizeof(*create_flags_map)) { + FIXME("Unsupported flags %x\n", dwFlags); + return E_INVALIDARG; + } if(pmkContext) { - IBindCtx* bind; - DWORD dwMksys = 0; - IMoniker_IsSystemMoniker(pmkContext, &dwMksys); - if(dwMksys == MKSYS_URLMONIKER && SUCCEEDED(CreateBindCtx(0, &bind))) { - IMoniker_GetDisplayName(pmkContext, bind, NULL, &lefturl); - TRACE("lefturl = %s\n", debugstr_w(lefturl)); - IBindCtx_Release(bind); + IUriContainer *uri_container; + + hres = IMoniker_QueryInterface(pmkContext, &IID_IUriContainer, (void**)&uri_container); + if(SUCCEEDED(hres)) { + hres = IUriContainer_GetIUri(uri_container, &base_uri); + IUriContainer_Release(uri_container); + if(FAILED(hres)) + return hres; } } - - hres = URLMoniker_Init(obj, lefturl, szURL); - CoTaskMemFree(lefturl); - if(SUCCEEDED(hres)) - hres = URLMoniker_QueryInterface(&obj->IMoniker_iface, &IID_IMoniker, (void**)ppmk); - IMoniker_Release(&obj->IMoniker_iface); - return hres; + + if(base_uri) { + hres = CoInternetCombineUrlEx(base_uri, szURL, combine_flags_map[dwFlags], &uri, 0); + IUri_Release(base_uri); + }else { + hres = CreateUri(szURL, Uri_CREATE_ALLOW_RELATIVE|Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME|create_flags_map[dwFlags], 0, &uri); + } + if(FAILED(hres)) + return hres; + + hres = create_moniker(uri, &obj); + IUri_Release(uri); + if(FAILED(hres)) + return hres; + + *ppmk = &obj->IMoniker_iface; + return S_OK; +} + +/*********************************************************************** + * CreateURLMonikerEx2 (URLMON.@) + */ +HRESULT WINAPI CreateURLMonikerEx2(IMoniker *pmkContext, IUri *pUri, IMoniker **ppmk, DWORD dwFlags) +{ + IUri *context_uri = NULL, *uri; + IUriContainer *uri_container; + URLMoniker *ret; + HRESULT hres; + + TRACE("(%p %p %p %x)\n", pmkContext, pUri, ppmk, dwFlags); + + if (ppmk) + *ppmk = NULL; + + if (!pUri || !ppmk) + return E_INVALIDARG; + + if(dwFlags >= sizeof(create_flags_map)/sizeof(*create_flags_map)) { + FIXME("Unsupported flags %x\n", dwFlags); + return E_INVALIDARG; + } + + if(pmkContext) { + hres = IMoniker_QueryInterface(pmkContext, &IID_IUriContainer, (void**)&uri_container); + if(SUCCEEDED(hres)) { + hres = IUriContainer_GetIUri(uri_container, &context_uri); + if(FAILED(hres)) + context_uri = NULL; + IUriContainer_Release(uri_container); + } + } + + if(context_uri) { + hres = CoInternetCombineIUri(context_uri, pUri, combine_flags_map[dwFlags], &uri, 0); + IUri_Release(context_uri); + if(FAILED(hres)) + return hres; + }else { + uri = pUri; + IUri_AddRef(uri); + } + + hres = create_moniker(uri, &ret); + IUri_Release(uri); + if(FAILED(hres)) + return hres; + + *ppmk = &ret->IMoniker_iface; + return S_OK; } /********************************************************************** @@ -865,14 +950,3 @@ HRESULT WINAPI GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi ) FIXME("%s %p\n", debugstr_w(szDistUnit), psdi ); return E_FAIL; } - -/*********************************************************************** - * AsyncInstallDistributionUnit (URLMON.@) - */ -HRESULT WINAPI AsyncInstallDistributionUnit( LPCWSTR szDistUnit, LPCWSTR szTYPE, - LPCWSTR szExt, DWORD dwFileVersionMS, DWORD dwFileVersionLS, - LPCWSTR szURL, IBindCtx *pbc, LPVOID pvReserved, DWORD flags ) -{ - FIXME(": stub\n"); - return E_NOTIMPL; -} diff --git a/dll/win32/urlmon/umstream.c b/dll/win32/urlmon/umstream.c index bb9e4db6488..5f48bb4f514 100644 --- a/dll/win32/urlmon/umstream.c +++ b/dll/win32/urlmon/umstream.c @@ -48,7 +48,7 @@ static HRESULT WINAPI ProxyBindStatusCallback_QueryInterface(IBindStatusCallback IsEqualGUID(&IID_IUnknown, riid)) { *ppv = iface; - IUnknown_AddRef(iface); + IBindStatusCallback_AddRef(iface); return S_OK; } diff --git a/dll/win32/urlmon/uri.c b/dll/win32/urlmon/uri.c index 510ff0df233..3f3b19c0257 100644 --- a/dll/win32/urlmon/uri.c +++ b/dll/win32/urlmon/uri.c @@ -17,6 +17,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +//#include + #include "urlmon_main.h" #include @@ -25,9 +27,6 @@ #include -#define UINT_MAX 0xffffffff -#define USHORT_MAX 0xffff - #define URI_DISPLAY_NO_ABSOLUTE_URI 0x1 #define URI_DISPLAY_NO_DEFAULT_PORT_AUTH 0x2 @@ -50,6 +49,8 @@ static const IID IID_IUriObj = {0x4b364760,0x9f51,0x11df,{0x98,0x1c,0x08,0x00,0x typedef struct { IUri IUri_iface; IUriBuilderFactory IUriBuilderFactory_iface; + IPersistStream IPersistStream_iface; + IMarshal IMarshal_iface; LONG ref; @@ -155,6 +156,7 @@ typedef struct { BOOL has_implicit_scheme; BOOL has_implicit_ip; UINT implicit_ipv4; + BOOL must_have_path; const WCHAR *scheme; DWORD scheme_len; @@ -233,7 +235,7 @@ static const struct { {URL_SCHEME_HTTPS, 443}, }; -/* List of 3 character top level domain names Windows seems to recognize. +/* List of 3-character top level domain names Windows seems to recognize. * There might be more, but, these are the only ones I've found so far. */ static const struct { @@ -270,7 +272,7 @@ static inline BOOL is_drive_path(const WCHAR *str) { } static inline BOOL is_unc_path(const WCHAR *str) { - return (str[0] == '\\' && str[0] == '\\'); + return (str[0] == '\\' && str[1] == '\\'); } static inline BOOL is_forbidden_dos_path_char(WCHAR val) { @@ -278,7 +280,7 @@ static inline BOOL is_forbidden_dos_path_char(WCHAR val) { } /* A URI is implicitly a file path if it begins with - * a drive letter (eg X:) or starts with "\\" (UNC path). + * a drive letter (e.g. X:) or starts with "\\" (UNC path). */ static inline BOOL is_implicit_file_path(const WCHAR *str) { return (is_unc_path(str) || (is_alpha(str[0]) && str[1] == ':')); @@ -328,7 +330,7 @@ static inline BOOL is_gendelim(WCHAR val) { /* Characters that delimit the end of the authority * section of a URI. Sometimes a '\\' is considered - * an authority delimeter. + * an authority delimiter. */ static inline BOOL is_auth_delim(WCHAR val, BOOL acceptSlash) { return (val == '#' || val == '/' || val == '?' || @@ -403,12 +405,12 @@ static void apply_default_flags(DWORD *flags) { /* Determines if the URI is hierarchical using the information already parsed into * data and using the current location of parsing in the URI string. * - * Windows considers a URI hierarchical if on of the following is true: + * Windows considers a URI hierarchical if one of the following is true: * A.) It's a wildcard scheme. * B.) It's an implicit file scheme. * C.) It's a known hierarchical scheme and it has two '\\' after the scheme name. * (the '\\' will be converted into "//" during canonicalization). - * D.) It's not a relative URI and "//" appears after the scheme name. + * D.) "//" appears after the scheme name (or at the beginning if no scheme is given). */ static inline BOOL is_hierarchical_uri(const WCHAR **ptr, const parse_data *data) { const WCHAR *start = *ptr; @@ -420,114 +422,16 @@ static inline BOOL is_hierarchical_uri(const WCHAR **ptr, const parse_data *data else if(is_hierarchical_scheme(data->scheme_type) && (*ptr)[0] == '\\' && (*ptr)[1] == '\\') { *ptr += 2; return TRUE; - } else if(!data->is_relative && check_hierarchical(ptr)) + } else if(check_hierarchical(ptr)) return TRUE; *ptr = start; return FALSE; } -/* Checks if the two Uri's are logically equivalent. It's a simple - * comparison, since they are both of type Uri, and it can access - * the properties of each Uri directly without the need to go - * through the "IUri_Get*" interface calls. - */ -static BOOL are_equal_simple(const Uri *a, const Uri *b) { - if(a->scheme_type == b->scheme_type) { - const BOOL known_scheme = a->scheme_type != URL_SCHEME_UNKNOWN; - const BOOL are_hierarchical = - (a->authority_start > -1 && b->authority_start > -1); - - if(a->scheme_type == URL_SCHEME_FILE) { - if(a->canon_len == b->canon_len) - return !StrCmpIW(a->canon_uri, b->canon_uri); - } - - /* Only compare the scheme names (if any) if their unknown scheme types. */ - if(!known_scheme) { - if((a->scheme_start > -1 && b->scheme_start > -1) && - (a->scheme_len == b->scheme_len)) { - /* Make sure the schemes are the same. */ - if(StrCmpNW(a->canon_uri+a->scheme_start, b->canon_uri+b->scheme_start, a->scheme_len)) - return FALSE; - } else if(a->scheme_len != b->scheme_len) - /* One of the Uri's has a scheme name, while the other doesn't. */ - return FALSE; - } - - /* If they have a userinfo component, perform case sensitive compare. */ - if((a->userinfo_start > -1 && b->userinfo_start > -1) && - (a->userinfo_len == b->userinfo_len)) { - if(StrCmpNW(a->canon_uri+a->userinfo_start, b->canon_uri+b->userinfo_start, a->userinfo_len)) - return FALSE; - } else if(a->userinfo_len != b->userinfo_len) - /* One of the Uri's had a userinfo, while the other one doesn't. */ - return FALSE; - - /* Check if they have a host name. */ - if((a->host_start > -1 && b->host_start > -1) && - (a->host_len == b->host_len)) { - /* Perform a case insensitive compare if they are a known scheme type. */ - if(known_scheme) { - if(StrCmpNIW(a->canon_uri+a->host_start, b->canon_uri+b->host_start, a->host_len)) - return FALSE; - } else if(StrCmpNW(a->canon_uri+a->host_start, b->canon_uri+b->host_start, a->host_len)) - return FALSE; - } else if(a->host_len != b->host_len) - /* One of the Uri's had a host, while the other one didn't. */ - return FALSE; - - if(a->has_port && b->has_port) { - if(a->port != b->port) - return FALSE; - } else if(a->has_port || b->has_port) - /* One had a port, while the other one didn't. */ - return FALSE; - - /* Windows is weird with how it handles paths. For example - * One URI could be "http://google.com" (after canonicalization) - * and one could be "http://google.com/" and the IsEqual function - * would still evaluate to TRUE, but, only if they are both hierarchical - * URIs. - */ - if((a->path_start > -1 && b->path_start > -1) && - (a->path_len == b->path_len)) { - if(StrCmpNW(a->canon_uri+a->path_start, b->canon_uri+b->path_start, a->path_len)) - return FALSE; - } else if(are_hierarchical && a->path_len == -1 && b->path_len == 0) { - if(*(a->canon_uri+a->path_start) != '/') - return FALSE; - } else if(are_hierarchical && b->path_len == 1 && a->path_len == 0) { - if(*(b->canon_uri+b->path_start) != '/') - return FALSE; - } else if(a->path_len != b->path_len) - return FALSE; - - /* Compare the query strings of the two URIs. */ - if((a->query_start > -1 && b->query_start > -1) && - (a->query_len == b->query_len)) { - if(StrCmpNW(a->canon_uri+a->query_start, b->canon_uri+b->query_start, a->query_len)) - return FALSE; - } else if(a->query_len != b->query_len) - return FALSE; - - if((a->fragment_start > -1 && b->fragment_start > -1) && - (a->fragment_len == b->fragment_len)) { - if(StrCmpNW(a->canon_uri+a->fragment_start, b->canon_uri+b->fragment_start, a->fragment_len)) - return FALSE; - } else if(a->fragment_len != b->fragment_len) - return FALSE; - - /* If we get here, the two URIs are equivalent. */ - return TRUE; - } - - return FALSE; -} - /* Computes the size of the given IPv6 address. - * Each h16 component is 16bits, if there is an IPv4 address, it's - * 32bits. If there's an elision it can be 16bits to 128bits, depending + * Each h16 component is 16 bits. If there is an IPv4 address, it's + * 32 bits. If there's an elision it can be 16 to 128 bits, depending * on the number of other components. * * Modeled after google-url's CheckIPv6ComponentsSize function @@ -541,7 +445,7 @@ static void compute_ipv6_comps_size(ipv6_address *address) { if(address->elision) { /* An elision can be anywhere from 2 bytes up to 16 bytes. - * It size depends on the size of the h16 and IPv4 components. + * Its size depends on the size of the h16 and IPv4 components. */ address->elision_size = 16 - address->components_size; if(address->elision_size < 2) @@ -567,7 +471,7 @@ static int hex_to_int(WCHAR val) { * the two characters following the '%' aren't valid hex values then * this function returns the NULL character. * - * Eg. + * E.g. * "%2E" will result in '.' being returned by this function. */ static WCHAR decode_pct_val(const WCHAR *ptr) { @@ -616,7 +520,7 @@ void find_domain_name(const WCHAR *host, DWORD host_len, *domain_start = -1; /* There has to be at least enough room for a '.' followed by a - * 3 character TLD for a domain to even exist in the host name. + * 3-character TLD for a domain to even exist in the host name. */ if(host_len < 4) return; @@ -640,7 +544,7 @@ void find_domain_name(const WCHAR *host, DWORD host_len, } else if(last_tld-host == 3) { DWORD i; - /* If there's three characters in front of last_tld and + /* If there are three characters in front of last_tld and * they are on the list of recognized TLDs, then this * host doesn't have a domain (since the host only contains * a TLD name. @@ -789,12 +693,12 @@ static INT find_file_extension(const WCHAR *path, DWORD path_len) { /* Computes the location where the elision should occur in the IPv6 * address using the numerical values of each component stored in * 'values'. If the address shouldn't contain an elision then 'index' - * is assigned -1 as it's value. Otherwise 'index' will contain the + * is assigned -1 as its value. Otherwise 'index' will contain the * starting index (into values) where the elision should be, and 'count' * will contain the number of cells the elision covers. * * NOTES: - * Windows will expand an elision if the elision only represents 1 h16 + * Windows will expand an elision if the elision only represents one h16 * component of the address. * * Ex: [1::2:3:4:5:6:7] -> [1:0:2:3:4:5:6:7] @@ -857,35 +761,35 @@ static void compute_elision_location(const ipv6_address *address, const USHORT v * characters inside of the URI string. */ static BSTR pre_process_uri(LPCWSTR uri) { - BSTR ret; + const WCHAR *start, *end, *ptr; + WCHAR *ptr2; DWORD len; - const WCHAR *start, *end; - WCHAR *buf, *ptr; - - len = lstrlenW(uri); + BSTR ret; start = uri; /* Skip leading controls and whitespace. */ - while(iscntrlW(*start) || isspaceW(*start)) ++start; + while(*start && (iscntrlW(*start) || isspaceW(*start))) ++start; - end = uri+len-1; - if(start == end) - /* URI consisted only of control/whitespace. */ - ret = SysAllocStringLen(NULL, 0); - else { - while(iscntrlW(*end) || isspaceW(*end)) --end; + /* URI consisted only of control/whitespace. */ + if(!*start) + return SysAllocStringLen(NULL, 0); - buf = heap_alloc(((end+1)-start)*sizeof(WCHAR)); - if(!buf) - return NULL; + end = start + strlenW(start); + while(--end > start && (iscntrlW(*end) || isspaceW(*end))); - for(ptr = buf; start < end+1; ++start) { - if(!iscntrlW(*start)) - *ptr++ = *start; - } + len = ++end - start; + for(ptr = start; ptr < end; ptr++) { + if(iscntrlW(*ptr)) + len--; + } - ret = SysAllocStringLen(buf, ptr-buf); - heap_free(buf); + ret = SysAllocStringLen(NULL, len); + if(!ret) + return NULL; + + for(ptr = start, ptr2=ret; ptr < end; ptr++) { + if(!iscntrlW(*ptr)) + *ptr2++ = *ptr; } return ret; @@ -915,7 +819,7 @@ static UINT ipv4toui(const WCHAR *ip, DWORD len) { return ret; } -/* Converts an IPv4 address in numerical form into it's fully qualified +/* Converts an IPv4 address in numerical form into its fully qualified * string form. This function returns the number of characters written * to 'dest'. If 'dest' is NULL this function will return the number of * characters that would have been written. @@ -956,7 +860,7 @@ static DWORD ui2str(WCHAR *dest, UINT value) { return ret; } -/* Converts an h16 component (from an IPv6 address) into it's +/* Converts a h16 component (from an IPv6 address) into its * numerical value. * * This function assumes that the h16 component has already been validated. @@ -987,7 +891,7 @@ static BOOL ipv6_to_number(const ipv6_address *address, USHORT number[8]) { /* Means we just passed the elision and need to add its values to * 'number' before we do anything else. */ - DWORD j = 0; + INT j; for(j = 0; j < address->elision_size; j+=2) number[cur_component++] = 0; @@ -1000,7 +904,8 @@ static BOOL ipv6_to_number(const ipv6_address *address, USHORT number[8]) { /* Case when the elision appears after the h16 components. */ if(!already_passed_elision && address->elision) { - for(i = 0; i < address->elision_size; i+=2) + INT j; + for(j = 0; j < address->elision_size; j+=2) number[cur_component++] = 0; } @@ -1063,7 +968,7 @@ static BOOL check_dec_octet(const WCHAR **ptr) { ++(*ptr); c2 = *ptr; - /* Since the 1 digit requirment was meet, it doesn't + /* Since the 1-digit requirement was met, it doesn't * matter if this is a DIGIT value, it's considered a * dec-octet. */ @@ -1270,7 +1175,7 @@ static BOOL parse_scheme(const WCHAR **ptr, parse_data *data, DWORD flags, DWORD TRACE("(%p %p %x): URI is an implicit file path.\n", ptr, data, flags); } else { - /* Window's does not consider anything that can implicitly be a file + /* Windows does not consider anything that can implicitly be a file * path to be a valid URI if the ALLOW_IMPLICIT_FILE_SCHEME flag is not set... */ TRACE("(%p %p %x): URI is implicitly a file path, but, the ALLOW_IMPLICIT_FILE_SCHEME flag wasn't set.\n", @@ -1278,10 +1183,10 @@ static BOOL parse_scheme(const WCHAR **ptr, parse_data *data, DWORD flags, DWORD return FALSE; } } else if(!parse_scheme_name(ptr, data, extras)) { - /* No Scheme was found, this means it could be: + /* No scheme was found, this means it could be: * a) an implicit Wildcard scheme * b) a relative URI - * c) a invalid URI. + * c) an invalid URI. */ if(flags & Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME) { data->scheme = wildcardW; @@ -1379,10 +1284,10 @@ static BOOL parse_password(const WCHAR **ptr, parse_data *data, DWORD flags, DWO * ex: * ftp://user:pass:word@winehq.org * - * Would yield, "user" as the username and "pass:word" as the password. + * would yield "user" as the username and "pass:word" as the password. * * 2) Windows allows any character to appear in the "userinfo" part of - * a URI, as long as it's not an authority delimeter character set. + * a URI, as long as it's not an authority delimiter character set. */ static void parse_userinfo(const WCHAR **ptr, parse_data *data, DWORD flags) { const WCHAR *start = *ptr; @@ -1446,7 +1351,7 @@ static BOOL parse_port(const WCHAR **ptr, parse_data *data, DWORD flags) { port = port*10 + (**ptr-'0'); - if(port > USHORT_MAX) { + if(port > USHRT_MAX) { *ptr = data->port; data->port = NULL; return FALSE; @@ -1467,7 +1372,7 @@ static BOOL parse_port(const WCHAR **ptr, parse_data *data, DWORD flags) { /* Attempts to parse a IPv4 address from the URI. * * NOTES: - * Window's normalizes IPv4 addresses, This means there's three + * Windows normalizes IPv4 addresses, This means there are three * possibilities for the URI to contain an IPv4 address. * 1) A well formed address (ex. 192.2.2.2). * 2) A partially formed address. For example "192.0" would @@ -1493,6 +1398,9 @@ static BOOL parse_ipv4address(const WCHAR **ptr, parse_data *data, DWORD flags) data->has_implicit_ip = TRUE; } + data->host_len = *ptr - data->host; + data->host_type = Uri_HOST_IPV4; + /* Check if what we found is the only part of the host name (if it isn't * we don't have an IPv4 address). */ @@ -1504,16 +1412,13 @@ static BOOL parse_ipv4address(const WCHAR **ptr, parse_data *data, DWORD flags) return FALSE; } } else if(!is_auth_delim(**ptr, !is_unknown)) { - /* Found more data which belongs the host, so this isn't an IPv4. */ + /* Found more data which belongs to the host, so this isn't an IPv4. */ *ptr = data->host; data->host = NULL; data->has_implicit_ip = FALSE; return FALSE; } - data->host_len = *ptr - data->host; - data->host_type = Uri_HOST_IPV4; - TRACE("(%p %p %x): IPv4 address found. host=%s host_len=%d host_type=%d\n", ptr, data, flags, debugstr_wn(data->host, data->host_len), data->host_len, data->host_type); @@ -1535,8 +1440,8 @@ static BOOL parse_ipv4address(const WCHAR **ptr, parse_data *data, DWORD flags) * Windows doesn't like host names which start with '[' and end with ']' * and don't contain a valid IP literal address in between them. * - * On Windows if an '[' is encountered in the host name the ':' no longer - * counts as a delimiter until you reach the next ']' or an "authority delimeter". + * On Windows if a '[' is encountered in the host name the ':' no longer + * counts as a delimiter until you reach the next ']' or an "authority delimiter". * * A reg-name CAN be empty. */ @@ -1557,7 +1462,7 @@ static BOOL parse_reg_name(const WCHAR **ptr, parse_data *data, DWORD flags, DWO * path can also have a '|' instead of a ':' after the drive letter. */ if(is_drive_path(*ptr)) { - /* Regular old drive paths don't have a host type (or host name). */ + /* Regular old drive paths have no host type (or host name). */ data->host_type = Uri_HOST_UNKNOWN; data->host = *ptr; data->host_len = 0; @@ -1589,7 +1494,7 @@ static BOOL parse_reg_name(const WCHAR **ptr, parse_data *data, DWORD flags, DWO return FALSE; } else /* Windows gives up on trying to parse a port when it - * encounters 1 invalid port. + * encounters an invalid port. */ ignore_col = TRUE; } else { @@ -1781,7 +1686,7 @@ static BOOL parse_ipv6address(const WCHAR **ptr, parse_data *data, DWORD flags) if(ip.elision_size == 2) { /* For some reason on Windows if an elision that represents - * only 1 h16 component is encountered at the very begin or + * only one h16 component is encountered at the very begin or * end of an IPv6 address, Windows does not consider it a * valid IPv6 address. * @@ -1938,10 +1843,7 @@ static BOOL parse_path_hierarchical(const WCHAR **ptr, parse_data *data, DWORD f const BOOL is_file = data->scheme_type == URL_SCHEME_FILE; if(is_path_delim(**ptr)) { - if(data->scheme_type == URL_SCHEME_WILDCARD) { - /* Wildcard schemes don't get a '/' attached if their path is - * empty. - */ + if(data->scheme_type == URL_SCHEME_WILDCARD && !data->must_have_path) { data->path = NULL; data->path_len = 0; } else if(!(flags & Uri_CREATE_NO_CANONICALIZE)) { @@ -2002,7 +1904,7 @@ static BOOL parse_path_hierarchical(const WCHAR **ptr, parse_data *data, DWORD f return TRUE; } -/* Parses the path of a opaque URI (much less strict then the parser +/* Parses the path of an opaque URI (much less strict then the parser * for a hierarchical URI). * * NOTE: @@ -2044,7 +1946,7 @@ static BOOL parse_path_opaque(const WCHAR **ptr, parse_data *data, DWORD flags) /* Determines how the URI should be parsed after the scheme information. * - * If the scheme is followed, by "//" then, it is treated as an hierarchical URI + * If the scheme is followed by "//", then it is treated as a hierarchical URI * which then the authority and path information will be parsed out. Otherwise, the * URI will be treated as an opaque URI which the authority information is not parsed * out. @@ -2062,12 +1964,23 @@ static BOOL parse_path_opaque(const WCHAR **ptr, parse_data *data, DWORD flags) * NOTES: * If the URI is of an unknown scheme type and has a "//" following the scheme then it * is treated as a hierarchical URI, but, if the CREATE_NO_CRACK_UNKNOWN_SCHEMES flag is - * set then it is considered an opaque URI reguardless of what follows the scheme information + * set then it is considered an opaque URI regardless of what follows the scheme information * (per MSDN documentation). */ static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) { const WCHAR *start = *ptr; + data->must_have_path = FALSE; + + /* For javascript: URIs, simply set everything as a path */ + if(data->scheme_type == URL_SCHEME_JAVASCRIPT) { + data->path = *ptr; + data->path_len = strlenW(*ptr); + data->is_opaque = TRUE; + *ptr += data->path_len; + return TRUE; + } + /* Checks if the authority information needs to be parsed. */ if(is_hierarchical_uri(ptr, data)) { /* Only treat it as a hierarchical URI if the scheme_type is known or @@ -2078,13 +1991,20 @@ static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) { TRACE("(%p %p %x): Treating URI as an hierarchical URI.\n", ptr, data, flags); data->is_opaque = FALSE; + if(data->scheme_type == URL_SCHEME_WILDCARD && !data->has_implicit_scheme) { + if(**ptr == '/' && *(*ptr+1) == '/') { + data->must_have_path = TRUE; + *ptr += 2; + } + } + /* TODO: Handle hierarchical URI's, parse authority then parse the path. */ if(!parse_authority(ptr, data, flags)) return FALSE; return parse_path_hierarchical(ptr, data, flags); } else - /* Reset ptr to it's starting position so opaque path parsing + /* Reset ptr to its starting position so opaque path parsing * begins at the correct location. */ *ptr = start; @@ -2107,8 +2027,8 @@ static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) { * * NOTES: * If NO_DECODE_EXTRA_INFO flag is set, then invalid percent encoded - * data is allowed appear in the query string. For unknown scheme types - * invalid percent encoded data is allowed to appear reguardless. + * data is allowed to appear in the query string. For unknown scheme types + * invalid percent encoded data is allowed to appear regardless. */ static BOOL parse_query(const WCHAR **ptr, parse_data *data, DWORD flags) { const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; @@ -2146,8 +2066,8 @@ static BOOL parse_query(const WCHAR **ptr, parse_data *data, DWORD flags) { * * NOTES: * If NO_DECODE_EXTRA_INFO flag is set, then invalid percent encoded - * data is allowed appear in the query string. For unknown scheme types - * invalid percent encoded data is allowed to appear reguardless. + * data is allowed to appear in the query string. For unknown scheme types + * invalid percent encoded data is allowed to appear regardless. */ static BOOL parse_fragment(const WCHAR **ptr, parse_data *data, DWORD flags) { const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; @@ -2224,7 +2144,7 @@ static BOOL canonicalize_username(const parse_data *data, Uri *uri, DWORD flags, if(*ptr == '%') { /* Only decode % encoded values for known scheme types. */ if(data->scheme_type != URL_SCHEME_UNKNOWN) { - /* See if the value really needs decoded. */ + /* See if the value really needs decoding. */ WCHAR val = decode_pct_val(ptr); if(is_unreserved(val)) { if(!computeOnly) @@ -2282,7 +2202,7 @@ static BOOL canonicalize_password(const parse_data *data, Uri *uri, DWORD flags, if(*ptr == '%') { /* Only decode % encoded values for known scheme types. */ if(data->scheme_type != URL_SCHEME_UNKNOWN) { - /* See if the value really needs decoded. */ + /* See if the value really needs decoding. */ WCHAR val = decode_pct_val(ptr); if(is_unreserved(val)) { if(!computeOnly) @@ -2358,7 +2278,7 @@ static BOOL canonicalize_userinfo(const parse_data *data, Uri *uri, DWORD flags, * Things that happen: * 1) If Uri_CREATE_NO_CANONICALIZE flag is not set, then the reg_name is * lower cased. Unless it's an unknown scheme type, which case it's - * no lower cased reguardless. + * no lower cased regardless. * * 2) Unreserved % encoded characters are decoded for known * scheme types. @@ -2404,7 +2324,7 @@ static BOOL canonicalize_reg_name(const parse_data *data, Uri *uri, if(*ptr == '%' && known_scheme) { WCHAR val = decode_pct_val(ptr); if(is_unreserved(val)) { - /* If NO_CANONICALZE is not set, then windows lower cases the + /* If NO_CANONICALIZE is not set, then windows lower cases the * decoded value. */ if(!(flags & Uri_CREATE_NO_CANONICALIZE) && isupperW(val)) { @@ -2474,8 +2394,8 @@ static BOOL canonicalize_implicit_ipv4address(const parse_data *data, Uri *uri, uri->host_start = uri->canon_len; TRACE("%u\n", data->implicit_ipv4); - /* For unknown scheme types Window's doesn't convert - * the value into an IP address, but, it still considers + /* For unknown scheme types Windows doesn't convert + * the value into an IP address, but it still considers * it an IPv4 address. */ if(data->scheme_type == URL_SCHEME_UNKNOWN) { @@ -2506,7 +2426,7 @@ static BOOL canonicalize_implicit_ipv4address(const parse_data *data, Uri *uri, * If the parse_data represents a URI that has an implicit IPv4 address * (ex. http://256/, this function will convert 256 into 0.0.1.0). If * the implicit IP address exceeds the value of UINT_MAX (maximum value - * for an IPv4 address) it's canonicalized as if were a reg-name. + * for an IPv4 address) it's canonicalized as if it were a reg-name. * * If the parse_data contains a partial or full IPv4 address it normalizes it. * A partial IPv4 address is something like "192.0" and would be normalized to @@ -2514,7 +2434,7 @@ static BOOL canonicalize_implicit_ipv4address(const parse_data *data, Uri *uri, * be normalized to "192.2.1.3". * * NOTES: - * Window's ONLY normalizes IPv4 address for known scheme types (one that isn't + * Windows ONLY normalizes IPv4 address for known scheme types (one that isn't * URL_SCHEME_UNKNOWN). For unknown scheme types, it simply copies the data from * the original URI into the canonicalized URI, but, it still recognizes URI's * host type as HOST_IPV4. @@ -2596,11 +2516,11 @@ static BOOL canonicalize_ipv4address(const parse_data *data, Uri *uri, DWORD fla /* Attempts to canonicalize the IPv6 address of the URI. * * Multiple things happen during the canonicalization of an IPv6 address: - * 1) Any leading zero's in an h16 component are removed. + * 1) Any leading zero's in a h16 component are removed. * Ex: [0001:0022::] -> [1:22::] * * 2) The longest sequence of zero h16 components are compressed - * into a "::" (elision). If there's a tie, the first is choosen. + * into a "::" (elision). If there's a tie, the first is chosen. * * Ex: [0:0:0:0:1:6:7:8] -> [::1:6:7:8] * [0:0:0:0:1:2::] -> [::1:2:0:0] @@ -2610,7 +2530,7 @@ static BOOL canonicalize_ipv4address(const parse_data *data, Uri *uri, DWORD fla * also normalized. * Ex: [::001.002.022.000] -> [::1.2.22.0] * - * 4) If an elision is present, but, only represents 1 h16 component + * 4) If an elision is present, but, only represents one h16 component * it's expanded. * * Ex: [1::2:3:4:5:6:7] -> [1:0:2:3:4:5:6:7] @@ -2886,7 +2806,7 @@ static BOOL canonicalize_authority(const parse_data *data, Uri *uri, DWORD flags * Things that happen: * 1). Forbidden characters are percent encoded, unless the NO_ENCODE_FORBIDDEN * flag is set or it's a file URI. Forbidden characters are always encoded - * for file schemes reguardless and forbidden characters are never encoded + * for file schemes regardless and forbidden characters are never encoded * for unknown scheme types. * * 2). For known scheme types '\\' are changed to '/'. @@ -2910,142 +2830,131 @@ static BOOL canonicalize_authority(const parse_data *data, Uri *uri, DWORD flags * file:///c:/test%20test -> file:///c:/test%20test * file:///c:/test%test -> file:///c:/test%25test */ -static BOOL canonicalize_path_hierarchical(const parse_data *data, Uri *uri, - DWORD flags, BOOL computeOnly) { +static DWORD canonicalize_path_hierarchical(const WCHAR *path, DWORD path_len, URL_SCHEME scheme_type, BOOL has_host, DWORD flags, + WCHAR *ret_path) { + const BOOL known_scheme = scheme_type != URL_SCHEME_UNKNOWN; + const BOOL is_file = scheme_type == URL_SCHEME_FILE; + const BOOL is_res = scheme_type == URL_SCHEME_RES; const WCHAR *ptr; - const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; - const BOOL is_file = data->scheme_type == URL_SCHEME_FILE; - const BOOL is_res = data->scheme_type == URL_SCHEME_RES; - BOOL escape_pct = FALSE; + DWORD len = 0; - if(!data->path) { - uri->path_start = -1; - uri->path_len = 0; - return TRUE; - } + if(!path) + return 0; - uri->path_start = uri->canon_len; - ptr = data->path; + ptr = path; - if(is_file && uri->host_start == -1) { + if(is_file && !has_host) { /* Check if a '/' needs to be appended for the file scheme. */ - if(data->path_len > 1 && is_drive_path(ptr) && !(flags & Uri_CREATE_FILE_USE_DOS_PATH)) { - if(!computeOnly) - uri->canon_uri[uri->canon_len] = '/'; - uri->canon_len++; + if(path_len > 1 && is_drive_path(ptr) && !(flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + if(ret_path) + ret_path[len] = '/'; + len++; escape_pct = TRUE; } else if(*ptr == '/') { if(!(flags & Uri_CREATE_FILE_USE_DOS_PATH)) { /* Copy the extra '/' over. */ - if(!computeOnly) - uri->canon_uri[uri->canon_len] = '/'; - ++uri->canon_len; + if(ret_path) + ret_path[len] = '/'; + len++; } ++ptr; } if(is_drive_path(ptr)) { - if(!computeOnly) { - uri->canon_uri[uri->canon_len] = *ptr; - /* If theres a '|' after the drive letter, convert it to a ':'. */ - uri->canon_uri[uri->canon_len+1] = ':'; + if(ret_path) { + ret_path[len] = *ptr; + /* If there's a '|' after the drive letter, convert it to a ':'. */ + ret_path[len+1] = ':'; } ptr += 2; - uri->canon_len += 2; + len += 2; } } - if(!is_file && *(data->path) && *(data->path) != '/') { + if(!is_file && *path && *path != '/') { /* Prepend a '/' to the path if it doesn't have one. */ - if(!computeOnly) - uri->canon_uri[uri->canon_len] = '/'; - ++uri->canon_len; + if(ret_path) + ret_path[len] = '/'; + len++; } - for(; ptr < data->path+data->path_len; ++ptr) { + for(; ptr < path+path_len; ++ptr) { BOOL do_default_action = TRUE; if(*ptr == '%' && !is_res) { const WCHAR *tmp = ptr; WCHAR val; - /* Check if the % represents a valid encoded char, or if it needs encoded. */ + /* Check if the % represents a valid encoded char, or if it needs encoding. */ BOOL force_encode = !check_pct_encoded(&tmp) && is_file && !(flags&Uri_CREATE_FILE_USE_DOS_PATH); val = decode_pct_val(ptr); if(force_encode || escape_pct) { /* Escape the percent sign in the file URI. */ - if(!computeOnly) - pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); - uri->canon_len += 3; + if(ret_path) + pct_encode_val(*ptr, ret_path+len); + len += 3; do_default_action = FALSE; } else if((is_unreserved(val) && known_scheme) || (is_file && (is_unreserved(val) || is_reserved(val) || (val && flags&Uri_CREATE_FILE_USE_DOS_PATH && !is_forbidden_dos_path_char(val))))) { - if(!computeOnly) - uri->canon_uri[uri->canon_len] = val; - ++uri->canon_len; + if(ret_path) + ret_path[len] = val; + len++; ptr += 2; continue; } } else if(*ptr == '/' && is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) { /* Convert the '/' back to a '\\'. */ - if(!computeOnly) - uri->canon_uri[uri->canon_len] = '\\'; - ++uri->canon_len; + if(ret_path) + ret_path[len] = '\\'; + len++; do_default_action = FALSE; } else if(*ptr == '\\' && known_scheme) { if(!(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH))) { /* Convert '\\' into a '/'. */ - if(!computeOnly) - uri->canon_uri[uri->canon_len] = '/'; - ++uri->canon_len; + if(ret_path) + ret_path[len] = '/'; + len++; do_default_action = FALSE; } } else if(known_scheme && !is_res && !is_unreserved(*ptr) && !is_reserved(*ptr) && (!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS) || is_file)) { if(!(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH))) { /* Escape the forbidden character. */ - if(!computeOnly) - pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); - uri->canon_len += 3; + if(ret_path) + pct_encode_val(*ptr, ret_path+len); + len += 3; do_default_action = FALSE; } } if(do_default_action) { - if(!computeOnly) - uri->canon_uri[uri->canon_len] = *ptr; - ++uri->canon_len; + if(ret_path) + ret_path[len] = *ptr; + len++; } } - uri->path_len = uri->canon_len - uri->path_start; - /* Removing the dot segments only happens when it's not in * computeOnly mode and it's not a wildcard scheme. File schemes * with USE_DOS_PATH set don't get dot segments removed. */ if(!(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) && - data->scheme_type != URL_SCHEME_WILDCARD) { - if(!(flags & Uri_CREATE_NO_CANONICALIZE) && !computeOnly) { + scheme_type != URL_SCHEME_WILDCARD) { + if(!(flags & Uri_CREATE_NO_CANONICALIZE) && ret_path) { /* Remove the dot segments (if any) and reset everything to the new * correct length. */ - DWORD new_len = remove_dot_segments(uri->canon_uri+uri->path_start, uri->path_len); - uri->canon_len -= uri->path_len-new_len; - uri->path_len = new_len; + len = remove_dot_segments(ret_path, len); } } - if(!computeOnly) - TRACE("Canonicalized path %s len=%d\n", - debugstr_wn(uri->canon_uri+uri->path_start, uri->path_len), - uri->path_len); - - return TRUE; + if(ret_path) + TRACE("Canonicalized path %s len=%d\n", debugstr_wn(ret_path, len), len); + return len; } /* Attempts to canonicalize the path for an opaque URI. @@ -3070,6 +2979,7 @@ static BOOL canonicalize_path_opaque(const parse_data *data, Uri *uri, DWORD fla const WCHAR *ptr; const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; const BOOL is_file = data->scheme_type == URL_SCHEME_FILE; + const BOOL is_mk = data->scheme_type == URL_SCHEME_MK; if(!data->path) { uri->path_start = -1; @@ -3079,6 +2989,21 @@ static BOOL canonicalize_path_opaque(const parse_data *data, Uri *uri, DWORD fla uri->path_start = uri->canon_len; + if(is_mk){ + /* hijack this flag for SCHEME_MK to tell the function when to start + * converting slashes */ + flags |= Uri_CREATE_FILE_USE_DOS_PATH; + } + + /* For javascript: URIs, simply copy path part without any canonicalization */ + if(data->scheme_type == URL_SCHEME_JAVASCRIPT) { + if(!computeOnly) + memcpy(uri->canon_uri+uri->canon_len, data->path, data->path_len*sizeof(WCHAR)); + uri->path_len = data->path_len; + uri->canon_len += data->path_len; + return TRUE; + } + /* Windows doesn't allow a "//" to appear after the scheme * of a URI, if it's an opaque URI. */ @@ -3112,13 +3037,15 @@ static BOOL canonicalize_path_opaque(const parse_data *data, Uri *uri, DWORD fla ++uri->canon_len; do_default_action = FALSE; } else if(*ptr == '\\') { - if(is_file && !(flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + if((data->is_relative || is_mk || is_file) && !(flags & Uri_CREATE_FILE_USE_DOS_PATH)) { /* Convert to a '/'. */ if(!computeOnly) uri->canon_uri[uri->canon_len] = '/'; ++uri->canon_len; do_default_action = FALSE; } + } else if(is_mk && *ptr == ':' && ptr + 1 < data->path + data->path_len && *(ptr + 1) == ':') { + flags &= ~Uri_CREATE_FILE_USE_DOS_PATH; } else if(known_scheme && !is_unreserved(*ptr) && !is_reserved(*ptr) && !(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS)) { if(!(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH))) { @@ -3136,7 +3063,7 @@ static BOOL canonicalize_path_opaque(const parse_data *data, Uri *uri, DWORD fla } } - if(data->scheme_type == URL_SCHEME_MK && !computeOnly && !(flags & Uri_CREATE_NO_CANONICALIZE)) { + if(is_mk && !computeOnly && !(flags & Uri_CREATE_NO_CANONICALIZE)) { DWORD new_len = remove_dot_segments(uri->canon_uri + uri->path_start, uri->canon_len - uri->path_start); uri->canon_len = uri->path_start + new_len; @@ -3166,6 +3093,9 @@ static BOOL canonicalize_hierpart(const parse_data *data, Uri *uri, DWORD flags, */ if((data->is_relative && (data->host || data->has_port)) || (!data->is_relative && data->scheme_type != URL_SCHEME_WILDCARD)) { + if(data->scheme_type == URL_SCHEME_WILDCARD) + FIXME("Here\n"); + if(!computeOnly) { INT pos = uri->canon_len; @@ -3182,8 +3112,13 @@ static BOOL canonicalize_hierpart(const parse_data *data, Uri *uri, DWORD flags, if(!canonicalize_path_opaque(data, uri, flags, computeOnly)) return FALSE; } else { - if(!canonicalize_path_hierarchical(data, uri, flags, computeOnly)) - return FALSE; + if(!computeOnly) + uri->path_start = uri->canon_len; + uri->path_len = canonicalize_path_hierarchical(data->path, data->path_len, data->scheme_type, data->host_len != 0, + flags, computeOnly ? NULL : uri->canon_uri+uri->canon_len); + uri->canon_len += uri->path_len; + if(!computeOnly && !uri->path_len) + uri->path_start = -1; } } else { /* Opaque URI's don't have an authority. */ @@ -3367,7 +3302,7 @@ static BOOL canonicalize_scheme(const parse_data *data, Uri *uri, DWORD flags, B uri->scheme_start = pos; TRACE("(%p %p %x): Canonicalized scheme=%s, len=%d.\n", data, uri, flags, - debugstr_wn(uri->canon_uri, uri->scheme_len), data->scheme_len); + debugstr_wn(uri->canon_uri+uri->scheme_start, data->scheme_len), data->scheme_len); } /* This happens in both computation modes. */ @@ -3377,7 +3312,7 @@ static BOOL canonicalize_scheme(const parse_data *data, Uri *uri, DWORD flags, B return TRUE; } -/* Compute's what the length of the URI specified by the parse_data will be +/* Computes what the length of the URI specified by the parse_data will be * after canonicalization occurs using the specified flags. * * This function will return a non-zero value indicating the length of the canonicalized @@ -3417,11 +3352,11 @@ static int compute_canonicalized_length(const parse_data *data, DWORD flags) { } /* Canonicalizes the URI data specified in the parse_data, using the given flags. If the - * canonicalization succeededs it will store all the canonicalization information + * canonicalization succeeds it will store all the canonicalization information * in the pointer to the Uri. * * To canonicalize a URI this function first computes what the length of the URI - * specified by the parse_data will be. Once this is done it will then perfom the actual + * specified by the parse_data will be. Once this is done it will then perform the actual * canonicalization of the URI. */ static HRESULT canonicalize_uri(const parse_data *data, Uri *uri, DWORD flags) { @@ -3473,7 +3408,7 @@ static HRESULT canonicalize_uri(const parse_data *data, Uri *uri, DWORD flags) { */ if(uri->canon_len < uri->canon_size) { /* This happens if the URI is hierarchical and dot - * segments were removed from it's path. + * segments were removed from its path. */ WCHAR *tmp = heap_realloc(uri->canon_uri, (uri->canon_len+1)*sizeof(WCHAR)); if(!tmp) @@ -3785,6 +3720,7 @@ static HRESULT validate_path(const UriBuilder *builder, parse_data *data, DWORD static const WCHAR nullW[] = {0}; ptr = nullW; check_len = FALSE; + expected_len = -1; } component = ptr; @@ -3798,7 +3734,7 @@ static HRESULT validate_path(const UriBuilder *builder, parse_data *data, DWORD if(!valid || (check_len && expected_len != data->path_len)) { TRACE("(%p %p %x): Invalid path component %s.\n", builder, data, flags, - debugstr_wn(component, check_len ? expected_len : -1) ); + debugstr_wn(component, expected_len) ); return INET_E_INVALID_URL; } @@ -3903,7 +3839,8 @@ static HRESULT validate_components(const UriBuilder *builder, parse_data *data, /* The URI is opaque if it doesn't have an authority component. */ if(!data->is_relative) - data->is_opaque = !data->username && !data->password && !data->host && !data->has_port; + data->is_opaque = !data->username && !data->password && !data->host && !data->has_port + && data->scheme_type != URL_SCHEME_FILE; else data->is_opaque = !data->host && !data->has_port; @@ -3924,6 +3861,150 @@ static HRESULT validate_components(const UriBuilder *builder, parse_data *data, return S_OK; } +static HRESULT compare_file_paths(const Uri *a, const Uri *b, BOOL *ret) +{ + WCHAR *canon_path_a, *canon_path_b; + DWORD len_a, len_b; + + if(!a->path_len) { + *ret = !b->path_len; + return S_OK; + } + + if(!b->path_len) { + *ret = FALSE; + return S_OK; + } + + /* Fast path */ + if(a->path_len == b->path_len && !memicmpW(a->canon_uri+a->path_start, b->canon_uri+b->path_start, a->path_len)) { + *ret = TRUE; + return S_OK; + } + + len_a = canonicalize_path_hierarchical(a->canon_uri+a->path_start, a->path_len, a->scheme_type, FALSE, 0, NULL); + len_b = canonicalize_path_hierarchical(b->canon_uri+b->path_start, b->path_len, b->scheme_type, FALSE, 0, NULL); + + canon_path_a = heap_alloc(len_a*sizeof(WCHAR)); + if(!canon_path_a) + return E_OUTOFMEMORY; + canon_path_b = heap_alloc(len_b*sizeof(WCHAR)); + if(!canon_path_b) { + heap_free(canon_path_a); + return E_OUTOFMEMORY; + } + + len_a = canonicalize_path_hierarchical(a->canon_uri+a->path_start, a->path_len, a->scheme_type, FALSE, 0, canon_path_a); + len_b = canonicalize_path_hierarchical(b->canon_uri+b->path_start, b->path_len, b->scheme_type, FALSE, 0, canon_path_b); + + *ret = len_a == len_b && !memicmpW(canon_path_a, canon_path_b, len_a); + + heap_free(canon_path_a); + heap_free(canon_path_b); + return S_OK; +} + +/* Checks if the two Uri's are logically equivalent. It's a simple + * comparison, since they are both of type Uri, and it can access + * the properties of each Uri directly without the need to go + * through the "IUri_Get*" interface calls. + */ +static HRESULT compare_uris(const Uri *a, const Uri *b, BOOL *ret) { + const BOOL known_scheme = a->scheme_type != URL_SCHEME_UNKNOWN; + const BOOL are_hierarchical = a->authority_start > -1 && b->authority_start > -1; + HRESULT hres; + + *ret = FALSE; + + if(a->scheme_type != b->scheme_type) + return S_OK; + + /* Only compare the scheme names (if any) if their unknown scheme types. */ + if(!known_scheme) { + if((a->scheme_start > -1 && b->scheme_start > -1) && + (a->scheme_len == b->scheme_len)) { + /* Make sure the schemes are the same. */ + if(StrCmpNW(a->canon_uri+a->scheme_start, b->canon_uri+b->scheme_start, a->scheme_len)) + return S_OK; + } else if(a->scheme_len != b->scheme_len) + /* One of the Uri's has a scheme name, while the other doesn't. */ + return S_OK; + } + + /* If they have a userinfo component, perform case sensitive compare. */ + if((a->userinfo_start > -1 && b->userinfo_start > -1) && + (a->userinfo_len == b->userinfo_len)) { + if(StrCmpNW(a->canon_uri+a->userinfo_start, b->canon_uri+b->userinfo_start, a->userinfo_len)) + return S_OK; + } else if(a->userinfo_len != b->userinfo_len) + /* One of the Uri's had a userinfo, while the other one doesn't. */ + return S_OK; + + /* Check if they have a host name. */ + if((a->host_start > -1 && b->host_start > -1) && + (a->host_len == b->host_len)) { + /* Perform a case insensitive compare if they are a known scheme type. */ + if(known_scheme) { + if(StrCmpNIW(a->canon_uri+a->host_start, b->canon_uri+b->host_start, a->host_len)) + return S_OK; + } else if(StrCmpNW(a->canon_uri+a->host_start, b->canon_uri+b->host_start, a->host_len)) + return S_OK; + } else if(a->host_len != b->host_len) + /* One of the Uri's had a host, while the other one didn't. */ + return S_OK; + + if(a->has_port && b->has_port) { + if(a->port != b->port) + return S_OK; + } else if(a->has_port || b->has_port) + /* One had a port, while the other one didn't. */ + return S_OK; + + /* Windows is weird with how it handles paths. For example + * One URI could be "http://google.com" (after canonicalization) + * and one could be "http://google.com/" and the IsEqual function + * would still evaluate to TRUE, but, only if they are both hierarchical + * URIs. + */ + if(a->scheme_type == URL_SCHEME_FILE) { + BOOL cmp; + + hres = compare_file_paths(a, b, &cmp); + if(FAILED(hres) || !cmp) + return hres; + } else if((a->path_start > -1 && b->path_start > -1) && + (a->path_len == b->path_len)) { + if(StrCmpNW(a->canon_uri+a->path_start, b->canon_uri+b->path_start, a->path_len)) + return S_OK; + } else if(are_hierarchical && a->path_len == -1 && b->path_len == 0) { + if(*(a->canon_uri+a->path_start) != '/') + return S_OK; + } else if(are_hierarchical && b->path_len == 1 && a->path_len == 0) { + if(*(b->canon_uri+b->path_start) != '/') + return S_OK; + } else if(a->path_len != b->path_len) + return S_OK; + + /* Compare the query strings of the two URIs. */ + if((a->query_start > -1 && b->query_start > -1) && + (a->query_len == b->query_len)) { + if(StrCmpNW(a->canon_uri+a->query_start, b->canon_uri+b->query_start, a->query_len)) + return S_OK; + } else if(a->query_len != b->query_len) + return S_OK; + + if((a->fragment_start > -1 && b->fragment_start > -1) && + (a->fragment_len == b->fragment_len)) { + if(StrCmpNW(a->canon_uri+a->fragment_start, b->canon_uri+b->fragment_start, a->fragment_len)) + return S_OK; + } else if(a->fragment_len != b->fragment_len) + return S_OK; + + /* If we get here, the two URIs are equivalent. */ + *ret = TRUE; + return S_OK; +} + static void convert_to_dos_path(const WCHAR *path, DWORD path_len, WCHAR *output, DWORD *output_len) { @@ -4116,7 +4197,7 @@ static inline Uri* impl_from_IUri(IUri *iface) return CONTAINING_RECORD(iface, Uri, IUri_iface); } -static inline void destory_uri_obj(Uri *This) +static inline void destroy_uri_obj(Uri *This) { SysFreeString(This->raw_uri); heap_free(This->canon_uri); @@ -4134,8 +4215,14 @@ static HRESULT WINAPI Uri_QueryInterface(IUri *iface, REFIID riid, void **ppv) TRACE("(%p)->(IID_IUri %p)\n", This, ppv); *ppv = &This->IUri_iface; }else if(IsEqualGUID(&IID_IUriBuilderFactory, riid)) { - TRACE("(%p)->(IID_IUriBuilderFactory %p)\n", This, riid); + TRACE("(%p)->(IID_IUriBuilderFactory %p)\n", This, ppv); *ppv = &This->IUriBuilderFactory_iface; + }else if(IsEqualGUID(&IID_IPersistStream, riid)) { + TRACE("(%p)->(IID_IPersistStream %p)\n", This, ppv); + *ppv = &This->IPersistStream_iface; + }else if(IsEqualGUID(&IID_IMarshal, riid)) { + TRACE("(%p)->(IID_IMarshal %p)\n", This, ppv); + *ppv = &This->IMarshal_iface; }else if(IsEqualGUID(&IID_IUriObj, riid)) { TRACE("(%p)->(IID_IUriObj %p)\n", This, ppv); *ppv = This; @@ -4168,7 +4255,7 @@ static ULONG WINAPI Uri_Release(IUri *iface) TRACE("(%p) ref=%d\n", This, ref); if(!ref) - destory_uri_obj(This); + destroy_uri_obj(This); return ref; } @@ -4177,8 +4264,10 @@ static HRESULT WINAPI Uri_GetPropertyBSTR(IUri *iface, Uri_PROPERTY uriProp, BST { Uri *This = impl_from_IUri(iface); HRESULT hres; - TRACE("(%p)->(%d %p %x)\n", This, uriProp, pbstrProperty, dwFlags); + TRACE("(%p %s)->(%d %p %x)\n", This, debugstr_w(This->canon_uri), uriProp, pbstrProperty, dwFlags); + if(!This->create_flags) + return E_UNEXPECTED; if(!pbstrProperty) return E_POINTER; @@ -4467,8 +4556,10 @@ static HRESULT WINAPI Uri_GetPropertyLength(IUri *iface, Uri_PROPERTY uriProp, D { Uri *This = impl_from_IUri(iface); HRESULT hres; - TRACE("(%p)->(%d %p %x)\n", This, uriProp, pcchProperty, dwFlags); + TRACE("(%p %s)->(%d %p %x)\n", This, debugstr_w(This->canon_uri), uriProp, pcchProperty, dwFlags); + if(!This->create_flags) + return E_UNEXPECTED; if(!pcchProperty) return E_INVALIDARG; @@ -4602,8 +4693,10 @@ static HRESULT WINAPI Uri_GetPropertyDWORD(IUri *iface, Uri_PROPERTY uriProp, DW Uri *This = impl_from_IUri(iface); HRESULT hres; - TRACE("(%p)->(%d %p %x)\n", This, uriProp, pcchProperty, dwFlags); + TRACE("(%p %s)->(%d %p %x)\n", This, debugstr_w(This->canon_uri), uriProp, pcchProperty, dwFlags); + if(!This->create_flags) + return E_UNEXPECTED; if(!pcchProperty) return E_INVALIDARG; @@ -4652,7 +4745,8 @@ static HRESULT WINAPI Uri_GetPropertyDWORD(IUri *iface, Uri_PROPERTY uriProp, DW static HRESULT WINAPI Uri_HasProperty(IUri *iface, Uri_PROPERTY uriProp, BOOL *pfHasProperty) { Uri *This = impl_from_IUri(iface); - TRACE("(%p)->(%d %p)\n", This, uriProp, pfHasProperty); + + TRACE("(%p %s)->(%d %p)\n", This, debugstr_w(This->canon_uri), uriProp, pfHasProperty); if(!pfHasProperty) return E_INVALIDARG; @@ -4843,8 +4937,10 @@ static HRESULT WINAPI Uri_GetZone(IUri *iface, DWORD *pdwZone) static HRESULT WINAPI Uri_GetProperties(IUri *iface, DWORD *pdwProperties) { Uri *This = impl_from_IUri(iface); - TRACE("(%p)->(%p)\n", This, pdwProperties); + TRACE("(%p %s)->(%p)\n", This, debugstr_w(This->canon_uri), pdwProperties); + if(!This->create_flags) + return E_UNEXPECTED; if(!pdwProperties) return E_INVALIDARG; @@ -4893,8 +4989,10 @@ static HRESULT WINAPI Uri_IsEqual(IUri *iface, IUri *pUri, BOOL *pfEqual) Uri *This = impl_from_IUri(iface); Uri *other; - TRACE("(%p)->(%p %p)\n", This, pUri, pfEqual); + TRACE("(%p %s)->(%p %p)\n", This, debugstr_w(This->canon_uri), pUri, pfEqual); + if(!This->create_flags) + return E_UNEXPECTED; if(!pfEqual) return E_POINTER; @@ -4906,15 +5004,13 @@ static HRESULT WINAPI Uri_IsEqual(IUri *iface, IUri *pUri, BOOL *pfEqual) } /* Try to convert it to a Uri (allows for a more simple comparison). */ - if((other = get_uri_obj(pUri))) - *pfEqual = are_equal_simple(This, other); - else { - /* Do it the hard way. */ + if(!(other = get_uri_obj(pUri))) { FIXME("(%p)->(%p %p) No support for unknown IUri's yet.\n", iface, pUri, pfEqual); return E_NOTIMPL; } - return S_OK; + TRACE("comparing to %s\n", debugstr_w(other->canon_uri)); + return compare_uris(This, other, pfEqual); } static const IUriVtbl UriVtbl = { @@ -4956,47 +5052,19 @@ static inline Uri* impl_from_IUriBuilderFactory(IUriBuilderFactory *iface) static HRESULT WINAPI UriBuilderFactory_QueryInterface(IUriBuilderFactory *iface, REFIID riid, void **ppv) { Uri *This = impl_from_IUriBuilderFactory(iface); - - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IUriBuilderFactory_iface; - }else if(IsEqualGUID(&IID_IUriBuilderFactory, riid)) { - TRACE("(%p)->(IID_IUriBuilderFactory %p)\n", This, ppv); - *ppv = &This->IUriBuilderFactory_iface; - }else if(IsEqualGUID(&IID_IUri, riid)) { - TRACE("(%p)->(IID_IUri %p)\n", This, ppv); - *ppv = &This->IUri_iface; - }else { - TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); - *ppv = NULL; - return E_NOINTERFACE; - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return IUri_QueryInterface(&This->IUri_iface, riid, ppv); } static ULONG WINAPI UriBuilderFactory_AddRef(IUriBuilderFactory *iface) { Uri *This = impl_from_IUriBuilderFactory(iface); - LONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) ref=%d\n", This, ref); - - return ref; + return IUri_AddRef(&This->IUri_iface); } static ULONG WINAPI UriBuilderFactory_Release(IUriBuilderFactory *iface) { Uri *This = impl_from_IUriBuilderFactory(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%d\n", This, ref); - - if(!ref) - destory_uri_obj(This); - - return ref; + return IUri_Release(&This->IUri_iface); } static HRESULT WINAPI UriBuilderFactory_CreateIUriBuilder(IUriBuilderFactory *iface, @@ -5045,15 +5113,553 @@ static const IUriBuilderFactoryVtbl UriBuilderFactoryVtbl = { UriBuilderFactory_CreateInitializedIUriBuilder }; -static Uri* create_uri_obj(void) { - Uri *ret = heap_alloc_zero(sizeof(Uri)); - if(ret) { - ret->IUri_iface.lpVtbl = &UriVtbl; - ret->IUriBuilderFactory_iface.lpVtbl = &UriBuilderFactoryVtbl; - ret->ref = 1; +static inline Uri* impl_from_IPersistStream(IPersistStream *iface) +{ + return CONTAINING_RECORD(iface, Uri, IPersistStream_iface); +} + +static HRESULT WINAPI PersistStream_QueryInterface(IPersistStream *iface, REFIID riid, void **ppvObject) +{ + Uri *This = impl_from_IPersistStream(iface); + return IUri_QueryInterface(&This->IUri_iface, riid, ppvObject); +} + +static ULONG WINAPI PersistStream_AddRef(IPersistStream *iface) +{ + Uri *This = impl_from_IPersistStream(iface); + return IUri_AddRef(&This->IUri_iface); +} + +static ULONG WINAPI PersistStream_Release(IPersistStream *iface) +{ + Uri *This = impl_from_IPersistStream(iface); + return IUri_Release(&This->IUri_iface); +} + +static HRESULT WINAPI PersistStream_GetClassID(IPersistStream *iface, CLSID *pClassID) +{ + Uri *This = impl_from_IPersistStream(iface); + TRACE("(%p)->(%p)\n", This, pClassID); + + if(!pClassID) + return E_INVALIDARG; + + *pClassID = CLSID_CUri; + return S_OK; +} + +static HRESULT WINAPI PersistStream_IsDirty(IPersistStream *iface) +{ + Uri *This = impl_from_IPersistStream(iface); + TRACE("(%p)\n", This); + return S_FALSE; +} + +struct persist_uri { + DWORD size; + DWORD unk1[2]; + DWORD create_flags; + DWORD unk2[3]; + DWORD fields_no; + BYTE data[1]; +}; + +static HRESULT WINAPI PersistStream_Load(IPersistStream *iface, IStream *pStm) +{ + Uri *This = impl_from_IPersistStream(iface); + struct persist_uri *data; + parse_data parse; + DWORD size; + HRESULT hr; + + TRACE("(%p)->(%p)\n", This, pStm); + + if(This->create_flags) + return E_UNEXPECTED; + if(!pStm) + return E_INVALIDARG; + + hr = IStream_Read(pStm, &size, sizeof(DWORD), NULL); + if(FAILED(hr)) + return hr; + data = heap_alloc(size); + if(!data) + return E_OUTOFMEMORY; + hr = IStream_Read(pStm, data->unk1, size-sizeof(DWORD)-2, NULL); + if(FAILED(hr)) { + heap_free(data); + return hr; } - return ret; + if(size < sizeof(struct persist_uri)) { + heap_free(data); + return S_OK; + } + + if(*(DWORD*)data->data != Uri_PROPERTY_RAW_URI) { + heap_free(data); + ERR("Can't find raw_uri\n"); + return E_UNEXPECTED; + } + + This->raw_uri = SysAllocString((WCHAR*)(data->data+sizeof(DWORD)*2)); + if(!This->raw_uri) { + heap_free(data); + return E_OUTOFMEMORY; + } + This->create_flags = data->create_flags; + heap_free(data); + TRACE("%x %s\n", This->create_flags, debugstr_w(This->raw_uri)); + + memset(&parse, 0, sizeof(parse_data)); + parse.uri = This->raw_uri; + if(!parse_uri(&parse, This->create_flags)) { + SysFreeString(This->raw_uri); + This->create_flags = 0; + return E_UNEXPECTED; + } + + hr = canonicalize_uri(&parse, This, This->create_flags); + if(FAILED(hr)) { + SysFreeString(This->raw_uri); + This->create_flags = 0; + return hr; + } + + return S_OK; +} + +static inline BYTE* persist_stream_add_strprop(Uri *This, BYTE *p, DWORD type, DWORD len, WCHAR *data) +{ + len *= sizeof(WCHAR); + *(DWORD*)p = type; + p += sizeof(DWORD); + *(DWORD*)p = len+sizeof(WCHAR); + p += sizeof(DWORD); + memcpy(p, data, len); + p += len; + *(WCHAR*)p = 0; + return p+sizeof(WCHAR); +} + +static inline void persist_stream_save(Uri *This, IStream *pStm, BOOL marshal, struct persist_uri *data) +{ + BYTE *p = NULL; + + data->create_flags = This->create_flags; + + if(This->create_flags) { + data->fields_no = 1; + p = persist_stream_add_strprop(This, data->data, Uri_PROPERTY_RAW_URI, + SysStringLen(This->raw_uri), This->raw_uri); + } + if(This->scheme_type!=URL_SCHEME_HTTP && This->scheme_type!=URL_SCHEME_HTTPS + && This->scheme_type!=URL_SCHEME_FTP) + return; + + if(This->fragment_len) { + data->fields_no++; + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_FRAGMENT, + This->fragment_len, This->canon_uri+This->fragment_start); + } + + if(This->host_len) { + data->fields_no++; + if(This->host_type == Uri_HOST_IPV6) + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_HOST, + This->host_len-2, This->canon_uri+This->host_start+1); + else + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_HOST, + This->host_len, This->canon_uri+This->host_start); + } + + if(This->userinfo_split > -1) { + data->fields_no++; + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_PASSWORD, + This->userinfo_len-This->userinfo_split-1, + This->canon_uri+This->userinfo_start+This->userinfo_split+1); + } + + if(This->path_len) { + data->fields_no++; + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_PATH, + This->path_len, This->canon_uri+This->path_start); + } else if(marshal) { + WCHAR no_path = '/'; + data->fields_no++; + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_PATH, 1, &no_path); + } + + if(This->has_port) { + data->fields_no++; + *(DWORD*)p = Uri_PROPERTY_PORT; + p += sizeof(DWORD); + *(DWORD*)p = sizeof(DWORD); + p += sizeof(DWORD); + *(DWORD*)p = This->port; + p += sizeof(DWORD); + } + + if(This->query_len) { + data->fields_no++; + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_QUERY, + This->query_len, This->canon_uri+This->query_start); + } + + if(This->scheme_len) { + data->fields_no++; + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_SCHEME_NAME, + This->scheme_len, This->canon_uri+This->scheme_start); + } + + if(This->userinfo_start>-1 && This->userinfo_split!=0) { + data->fields_no++; + if(This->userinfo_split > -1) + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_USER_NAME, + This->userinfo_split, This->canon_uri+This->userinfo_start); + else + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_USER_NAME, + This->userinfo_len, This->canon_uri+This->userinfo_start); + } +} + +static HRESULT WINAPI PersistStream_Save(IPersistStream *iface, IStream *pStm, BOOL fClearDirty) +{ + Uri *This = impl_from_IPersistStream(iface); + struct persist_uri *data; + ULARGE_INTEGER size; + HRESULT hres; + + TRACE("(%p)->(%p %x)\n", This, pStm, fClearDirty); + + if(!pStm) + return E_INVALIDARG; + + hres = IPersistStream_GetSizeMax(&This->IPersistStream_iface, &size); + if(FAILED(hres)) + return hres; + + data = heap_alloc_zero(size.u.LowPart); + if(!data) + return E_OUTOFMEMORY; + data->size = size.u.LowPart; + persist_stream_save(This, pStm, FALSE, data); + + hres = IStream_Write(pStm, data, data->size-2, NULL); + heap_free(data); + return hres; +} + +static HRESULT WINAPI PersistStream_GetSizeMax(IPersistStream *iface, ULARGE_INTEGER *pcbSize) +{ + Uri *This = impl_from_IPersistStream(iface); + TRACE("(%p)->(%p)\n", This, pcbSize); + + if(!pcbSize) + return E_INVALIDARG; + + pcbSize->u.LowPart = 2+sizeof(struct persist_uri); + pcbSize->u.HighPart = 0; + if(This->create_flags) + pcbSize->u.LowPart += (SysStringLen(This->raw_uri)+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + else /* there's no place for fields no */ + pcbSize->u.LowPart -= sizeof(DWORD); + if(This->scheme_type!=URL_SCHEME_HTTP && This->scheme_type!=URL_SCHEME_HTTPS + && This->scheme_type!=URL_SCHEME_FTP) + return S_OK; + + if(This->fragment_len) + pcbSize->u.LowPart += (This->fragment_len+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + if(This->host_len) { + if(This->host_type == Uri_HOST_IPV6) + pcbSize->u.LowPart += (This->host_len-1)*sizeof(WCHAR) + 2*sizeof(DWORD); + else + pcbSize->u.LowPart += (This->host_len+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + } + if(This->userinfo_split > -1) + pcbSize->u.LowPart += (This->userinfo_len-This->userinfo_split)*sizeof(WCHAR) + 2*sizeof(DWORD); + if(This->path_len) + pcbSize->u.LowPart += (This->path_len+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + if(This->has_port) + pcbSize->u.LowPart += 3*sizeof(DWORD); + if(This->query_len) + pcbSize->u.LowPart += (This->query_len+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + if(This->scheme_len) + pcbSize->u.LowPart += (This->scheme_len+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + if(This->userinfo_start>-1 && This->userinfo_split!=0) { + if(This->userinfo_split > -1) + pcbSize->u.LowPart += (This->userinfo_split+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + else + pcbSize->u.LowPart += (This->userinfo_len+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + } + return S_OK; +} + +static const IPersistStreamVtbl PersistStreamVtbl = { + PersistStream_QueryInterface, + PersistStream_AddRef, + PersistStream_Release, + PersistStream_GetClassID, + PersistStream_IsDirty, + PersistStream_Load, + PersistStream_Save, + PersistStream_GetSizeMax +}; + +static inline Uri* impl_from_IMarshal(IMarshal *iface) +{ + return CONTAINING_RECORD(iface, Uri, IMarshal_iface); +} + +static HRESULT WINAPI Marshal_QueryInterface(IMarshal *iface, REFIID riid, void **ppvObject) +{ + Uri *This = impl_from_IMarshal(iface); + return IUri_QueryInterface(&This->IUri_iface, riid, ppvObject); +} + +static ULONG WINAPI Marshal_AddRef(IMarshal *iface) +{ + Uri *This = impl_from_IMarshal(iface); + return IUri_AddRef(&This->IUri_iface); +} + +static ULONG WINAPI Marshal_Release(IMarshal *iface) +{ + Uri *This = impl_from_IMarshal(iface); + return IUri_Release(&This->IUri_iface); +} + +static HRESULT WINAPI Marshal_GetUnmarshalClass(IMarshal *iface, REFIID riid, void *pv, + DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, CLSID *pCid) +{ + Uri *This = impl_from_IMarshal(iface); + TRACE("(%p)->(%s %p %x %p %x %p)\n", This, debugstr_guid(riid), pv, + dwDestContext, pvDestContext, mshlflags, pCid); + + if(!pCid || (dwDestContext!=MSHCTX_LOCAL && dwDestContext!=MSHCTX_NOSHAREDMEM + && dwDestContext!=MSHCTX_INPROC)) + return E_INVALIDARG; + + *pCid = CLSID_CUri; + return S_OK; +} + +struct inproc_marshal_uri { + DWORD size; + DWORD mshlflags; + DWORD unk[4]; /* process identifier? */ + Uri *uri; +}; + +static HRESULT WINAPI Marshal_GetMarshalSizeMax(IMarshal *iface, REFIID riid, void *pv, + DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, DWORD *pSize) +{ + Uri *This = impl_from_IMarshal(iface); + ULARGE_INTEGER size; + HRESULT hres; + TRACE("(%p)->(%s %p %x %p %x %p)\n", This, debugstr_guid(riid), pv, + dwDestContext, pvDestContext, mshlflags, pSize); + + if(!pSize || (dwDestContext!=MSHCTX_LOCAL && dwDestContext!=MSHCTX_NOSHAREDMEM + && dwDestContext!=MSHCTX_INPROC)) + return E_INVALIDARG; + + if(dwDestContext == MSHCTX_INPROC) { + *pSize = sizeof(struct inproc_marshal_uri); + return S_OK; + } + + hres = IPersistStream_GetSizeMax(&This->IPersistStream_iface, &size); + if(FAILED(hres)) + return hres; + if(!This->path_len && (This->scheme_type==URL_SCHEME_HTTP + || This->scheme_type==URL_SCHEME_HTTPS + || This->scheme_type==URL_SCHEME_FTP)) + size.u.LowPart += 3*sizeof(DWORD); + *pSize = size.u.LowPart+2*sizeof(DWORD); + return S_OK; +} + +static HRESULT WINAPI Marshal_MarshalInterface(IMarshal *iface, IStream *pStm, REFIID riid, + void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags) +{ + Uri *This = impl_from_IMarshal(iface); + DWORD *data; + DWORD size; + HRESULT hres; + + TRACE("(%p)->(%p %s %p %x %p %x)\n", This, pStm, debugstr_guid(riid), pv, + dwDestContext, pvDestContext, mshlflags); + + if(!pStm || mshlflags!=MSHLFLAGS_NORMAL || (dwDestContext!=MSHCTX_LOCAL + && dwDestContext!=MSHCTX_NOSHAREDMEM && dwDestContext!=MSHCTX_INPROC)) + return E_INVALIDARG; + + if(dwDestContext == MSHCTX_INPROC) { + struct inproc_marshal_uri data; + + data.size = sizeof(data); + data.mshlflags = MSHCTX_INPROC; + data.unk[0] = 0; + data.unk[1] = 0; + data.unk[2] = 0; + data.unk[3] = 0; + data.uri = This; + + hres = IStream_Write(pStm, &data, data.size, NULL); + if(FAILED(hres)) + return hres; + + IUri_AddRef(&This->IUri_iface); + return S_OK; + } + + hres = IMarshal_GetMarshalSizeMax(iface, riid, pv, dwDestContext, + pvDestContext, mshlflags, &size); + if(FAILED(hres)) + return hres; + + data = heap_alloc_zero(size); + if(!data) + return E_OUTOFMEMORY; + + data[0] = size; + data[1] = dwDestContext; + data[2] = size-2*sizeof(DWORD); + persist_stream_save(This, pStm, TRUE, (struct persist_uri*)(data+2)); + + hres = IStream_Write(pStm, data, data[0]-2, NULL); + heap_free(data); + return hres; +} + +static HRESULT WINAPI Marshal_UnmarshalInterface(IMarshal *iface, + IStream *pStm, REFIID riid, void **ppv) +{ + Uri *This = impl_from_IMarshal(iface); + DWORD header[2]; + HRESULT hres; + + TRACE("(%p)->(%p %s %p)\n", This, pStm, debugstr_guid(riid), ppv); + + if(This->create_flags) + return E_UNEXPECTED; + if(!pStm || !riid || !ppv) + return E_INVALIDARG; + + hres = IStream_Read(pStm, header, sizeof(header), NULL); + if(FAILED(hres)) + return hres; + + if(header[1]!=MSHCTX_LOCAL && header[1]!=MSHCTX_NOSHAREDMEM + && header[1]!=MSHCTX_INPROC) + return E_UNEXPECTED; + + if(header[1] == MSHCTX_INPROC) { + struct inproc_marshal_uri data; + parse_data parse; + + hres = IStream_Read(pStm, data.unk, sizeof(data)-2*sizeof(DWORD), NULL); + if(FAILED(hres)) + return hres; + + This->raw_uri = SysAllocString(data.uri->raw_uri); + if(!This->raw_uri) { + return E_OUTOFMEMORY; + } + + memset(&parse, 0, sizeof(parse_data)); + parse.uri = This->raw_uri; + + if(!parse_uri(&parse, data.uri->create_flags)) + return E_INVALIDARG; + + hres = canonicalize_uri(&parse, This, data.uri->create_flags); + if(FAILED(hres)) + return hres; + + This->create_flags = data.uri->create_flags; + IUri_Release(&data.uri->IUri_iface); + + return IUri_QueryInterface(&This->IUri_iface, riid, ppv); + } + + hres = IPersistStream_Load(&This->IPersistStream_iface, pStm); + if(FAILED(hres)) + return hres; + + return IUri_QueryInterface(&This->IUri_iface, riid, ppv); +} + +static HRESULT WINAPI Marshal_ReleaseMarshalData(IMarshal *iface, IStream *pStm) +{ + Uri *This = impl_from_IMarshal(iface); + LARGE_INTEGER off; + DWORD header[2]; + HRESULT hres; + + TRACE("(%p)->(%p)\n", This, pStm); + + if(!pStm) + return E_INVALIDARG; + + hres = IStream_Read(pStm, header, 2*sizeof(DWORD), NULL); + if(FAILED(hres)) + return hres; + + if(header[1] == MSHCTX_INPROC) { + struct inproc_marshal_uri data; + + hres = IStream_Read(pStm, data.unk, sizeof(data)-2*sizeof(DWORD), NULL); + if(FAILED(hres)) + return hres; + + IUri_Release(&data.uri->IUri_iface); + return S_OK; + } + + off.u.LowPart = header[0]-sizeof(header)-2; + off.u.HighPart = 0; + return IStream_Seek(pStm, off, STREAM_SEEK_CUR, NULL); +} + +static HRESULT WINAPI Marshal_DisconnectObject(IMarshal *iface, DWORD dwReserved) +{ + Uri *This = impl_from_IMarshal(iface); + TRACE("(%p)->(%x)\n", This, dwReserved); + return S_OK; +} + +static const IMarshalVtbl MarshalVtbl = { + Marshal_QueryInterface, + Marshal_AddRef, + Marshal_Release, + Marshal_GetUnmarshalClass, + Marshal_GetMarshalSizeMax, + Marshal_MarshalInterface, + Marshal_UnmarshalInterface, + Marshal_ReleaseMarshalData, + Marshal_DisconnectObject +}; + +HRESULT Uri_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) +{ + Uri *ret = heap_alloc_zero(sizeof(Uri)); + + TRACE("(%p %p)\n", pUnkOuter, ppobj); + + *ppobj = ret; + if(!ret) + return E_OUTOFMEMORY; + + ret->IUri_iface.lpVtbl = &UriVtbl; + ret->IUriBuilderFactory_iface.lpVtbl = &UriBuilderFactoryVtbl; + ret->IPersistStream_iface.lpVtbl = &PersistStreamVtbl; + ret->IMarshal_iface.lpVtbl = &MarshalVtbl; + ret->ref = 1; + + *ppobj = &ret->IUri_iface; + return S_OK; } /*********************************************************************** @@ -5071,8 +5677,8 @@ static Uri* create_uri_obj(void) { * * RETURNS * Success: Returns S_OK. ppURI contains the pointer to the newly allocated IUri. - * Failure: E_INVALIDARG if there's invalid flag combinations in dwFlags, or an - * invalid parameters, or pwzURI doesn't represnt a valid URI. + * Failure: E_INVALIDARG if there are invalid flag combinations in dwFlags, or an + * invalid parameter, or pwzURI doesn't represent a valid URI. * E_OUTOFMEMORY if any memory allocation fails. * * NOTES @@ -5096,7 +5702,7 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU if(!ppURI) return E_INVALIDARG; - if(!pwzURI || !*pwzURI) { + if(!pwzURI) { *ppURI = NULL; return E_INVALIDARG; } @@ -5111,10 +5717,10 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU if(dwFlags & ~supported_flags) FIXME("Ignoring unsupported flag(s) %x\n", dwFlags & ~supported_flags); - ret = create_uri_obj(); - if(!ret) { + hr = Uri_Construct(NULL, (void**)&ret); + if(FAILED(hr)) { *ppURI = NULL; - return E_OUTOFMEMORY; + return hr; } /* Explicitly set the default flags if it doesn't cause a flag conflict. */ @@ -5134,7 +5740,7 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU memset(&data, 0, sizeof(parse_data)); data.uri = ret->raw_uri; - /* Validate and parse the URI into it's components. */ + /* Validate and parse the URI into its components. */ if(!parse_uri(&data, dwFlags)) { /* Encountered an unsupported or invalid URI */ IUri_Release(&ret->IUri_iface); @@ -5164,7 +5770,7 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU * * PARAMS * pwzURI [I] The URI to parse and perform canonicalization on. - * pwzFragment [I] The explict fragment string which should be added to pwzURI. + * pwzFragment [I] The explicit fragment string which should be added to pwzURI. * dwFlags [I] The flags which will be passed to CreateUri. * dwReserved [I] Reserved (not used). * ppURI [O] The resulting IUri after parsing/canonicalization. @@ -5173,7 +5779,7 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU * Success: S_OK. ppURI contains the pointer to the newly allocated IUri. * Failure: E_INVALIDARG if pwzURI already contains a fragment and pwzFragment * isn't NULL. Will also return E_INVALIDARG for the same reasons as - * CreateUri will. E_OUTOFMEMORY if any allocations fail. + * CreateUri will. E_OUTOFMEMORY if any allocation fails. */ HRESULT WINAPI CreateUriWithFragment(LPCWSTR pwzURI, LPCWSTR pwzFragment, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI) @@ -5271,10 +5877,10 @@ static HRESULT build_uri(const UriBuilder *builder, IUri **uri, DWORD create_fla return hr; } - ret = create_uri_obj(); - if(!ret) { + hr = Uri_Construct(NULL, (void**)&ret); + if(FAILED(hr)) { *uri = NULL; - return E_OUTOFMEMORY; + return hr; } hr = generate_uri(builder, &data, ret, create_flags); @@ -5753,6 +6359,10 @@ HRESULT WINAPI CreateIUriBuilder(IUri *pIUri, DWORD dwFlags, DWORD_PTR dwReserve Uri *uri; if((uri = get_uri_obj(pIUri))) { + if(!uri->create_flags) { + heap_free(ret); + return E_UNEXPECTED; + } IUri_AddRef(pIUri); ret->uri = uri; @@ -5784,13 +6394,25 @@ static HRESULT merge_paths(parse_data *data, const WCHAR *base, DWORD base_len, WCHAR *ptr; if(base_len) { - /* Find the characters the will be copied over from - * the base path. - */ - end = memrchrW(base, '/', base_len); - if(!end && data->scheme_type == URL_SCHEME_FILE) - /* Try looking for a '\\'. */ - end = memrchrW(base, '\\', base_len); + if(data->scheme_type == URL_SCHEME_MK && *relative == '/') { + /* Find '::' segment */ + for(end = base; end < base+base_len-1; end++) { + if(end[0] == ':' && end[1] == ':') { + end++; + break; + } + } + + /* If not found, try finding the end of @xxx: */ + if(end == base+base_len-1) + end = *base == '@' ? memchr(base, ':', base_len) : NULL; + }else { + /* Find the characters that will be copied over from the base path. */ + end = memrchrW(base, '/', base_len); + if(!end && data->scheme_type == URL_SCHEME_FILE) + /* Try looking for a '\\'. */ + end = memrchrW(base, '\\', base_len); + } } if(end) { @@ -5815,6 +6437,7 @@ static HRESULT merge_paths(parse_data *data, const WCHAR *base, DWORD base_len, *ptr = '\0'; *result_len = (ptr-*result); + TRACE("ret %s\n", debugstr_wn(*result, *result_len)); return S_OK; } @@ -5822,6 +6445,7 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result, Uri *ret; HRESULT hr; parse_data data; + Uri *proc_uri = base; DWORD create_flags = 0, len = 0; memset(&data, 0, sizeof(parse_data)); @@ -5839,10 +6463,10 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result, parse_uri(&data, 0); - ret = create_uri_obj(); - if(!ret) { + hr = Uri_Construct(NULL, (void**)&ret); + if(FAILED(hr)) { *result = NULL; - return E_OUTOFMEMORY; + return hr; } if(extras & COMBINE_URI_FORCE_FLAG_USE) { @@ -5878,35 +6502,38 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result, create_flags |= Uri_CREATE_ALLOW_RELATIVE; } - if(base->authority_start > -1) { - if(base->userinfo_start > -1 && base->userinfo_split != 0) { - data.username = base->canon_uri+base->userinfo_start; - data.username_len = (base->userinfo_split > -1) ? base->userinfo_split : base->userinfo_len; + if(relative->authority_start > -1) + proc_uri = relative; + + if(proc_uri->authority_start > -1) { + if(proc_uri->userinfo_start > -1 && proc_uri->userinfo_split != 0) { + data.username = proc_uri->canon_uri+proc_uri->userinfo_start; + data.username_len = (proc_uri->userinfo_split > -1) ? proc_uri->userinfo_split : proc_uri->userinfo_len; } - if(base->userinfo_split > -1) { - data.password = base->canon_uri+base->userinfo_start+base->userinfo_split+1; - data.password_len = base->userinfo_len-base->userinfo_split-1; + if(proc_uri->userinfo_split > -1) { + data.password = proc_uri->canon_uri+proc_uri->userinfo_start+proc_uri->userinfo_split+1; + data.password_len = proc_uri->userinfo_len-proc_uri->userinfo_split-1; } - if(base->host_start > -1) { - data.host = base->canon_uri+base->host_start; - data.host_len = base->host_len; - data.host_type = base->host_type; + if(proc_uri->host_start > -1) { + data.host = proc_uri->canon_uri+proc_uri->host_start; + data.host_len = proc_uri->host_len; + data.host_type = proc_uri->host_type; } - if(base->has_port) { + if(proc_uri->has_port) { data.has_port = TRUE; - data.port_value = base->port; + data.port_value = proc_uri->port; } } else if(base->scheme_type != URL_SCHEME_FILE) data.is_opaque = TRUE; - if(relative->path_start == -1 || !relative->path_len) { - if(base->path_start > -1) { - data.path = base->canon_uri+base->path_start; - data.path_len = base->path_len; - } else if((base->path_start == -1 || !base->path_len) && !data.is_opaque) { + if(proc_uri == relative || relative->path_start == -1 || !relative->path_len) { + if(proc_uri->path_start > -1) { + data.path = proc_uri->canon_uri+proc_uri->path_start; + data.path_len = proc_uri->path_len; + } else if(!data.is_opaque) { /* Just set the path as a '/' if the base didn't have * one and if it's an hierarchical URI. */ @@ -5915,12 +6542,12 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result, data.path_len = 1; } - if(relative->query_start > -1) { - data.query = relative->canon_uri+relative->query_start; - data.query_len = relative->query_len; - } else if(base->query_start > -1) { - data.query = base->canon_uri+base->query_start; - data.query_len = base->query_len; + if(relative->query_start > -1) + proc_uri = relative; + + if(proc_uri->query_start > -1) { + data.query = proc_uri->canon_uri+proc_uri->query_start; + data.query_len = proc_uri->query_len; } } else { const WCHAR *ptr, **pptr; @@ -5932,7 +6559,7 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result, * relative path doesn't begin with a '/' then the base path and relative * path are merged together. */ - if(relative->path_len && *(relative->canon_uri+relative->path_start) == '/') { + if(relative->path_len && *(relative->canon_uri+relative->path_start) == '/' && data.scheme_type != URL_SCHEME_MK) { WCHAR *tmp = NULL; BOOL copy_drive_path = FALSE; @@ -6043,12 +6670,12 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result, generate_raw_uri(&data, data.uri, raw_flags); - ret = create_uri_obj(); - if(!ret) { + hr = Uri_Construct(NULL, (void**)&ret); + if(FAILED(hr)) { SysFreeString(data.uri); heap_free(path); *result = NULL; - return E_OUTOFMEMORY; + return hr; } if(flags & URL_DONT_SIMPLIFY) @@ -6279,7 +6906,7 @@ static HRESULT parse_canonicalize(const Uri *uri, DWORD flags, LPWSTR output, buffer[len++] = 0; - /* The null terminator isn't included the length. */ + /* The null terminator isn't included in the length. */ *result_len = len-1; if(len > output_len) return STRSAFE_E_INSUFFICIENT_BUFFER; diff --git a/dll/win32/urlmon/urlmon.rc b/dll/win32/urlmon/urlmon.rc new file mode 100644 index 00000000000..21492b614f7 --- /dev/null +++ b/dll/win32/urlmon/urlmon.rc @@ -0,0 +1,67 @@ +/* + * Copyright 2005 Jacek Caban + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include + +#include "resource.h" + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +ID_AXINSTALL_WARNING_DLG DIALOG 0, 0, 260, 115 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Security Warning" +FONT 8, "MS Shell Dlg" +{ + CONTROL "Do you want to install this software?", + 100, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 10, 10, 240, 23 + CONTROL "Location:", 101, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 10, 26, 40, 13 + CONTROL "", ID_AXINSTALL_LOCATION, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 50, 26, 200, 13 + DEFPUSHBUTTON "Don't install", IDCANCEL, 200, 48, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "", ID_AXINSTALL_INSTALL_BTN, 144, 48, 50, 14, WS_GROUP | WS_TABSTOP | WS_DISABLED + CONTROL "", 102, "static", SS_ETCHEDHORZ, 10, 70, 240, 1 + ICON "", ID_AXINSTALL_ICON, 10, 82, 32, 32, WS_CHILD | WS_VISIBLE + CONTROL "When installed, an ActiveX component has full access to your computer. Do not click install unless you have absolute trust in the above source.", + 22002, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 46, 80, 194, 23 +} + +STRINGTABLE +{ + IDS_AXINSTALL_FAILURE "Installation of component failed: %08x" + IDS_AXINSTALL_INSTALLN "Install (%d)" + IDS_AXINSTALL_INSTALL "Install" +} + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +/* @makedep: urlmon.rgs */ +1 WINE_REGISTRY urlmon.rgs + +2 WINE_REGISTRY urlmon_urlmon.rgs + +/* @makedep: urlmon.inf */ +REGINST REGINST urlmon.inf + +#define WINE_FILENAME_STR "urlmon.dll" +#define WINE_FILEVERSION 6,0,2800,1485 +#define WINE_FILEVERSION_STR "6.0.2800.1485" +#define WINE_PRODUCTVERSION 6,0,2800,1485 +#define WINE_PRODUCTVERSION_STR "6.0.2800.1485" + +#include "wine/wine_common_ver.rc" diff --git a/dll/win32/urlmon/urlmon.spec b/dll/win32/urlmon/urlmon.spec index 58b3f330f59..e66fff786f3 100644 --- a/dll/win32/urlmon/urlmon.spec +++ b/dll/win32/urlmon/urlmon.spec @@ -10,7 +10,7 @@ @ stdcall BindAsyncMoniker(ptr long ptr ptr ptr) @ stdcall CoGetClassObjectFromURL(ptr wstr long long wstr ptr long ptr ptr ptr) @ stub CoInstall -@ stdcall CoInternetCombineUrl(wstr wstr long wstr long ptr long) +@ stdcall CoInternetCombineUrl(wstr wstr long ptr long ptr long) @ stdcall CoInternetCombineUrlEx(ptr wstr long ptr long) @ stdcall CoInternetCompareUrl(wstr wstr long) @ stdcall CoInternetCombineIUri(ptr ptr long ptr long) @@ -21,12 +21,14 @@ @ stdcall CoInternetGetSecurityUrlEx(ptr ptr long long) @ stdcall CoInternetGetSession(long ptr long) @ stdcall CoInternetIsFeatureEnabled(long long) +@ stdcall CoInternetIsFeatureEnabledForUrl(long long wstr ptr) +@ stdcall CoInternetIsFeatureZoneElevationEnabled(wstr wstr ptr long) @ stdcall CoInternetParseUrl(wstr long long wstr long ptr long) @ stdcall CoInternetParseIUri(ptr long long wstr long ptr long) @ stdcall CoInternetQueryInfo(ptr long long ptr long ptr long) @ stdcall CoInternetSetFeatureEnabled(long long long) -@ stub CompareSecurityIds -@ stub CopyBindInfo +@ stdcall CompareSecurityIds(ptr long ptr long long) +@ stdcall CopyBindInfo(ptr ptr) @ stdcall CopyStgMedium(ptr ptr) @ stdcall CreateAsyncBindCtx(long ptr ptr ptr) @ stdcall CreateAsyncBindCtxEx(ptr long ptr ptr ptr long) @@ -36,6 +38,7 @@ @ stdcall CreateUriWithFragment(wstr wstr long long ptr) @ stdcall CreateURLMoniker(ptr wstr ptr) @ stdcall CreateURLMonikerEx(ptr wstr ptr long) +@ stdcall CreateURLMonikerEx2(ptr ptr ptr long) @ stdcall -private DllCanUnloadNow() @ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall -private DllInstall(long wstr) @@ -69,7 +72,7 @@ @ stdcall RegisterBindStatusCallback(ptr ptr ptr long) @ stdcall RegisterFormatEnumerator(ptr ptr long) @ stub RegisterMediaTypeClass -@ stub RegisterMediaTypes +@ stdcall RegisterMediaTypes(long ptr ptr) @ stdcall ReleaseBindInfo(ptr) @ stdcall RevokeBindStatusCallback(ptr ptr) @ stdcall RevokeFormatEnumerator(ptr ptr) @@ -92,5 +95,17 @@ @ stub WriteHitLogging @ stub ZonesReInit -410 stdcall @(long long) URLMON_410 -423 stdcall @(long long long long) URLMON_423 +111 stdcall @(wstr) IsProtectedModeURL +328 stdcall @(ptr ptr) propsys.VariantCompare +329 stdcall @(ptr ptr) propsys.VariantToGUID +331 stdcall @(ptr long ptr) propsys.InitPropVariantFromBuffer +335 stdcall @(ptr long ptr) propsys.InitVariantFromBuffer +350 stdcall @(ptr ptr) propsys.PropVariantToGUID +362 stdcall @(ptr ptr) propsys.InitVariantFromGUIDAsString +363 stdcall @(long long ptr) propsys.InitVariantFromResource +387 stdcall @(ptr long) propsys.VariantToUInt32WithDefault +410 stdcall @(long long) LogSqmBits +423 stdcall @(long long long long) LogSqmUXCommandOffsetInternal +444 stdcall @(long long long) MapUriToBrowserEmulationState +445 stdcall @(long long) MapBrowserEmulationModeToUserAgent +455 stdcall @() FlushUrlmonZonesCache diff --git a/dll/win32/urlmon/urlmon_main.c b/dll/win32/urlmon/urlmon_main.c index af5d87a4991..4a81d13ab9a 100644 --- a/dll/win32/urlmon/urlmon_main.c +++ b/dll/win32/urlmon/urlmon_main.c @@ -27,19 +27,23 @@ #define NO_SHLWAPI_REG //#include "shlwapi.h" #include +#include #include -//#include "urlmon.h" +#include "urlmon.h" WINE_DEFAULT_DEBUG_CHANNEL(urlmon); +DEFINE_GUID(CLSID_CUri, 0xDF2FCE13, 0x25EC, 0x45BB, 0x9D,0x4C, 0xCE,0xCD,0x47,0xC2,0x43,0x0C); + LONG URLMON_refCount = 0; +HINSTANCE urlmon_instance; static HMODULE hCabinet = NULL; static DWORD urlmon_tls = TLS_OUT_OF_INDEXES; -static void init_session(BOOL); +static void init_session(void); static struct list tls_list = LIST_INIT(tls_list); @@ -133,7 +137,6 @@ static void process_detach(void) if (hCabinet) FreeLibrary(hCabinet); - init_session(FALSE); free_session(); free_tls_list(); } @@ -149,11 +152,13 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) switch(fdwReason) { case DLL_PROCESS_ATTACH: - init_session(TRUE); + urlmon_instance = hinstDLL; + init_session(); break; case DLL_PROCESS_DETACH: process_detach(); + DeleteCriticalSection(&tls_cs); break; case DLL_THREAD_DETACH: @@ -163,6 +168,67 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) return TRUE; } +const char *debugstr_bindstatus(ULONG status) +{ + switch(status) { +#define X(x) case x: return #x + X(BINDSTATUS_FINDINGRESOURCE); + X(BINDSTATUS_CONNECTING); + X(BINDSTATUS_REDIRECTING); + X(BINDSTATUS_BEGINDOWNLOADDATA); + X(BINDSTATUS_DOWNLOADINGDATA); + X(BINDSTATUS_ENDDOWNLOADDATA); + X(BINDSTATUS_BEGINDOWNLOADCOMPONENTS); + X(BINDSTATUS_INSTALLINGCOMPONENTS); + X(BINDSTATUS_ENDDOWNLOADCOMPONENTS); + X(BINDSTATUS_USINGCACHEDCOPY); + X(BINDSTATUS_SENDINGREQUEST); + X(BINDSTATUS_CLASSIDAVAILABLE); + X(BINDSTATUS_MIMETYPEAVAILABLE); + X(BINDSTATUS_CACHEFILENAMEAVAILABLE); + X(BINDSTATUS_BEGINSYNCOPERATION); + X(BINDSTATUS_ENDSYNCOPERATION); + X(BINDSTATUS_BEGINUPLOADDATA); + X(BINDSTATUS_UPLOADINGDATA); + X(BINDSTATUS_ENDUPLOADINGDATA); + X(BINDSTATUS_PROTOCOLCLASSID); + X(BINDSTATUS_ENCODING); + X(BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE); + X(BINDSTATUS_CLASSINSTALLLOCATION); + X(BINDSTATUS_DECODING); + X(BINDSTATUS_LOADINGMIMEHANDLER); + X(BINDSTATUS_CONTENTDISPOSITIONATTACH); + X(BINDSTATUS_FILTERREPORTMIMETYPE); + X(BINDSTATUS_CLSIDCANINSTANTIATE); + X(BINDSTATUS_IUNKNOWNAVAILABLE); + X(BINDSTATUS_DIRECTBIND); + X(BINDSTATUS_RAWMIMETYPE); + X(BINDSTATUS_PROXYDETECTING); + X(BINDSTATUS_ACCEPTRANGES); + X(BINDSTATUS_COOKIE_SENT); + X(BINDSTATUS_COMPACT_POLICY_RECEIVED); + X(BINDSTATUS_COOKIE_SUPPRESSED); + X(BINDSTATUS_COOKIE_STATE_UNKNOWN); + X(BINDSTATUS_COOKIE_STATE_ACCEPT); + X(BINDSTATUS_COOKIE_STATE_REJECT); + X(BINDSTATUS_COOKIE_STATE_PROMPT); + X(BINDSTATUS_COOKIE_STATE_LEASH); + X(BINDSTATUS_COOKIE_STATE_DOWNGRADE); + X(BINDSTATUS_POLICY_HREF); + X(BINDSTATUS_P3P_HEADER); + X(BINDSTATUS_SESSION_COOKIE_RECEIVED); + X(BINDSTATUS_PERSISTENT_COOKIE_RECEIVED); + X(BINDSTATUS_SESSION_COOKIES_ALLOWED); + X(BINDSTATUS_CACHECONTROL); + X(BINDSTATUS_CONTENTDISPOSITIONFILENAME); + X(BINDSTATUS_MIMETEXTPLAINMISMATCH); + X(BINDSTATUS_PUBLISHERAVAILABLE); + X(BINDSTATUS_DISPLAYNAMEAVAILABLE); +#undef X + default: + return wine_dbg_sprintf("(invalid status %u)", status); + } +} /*********************************************************************** * DllInstall (URLMON.@) @@ -291,6 +357,8 @@ static ClassFactory StdURLMonikerCF = { { &ClassFactoryVtbl }, StdURLMoniker_Construct}; static ClassFactory MimeFilterCF = { { &ClassFactoryVtbl }, MimeFilter_Construct}; +static ClassFactory CUriCF = + { { &ClassFactoryVtbl }, Uri_Construct}; struct object_creation_info { @@ -317,18 +385,18 @@ static const struct object_creation_info object_creation[] = { &CLSID_InternetSecurityManager, &SecurityManagerCF.IClassFactory_iface, NULL }, { &CLSID_InternetZoneManager, &ZoneManagerCF.IClassFactory_iface, NULL }, { &CLSID_StdURLMoniker, &StdURLMonikerCF.IClassFactory_iface, NULL }, - { &CLSID_DeCompMimeFilter, &MimeFilterCF.IClassFactory_iface, NULL } + { &CLSID_DeCompMimeFilter, &MimeFilterCF.IClassFactory_iface, NULL }, + { &CLSID_CUri, &CUriCF.IClassFactory_iface, NULL } }; -static void init_session(BOOL init) +static void init_session(void) { unsigned int i; for(i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++) { - if(object_creation[i].protocol) - register_urlmon_namespace(object_creation[i].cf, object_creation[i].clsid, - object_creation[i].protocol, init); + register_namespace(object_creation[i].cf, object_creation[i].clsid, + object_creation[i].protocol, TRUE); } } @@ -526,6 +594,8 @@ HRESULT WINAPI CopyStgMedium(const STGMEDIUM *src, STGMEDIUM *dst) if(src->u.lpszFileName && !src->pUnkForRelease) { DWORD size = (strlenW(src->u.lpszFileName)+1)*sizeof(WCHAR); dst->u.lpszFileName = CoTaskMemAlloc(size); + if(!dst->u.lpszFileName) + return E_OUTOFMEMORY; memcpy(dst->u.lpszFileName, src->u.lpszFileName, size); } break; @@ -537,6 +607,21 @@ HRESULT WINAPI CopyStgMedium(const STGMEDIUM *src, STGMEDIUM *dst) if(dst->u.pstg) IStorage_AddRef(dst->u.pstg); break; + case TYMED_HGLOBAL: + if(dst->u.hGlobal) { + SIZE_T size = GlobalSize(src->u.hGlobal); + char *src_ptr, *dst_ptr; + + dst->u.hGlobal = GlobalAlloc(GMEM_FIXED, size); + if(!dst->u.hGlobal) + return E_OUTOFMEMORY; + dst_ptr = GlobalLock(dst->u.hGlobal); + src_ptr = GlobalLock(src->u.hGlobal); + memcpy(dst_ptr, src_ptr, size); + GlobalUnlock(src_ptr); + GlobalUnlock(dst_ptr); + } + break; default: FIXME("Unimplemented tymed %d\n", src->tymed); } @@ -547,6 +632,70 @@ HRESULT WINAPI CopyStgMedium(const STGMEDIUM *src, STGMEDIUM *dst) return S_OK; } +/*********************************************************************** + * CopyBindInfo (URLMON.@) + */ +HRESULT WINAPI CopyBindInfo(const BINDINFO *pcbiSrc, BINDINFO *pcbiDest) +{ + DWORD size; + HRESULT hres; + + TRACE("(%p %p)\n", pcbiSrc, pcbiDest); + + if(!pcbiSrc || !pcbiDest) + return E_POINTER; + if(!pcbiSrc->cbSize || !pcbiDest->cbSize) + return E_INVALIDARG; + + size = pcbiDest->cbSize; + if(size > pcbiSrc->cbSize) { + memcpy(pcbiDest, pcbiSrc, pcbiSrc->cbSize); + memset((char*)pcbiDest+pcbiSrc->cbSize, 0, size-pcbiSrc->cbSize); + } else { + memcpy(pcbiDest, pcbiSrc, size); + } + pcbiDest->cbSize = size; + + size = FIELD_OFFSET(BINDINFO, szExtraInfo)+sizeof(void*); + if(pcbiSrc->cbSize>=size && pcbiDest->cbSize>=size && pcbiSrc->szExtraInfo) { + size = (strlenW(pcbiSrc->szExtraInfo)+1)*sizeof(WCHAR); + pcbiDest->szExtraInfo = CoTaskMemAlloc(size); + if(!pcbiDest->szExtraInfo) + return E_OUTOFMEMORY; + memcpy(pcbiDest->szExtraInfo, pcbiSrc->szExtraInfo, size); + } + + size = FIELD_OFFSET(BINDINFO, stgmedData)+sizeof(STGMEDIUM); + if(pcbiSrc->cbSize>=size && pcbiDest->cbSize>=size) { + hres = CopyStgMedium(&pcbiSrc->stgmedData, &pcbiDest->stgmedData); + if(FAILED(hres)) { + CoTaskMemFree(pcbiDest->szExtraInfo); + return hres; + } + } + + size = FIELD_OFFSET(BINDINFO, szCustomVerb)+sizeof(void*); + if(pcbiSrc->cbSize>=size && pcbiDest->cbSize>=size && pcbiSrc->szCustomVerb) { + size = (strlenW(pcbiSrc->szCustomVerb)+1)*sizeof(WCHAR); + pcbiDest->szCustomVerb = CoTaskMemAlloc(size); + if(!pcbiDest->szCustomVerb) { + CoTaskMemFree(pcbiDest->szExtraInfo); + ReleaseStgMedium(&pcbiDest->stgmedData); + return E_OUTOFMEMORY; + } + memcpy(pcbiDest->szCustomVerb, pcbiSrc->szCustomVerb, size); + } + + size = FIELD_OFFSET(BINDINFO, securityAttributes)+sizeof(SECURITY_ATTRIBUTES); + if(pcbiDest->cbSize >= size) + memset(&pcbiDest->securityAttributes, 0, sizeof(SECURITY_ATTRIBUTES)); + + if(pcbiSrc->pUnk) + IUnknown_AddRef(pcbiDest->pUnk); + + return S_OK; +} + static BOOL text_richtext_filter(const BYTE *b, DWORD size) { return size > 5 && !memcmp(b, "{\\rtf", 5); @@ -554,19 +703,33 @@ static BOOL text_richtext_filter(const BYTE *b, DWORD size) static BOOL text_html_filter(const BYTE *b, DWORD size) { - DWORD i; - - if(size < 5) + if(size < 6) return FALSE; - for(i=0; i < size-5; i++) { - if(b[i] == '<' - && (b[i+1] == 'h' || b[i+1] == 'H') - && (b[i+2] == 't' || b[i+2] == 'T') - && (b[i+3] == 'm' || b[i+3] == 'M') - && (b[i+4] == 'l' || b[i+4] == 'L')) - return TRUE; - } + if((b[0] == '<' + && (b[1] == 'h' || b[1] == 'H') + && (b[2] == 't' || b[2] == 'T') + && (b[3] == 'm' || b[3] == 'M') + && (b[4] == 'l' || b[4] == 'L')) + || (b[0] == '<' + && (b[1] == 'h' || b[1] == 'H') + && (b[2] == 'e' || b[2] == 'E') + && (b[3] == 'a' || b[3] == 'A') + && (b[4] == 'd' || b[4] == 'D'))) return TRUE; + + return FALSE; +} + +static BOOL text_xml_filter(const BYTE *b, DWORD size) +{ + if(size < 7) + return FALSE; + + if(b[0] == '<' && b[1] == '?' + && (b[2] == 'x' || b[2] == 'X') + && (b[3] == 'm' || b[3] == 'M') + && (b[4] == 'l' || b[4] == 'L') + && b[5] == ' ') return TRUE; return FALSE; } @@ -602,7 +765,10 @@ static BOOL image_pjpeg_filter(const BYTE *b, DWORD size) static BOOL image_tiff_filter(const BYTE *b, DWORD size) { - return size > 2 && b[0] == 0x4d && b[1] == 0x4d; + static const BYTE magic1[] = {0x4d,0x4d,0x00,0x2a}; + static const BYTE magic2[] = {0x49,0x49,0x2a,0xff}; + + return size >= 4 && (!memcmp(b, magic1, 4) || !memcmp(b, magic2, 4)); } static BOOL image_xpng_filter(const BYTE *b, DWORD size) @@ -662,12 +828,19 @@ static BOOL application_xmsdownload(const BYTE *b, DWORD size) return size > 2 && b[0] == 'M' && b[1] == 'Z'; } +static inline BOOL is_text_plain_char(BYTE b) +{ + if(b < 0x20 && b != '\n' && b != '\r' && b != '\t') + return FALSE; + return TRUE; +} + static BOOL text_plain_filter(const BYTE *b, DWORD size) { const BYTE *ptr; for(ptr = b; ptr < b+size-1; ptr++) { - if(*ptr < 0x20 && *ptr != '\n' && *ptr != '\r' && *ptr != '\t') + if(!is_text_plain_char(*ptr)) return FALSE; } @@ -682,10 +855,11 @@ static BOOL application_octet_stream_filter(const BYTE *b, DWORD size) static HRESULT find_mime_from_buffer(const BYTE *buf, DWORD size, const WCHAR *proposed_mime, WCHAR **ret_mime) { LPCWSTR ret = NULL; - DWORD len, i; + int len, i, any_pos_mime = -1; static const WCHAR text_htmlW[] = {'t','e','x','t','/','h','t','m','l',0}; static const WCHAR text_richtextW[] = {'t','e','x','t','/','r','i','c','h','t','e','x','t',0}; + static const WCHAR text_xmlW[] = {'t','e','x','t','/','x','m','l',0}; static const WCHAR audio_basicW[] = {'a','u','d','i','o','/','b','a','s','i','c',0}; static const WCHAR audio_wavW[] = {'a','u','d','i','o','/','w','a','v',0}; static const WCHAR image_gifW[] = {'i','m','a','g','e','/','g','i','f',0}; @@ -713,8 +887,10 @@ static HRESULT find_mime_from_buffer(const BYTE *buf, DWORD size, const WCHAR *p static const struct { LPCWSTR mime; BOOL (*filter)(const BYTE *,DWORD); - } mime_filters[] = { + } mime_filters_any_pos[] = { {text_htmlW, text_html_filter}, + {text_xmlW, text_xml_filter} + }, mime_filters[] = { {text_richtextW, text_richtext_filter}, /* {audio_xaiffW, audio_xaiff_filter}, */ {audio_basicW, audio_basic_filter}, @@ -756,20 +932,47 @@ static HRESULT find_mime_from_buffer(const BYTE *buf, DWORD size, const WCHAR *p return S_OK; } - if(proposed_mime && strcmpW(proposed_mime, app_octetstreamW)) { - for(i=0; i < sizeof(mime_filters)/sizeof(*mime_filters); i++) { - if(!strcmpW(proposed_mime, mime_filters[i].mime)) + if(proposed_mime && (!strcmpW(proposed_mime, app_octetstreamW) + || !strcmpW(proposed_mime, text_plainW))) + proposed_mime = NULL; + + if(proposed_mime) { + ret = proposed_mime; + + for(i=0; i < sizeof(mime_filters_any_pos)/sizeof(*mime_filters_any_pos); i++) { + if(!strcmpW(proposed_mime, mime_filters_any_pos[i].mime)) { + any_pos_mime = i; + for(len=size; len>0; len--) { + if(mime_filters_any_pos[i].filter(buf+size-len, len)) + break; + } + if(!len) + ret = NULL; break; + } } - if(i == sizeof(mime_filters)/sizeof(*mime_filters) || mime_filters[i].filter(buf, size)) { - len = strlenW(proposed_mime)+1; - *ret_mime = CoTaskMemAlloc(len*sizeof(WCHAR)); - if(!*ret_mime) - return E_OUTOFMEMORY; + if(i == sizeof(mime_filters_any_pos)/sizeof(*mime_filters_any_pos)) { + for(i=0; i < sizeof(mime_filters)/sizeof(*mime_filters); i++) { + if(!strcmpW(proposed_mime, mime_filters[i].mime)) { + if(!mime_filters[i].filter(buf, size)) + ret = NULL; + break; + } + } + } + } - memcpy(*ret_mime, proposed_mime, len*sizeof(WCHAR)); - return S_OK; + /* Looks like a bug in native implementation, html and xml mimes + * are not looked for if none of them was proposed */ + if(!proposed_mime || any_pos_mime!=-1) { + for(len=size; !ret && len>0; len--) { + for(i=0; i0; len--) { + if(!is_text_plain_char(buf[size-len])) + break; + for(i=0; i #include //#include -//#include +#include #ifdef SONAME_LIBJPEG /* This is a hack, so jpeglib.h does not redefine INT32 and the like*/ diff --git a/drivers/usb/usbehci/hardware.cpp b/drivers/usb/usbehci/hardware.cpp index 96e59b36fdb..ad7c2a4e071 100644 --- a/drivers/usb/usbehci/hardware.cpp +++ b/drivers/usb/usbehci/hardware.cpp @@ -252,9 +252,9 @@ CUSBHardwareDevice::PrintCapabilities() DPRINT1("Controler EHCI has Port Power Control\n"); } - DPRINT1("Controller Port Routing Rules %d\n", m_Capabilities.HCSParams.PortRouteRules); - DPRINT1("Number of Ports per Companion Controller %d\n", m_Capabilities.HCSParams.PortPerCHC); - DPRINT1("Number of Companion Controller %d\n", m_Capabilities.HCSParams.CHCCount); + DPRINT1("Controller Port Routing Rules %lu\n", m_Capabilities.HCSParams.PortRouteRules); + DPRINT1("Number of Ports per Companion Controller %lu\n", m_Capabilities.HCSParams.PortPerCHC); + DPRINT1("Number of Companion Controller %lu\n", m_Capabilities.HCSParams.CHCCount); if (m_Capabilities.HCSParams.PortIndicator) { @@ -363,11 +363,11 @@ CUSBHardwareDevice::PnpStart( m_Capabilities.HCSParamsLong = READ_REGISTER_ULONG((PULONG)((ULONG)ResourceBase + EHCI_HCSPARAMS)); m_Capabilities.HCCParamsLong = READ_REGISTER_ULONG((PULONG)((ULONG)ResourceBase + EHCI_HCCPARAMS)); - DPRINT1("Controller has %d Length\n", m_Capabilities.Length); + DPRINT1("Controller has %c Length\n", m_Capabilities.Length); DPRINT1("Controller EHCI Version %x\n", m_Capabilities.HCIVersion); DPRINT1("Controller EHCI Caps HCSParamsLong %x\n", m_Capabilities.HCSParamsLong); DPRINT1("Controller EHCI Caps HCCParamsLong %x\n", m_Capabilities.HCCParamsLong); - DPRINT1("Controller has %d Ports\n", m_Capabilities.HCSParams.PortCount); + DPRINT1("Controller has %lu Ports\n", m_Capabilities.HCSParams.PortCount); // // print capabilities @@ -597,7 +597,7 @@ CUSBHardwareDevice::StartController(void) // lets wait a bit // Timeout.QuadPart = 50; - DPRINT1("Waiting %d milliseconds for port reset\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port reset\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -915,7 +915,7 @@ CUSBHardwareDevice::ResetPort( // delay is 50 ms for port reset as per USB 2.0 spec // Timeout.QuadPart = 50; - DPRINT1("Waiting %d milliseconds for port reset\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port reset\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1047,7 +1047,7 @@ CUSBHardwareDevice::ClearPortStatus( // delay is 50 ms // Timeout.QuadPart = 50; - DPRINT1("Waiting %d milliseconds for port to recover after reset\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port to recover after reset\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1100,7 +1100,7 @@ CUSBHardwareDevice::ClearPortStatus( // delay is 100 ms // Timeout.QuadPart = 100; - DPRINT1("Waiting %d milliseconds for port to stabilize after connection\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port to stabilize after connection\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1180,7 +1180,7 @@ CUSBHardwareDevice::SetPortFeature( // delay is 20 ms // Timeout.QuadPart = 20; - DPRINT1("Waiting %d milliseconds for port power up\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port power up\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1394,7 +1394,7 @@ EhciDefferedRoutine( { if (PortStatus & EHCI_PRT_CONNECTED) { - DPRINT1("Device connected on port %d\n", i); + DPRINT1("Device connected on port %lu\n", i); if (This->m_Capabilities.HCSParams.CHCCount) { @@ -1418,7 +1418,7 @@ EhciDefferedRoutine( } else { - DPRINT1("Device disconnected on port %d\n", i); + DPRINT1("Device disconnected on port %lu\n", i); // // work to do diff --git a/drivers/usb/usbehci/usb_queue.cpp b/drivers/usb/usbehci/usb_queue.cpp index ba2a3f34be5..8b501b699a4 100644 --- a/drivers/usb/usbehci/usb_queue.cpp +++ b/drivers/usb/usbehci/usb_queue.cpp @@ -610,7 +610,7 @@ CUSBQueue::UnlinkQueueHeadChain( if (Entry == &HeadQueueHead->LinkedQueueHeads) { - DPRINT1("Warnnig; Only %d QueueHeads in HeadQueueHead\n", Index); + DPRINT1("Warning; Only %lu QueueHeads in HeadQueueHead\n", Index); Count = Index + 1; break; } @@ -684,7 +684,7 @@ CUSBQueue::QueueHeadInterruptCompletion( LastQueueHead->HorizontalLinkPointer = QueueHead->HorizontalLinkPointer; LastQueueHead->NextQueueHead = QueueHead->NextQueueHead; - DPRINT1("Periodic QueueHead %p Addr $x unlinked\n", QueueHead, QueueHead->PhysicalAddr); + DPRINT1("Periodic QueueHead %p Addr %x unlinked\n", QueueHead, QueueHead->PhysicalAddr); // insert into completed list InsertTailList(&m_CompletedRequestAsyncList, &QueueHead->LinkedQueueHeads); @@ -765,7 +765,7 @@ CUSBQueue::ProcessPeriodicSchedule( // IsQueueHeadComplete = Request->IsQueueHeadComplete(QueueHead); - DPRINT("Request %p QueueHead %p Complete %d\n", Request, QueueHead, IsQueueHeadComplete); + DPRINT("Request %p QueueHead %p Complete %c\n", Request, QueueHead, IsQueueHeadComplete); // // check if queue head is complete @@ -841,7 +841,7 @@ CUSBQueue::ProcessAsyncList( // IsQueueHeadComplete = Request->IsQueueHeadComplete(QueueHead); - DPRINT("Request %p QueueHead %p Complete %d\n", Request, QueueHead, IsQueueHeadComplete); + DPRINT("Request %p QueueHead %p Complete %c\n", Request, QueueHead, IsQueueHeadComplete); // // check if queue head is complete diff --git a/drivers/usb/usbohci/hardware.cpp b/drivers/usb/usbohci/hardware.cpp index b707ac5438c..87bf03e541b 100644 --- a/drivers/usb/usbohci/hardware.cpp +++ b/drivers/usb/usbohci/hardware.cpp @@ -553,7 +553,7 @@ retry: // delay is 100 ms // Timeout.QuadPart = WaitInMs; - DPRINT1("Waiting %d milliseconds for controller to transition state\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for controller to transition state\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1133,7 +1133,7 @@ CUSBHardwareDevice::ClearPortStatus( // delay is 100 ms // Timeout.QuadPart = 100; - DPRINT1("Waiting %d milliseconds for port to stabilize after connection\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port to stabilize after connection\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1204,7 +1204,7 @@ CUSBHardwareDevice::SetPortFeature( // delay is multiplied by 2 ms // Timeout.QuadPart *= 2; - DPRINT1("Waiting %d milliseconds for port power up\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port power up\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1472,7 +1472,7 @@ OhciDefferedRoutine( // // device connected // - DPRINT1("New device arrival at Port %d LowSpeed %x\n", Index, (PortStatus & OHCI_RH_PORTSTATUS_LSDA)); + DPRINT1("New device arrival at Port %lu LowSpeed %x\n", Index, (PortStatus & OHCI_RH_PORTSTATUS_LSDA)); // // enable port @@ -1509,7 +1509,7 @@ OhciDefferedRoutine( // // This is a port reset complete interrupt // - DPRINT1("Port %d completed reset\n", Index); + DPRINT1("Port %lu completed reset\n", Index); // // Queue a work item diff --git a/drivers/usb/usbohci/usb_request.cpp b/drivers/usb/usbohci/usb_request.cpp index 3e1eeaf2a4c..ae5a53c05ca 100644 --- a/drivers/usb/usbohci/usb_request.cpp +++ b/drivers/usb/usbohci/usb_request.cpp @@ -1348,7 +1348,7 @@ CUSBRequest::DumpEndpointDescriptor( DPRINT1("EndpointDescriptor %p Addr %x\n", Descriptor, Descriptor->PhysicalAddress.LowPart); DPRINT1("EndpointDescriptor HeadPhysicalDescriptor %x HeadLogicalDescriptor %p\n", Descriptor->HeadPhysicalDescriptor, Descriptor->HeadLogicalDescriptor); DPRINT1("EndpointDescriptor TailPhysicalDescriptor %x\n", Descriptor->TailPhysicalDescriptor); - DPRINT1("EndpointDescriptor NextDescriptor %x\n", Descriptor->NextDescriptor); + DPRINT1("EndpointDescriptor NextDescriptor %p\n", Descriptor->NextDescriptor); DPRINT1("EndpointDescriptor NextPhysicalEndpoint %x\n", Descriptor->NextPhysicalEndpoint); DPRINT1("EndpointDescriptor Flags %x\n", Descriptor->Flags); @@ -1356,12 +1356,12 @@ CUSBRequest::DumpEndpointDescriptor( GeneralDescriptor = (POHCI_GENERAL_TD)Descriptor->HeadLogicalDescriptor; while(GeneralDescriptor) { - DPRINT1("Descriptor %d Address %p Addr %x\n", Count, GeneralDescriptor, GeneralDescriptor->PhysicalAddress); - DPRINT1("Descriptor %d BufferLogical %p BufferPhysical %x\n", Count, GeneralDescriptor->BufferLogical, GeneralDescriptor->BufferPhysical); - DPRINT1("Descriptor %d BufferSize %d\n", Count, GeneralDescriptor->BufferSize); - DPRINT1("Descriptor %d LastPhysicalByteAddress %x\n", Count, GeneralDescriptor->LastPhysicalByteAddress); - DPRINT1("Descriptor %d Flags %x\n", Count, GeneralDescriptor->Flags); - DPRINT1("Descriptor %d NextLogicalDescriptor %p NextPhysicalDescriptor %x\n", Count, GeneralDescriptor->NextLogicalDescriptor, GeneralDescriptor->NextPhysicalDescriptor); + DPRINT1("Descriptor %lu Address %p Addr %x\n", Count, GeneralDescriptor, GeneralDescriptor->PhysicalAddress); + DPRINT1("Descriptor %lu BufferLogical %p BufferPhysical %x\n", Count, GeneralDescriptor->BufferLogical, GeneralDescriptor->BufferPhysical); + DPRINT1("Descriptor %lu BufferSize %lu\n", Count, GeneralDescriptor->BufferSize); + DPRINT1("Descriptor %lu LastPhysicalByteAddress %x\n", Count, GeneralDescriptor->LastPhysicalByteAddress); + DPRINT1("Descriptor %lu Flags %x\n", Count, GeneralDescriptor->Flags); + DPRINT1("Descriptor %lu NextLogicalDescriptor %p NextPhysicalDescriptor %x\n", Count, GeneralDescriptor->NextLogicalDescriptor, GeneralDescriptor->NextPhysicalDescriptor); Count++; GeneralDescriptor = (POHCI_GENERAL_TD)GeneralDescriptor->NextLogicalDescriptor; diff --git a/drivers/usb/usbstor/descriptor.c b/drivers/usb/usbstor/descriptor.c index 28b7ead3332..4728c6249ee 100644 --- a/drivers/usb/usbstor/descriptor.c +++ b/drivers/usb/usbstor/descriptor.c @@ -331,7 +331,7 @@ USBSTOR_ScanConfigurationDescriptor( VOID DumpConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor) { - DPRINT1("Dumping ConfigurationDescriptor %x\n", ConfigurationDescriptor); + DPRINT1("Dumping ConfigurationDescriptor %p\n", ConfigurationDescriptor); DPRINT1("bLength %x\n", ConfigurationDescriptor->bLength); DPRINT1("bDescriptorType %x\n", ConfigurationDescriptor->bDescriptorType); DPRINT1("wTotalLength %x\n", ConfigurationDescriptor->wTotalLength); @@ -535,7 +535,7 @@ USBSTOR_GetPipeHandles( // // WTF? usb port driver does not give us bulk pipe access // - DPRINT1("USBSTOR_GetPipeHandles> BulkInFound %d BulkOutFound %d missing!!!\n", BulkInFound, BulkOutFound); + DPRINT1("USBSTOR_GetPipeHandles> BulkInFound %c BulkOutFound %c missing!!!\n", BulkInFound, BulkOutFound); return STATUS_DEVICE_CONFIGURATION_ERROR; } diff --git a/drivers/usb/usbstor/error.c b/drivers/usb/usbstor/error.c index 3ed594932cd..0d80946edf7 100644 --- a/drivers/usb/usbstor/error.c +++ b/drivers/usb/usbstor/error.c @@ -42,7 +42,7 @@ USBSTOR_GetEndpointStatus( // // send the request // - DPRINT1("Sending Request DeviceObject %x, Urb %x\n", DeviceObject, Urb); + DPRINT1("Sending Request DeviceObject %p, Urb %p\n", DeviceObject, Urb); Status = USBSTOR_SyncUrbRequest(DeviceObject, Urb); // @@ -90,7 +90,7 @@ USBSTOR_ResetPipeWithHandle( // // send the request // - DPRINT1("Sending Request DeviceObject %x, Urb %x\n", DeviceObject, Urb); + DPRINT1("Sending Request DeviceObject %p, Urb %p\n", DeviceObject, Urb); Status = USBSTOR_SyncUrbRequest(DeviceObject, Urb); // diff --git a/drivers/usb/usbstor/fdo.c b/drivers/usb/usbstor/fdo.c index a9f408da099..83f9c939089 100644 --- a/drivers/usb/usbstor/fdo.c +++ b/drivers/usb/usbstor/fdo.c @@ -14,7 +14,7 @@ VOID USBSTOR_DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor) { - DPRINT1("Dumping Device Descriptor %x\n", DeviceDescriptor); + DPRINT1("Dumping Device Descriptor %p\n", DeviceDescriptor); DPRINT1("bLength %x\n", DeviceDescriptor->bLength); DPRINT1("bDescriptorType %x\n", DeviceDescriptor->bDescriptorType); DPRINT1("bcdUSB %x\n", DeviceDescriptor->bcdUSB); diff --git a/drivers/usb/usbstor/pdo.c b/drivers/usb/usbstor/pdo.c index f7a2a654789..2c70f435f40 100644 --- a/drivers/usb/usbstor/pdo.c +++ b/drivers/usb/usbstor/pdo.c @@ -671,14 +671,14 @@ USBSTOR_PdoHandleQueryInstanceId( // // using serial number from device // - swprintf(Buffer, L"%s&%d", FDODeviceExtension->SerialNumber->bString, PDODeviceExtension->LUN); + swprintf(Buffer, L"%s&%c", FDODeviceExtension->SerialNumber->bString, PDODeviceExtension->LUN); } else { // // use instance count and LUN // - swprintf(Buffer, L"%04d&%d", FDODeviceExtension->InstanceCount, PDODeviceExtension->LUN); + swprintf(Buffer, L"%04lu&%c", FDODeviceExtension->InstanceCount, PDODeviceExtension->LUN); } // @@ -1203,7 +1203,7 @@ USBSTOR_SendInquiryIrp( DPRINT1("Version %x\n", Response->Version); DPRINT1("Format %x\n", Response->Format); DPRINT1("Length %x\n", Response->Length); - DPRINT1("Reserved %x\n", Response->Reserved); + DPRINT1("Reserved %p\n", Response->Reserved); DPRINT1("Vendor %c%c%c%c%c%c%c%c\n", Response->Vendor[0], Response->Vendor[1], Response->Vendor[2], Response->Vendor[3], Response->Vendor[4], Response->Vendor[5], Response->Vendor[6], Response->Vendor[7]); DPRINT1("Product %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", Response->Product[0], Response->Product[1], Response->Product[2], Response->Product[3], Response->Product[4], Response->Product[5], Response->Product[6], Response->Product[7], diff --git a/drivers/usb/usbuhci/hardware.cpp b/drivers/usb/usbuhci/hardware.cpp index fbfe446aff0..da33667a0d3 100644 --- a/drivers/usb/usbuhci/hardware.cpp +++ b/drivers/usb/usbuhci/hardware.cpp @@ -569,7 +569,7 @@ CUSBHardwareDevice::GlobalReset() // delay is 10 ms // Timeout.QuadPart = 10; - DPRINT1("Waiting %d milliseconds for global reset\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for global reset\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -723,7 +723,7 @@ CUSBHardwareDevice::InitializeController() } } - DPRINT1("Index %lu QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %x NextElementDescriptor %x\n", + DPRINT1("Index %d QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %p NextElementDescriptor %p\n", 0, m_QueueHead[0], m_QueueHead[0]->LinkPhysical, @@ -731,7 +731,7 @@ CUSBHardwareDevice::InitializeController() m_QueueHead[0]->PhysicalAddress, m_QueueHead[0]->Request, m_QueueHead[0]->NextElementDescriptor); - DPRINT1("Index %lu QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %x NextElementDescriptor %x\n", + DPRINT1("Index %d QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %p NextElementDescriptor %p\n", 1, m_QueueHead[1], m_QueueHead[1]->LinkPhysical, @@ -740,7 +740,7 @@ CUSBHardwareDevice::InitializeController() m_QueueHead[1]->Request, m_QueueHead[1]->NextElementDescriptor); - DPRINT1("Index %lu QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %x NextElementDescriptor %x\n", + DPRINT1("Index %d QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %p NextElementDescriptor %p\n", 2, m_QueueHead[2], m_QueueHead[2]->LinkPhysical, @@ -748,7 +748,7 @@ CUSBHardwareDevice::InitializeController() m_QueueHead[2]->PhysicalAddress, m_QueueHead[2]->Request, m_QueueHead[2]->NextElementDescriptor); - DPRINT1("Index %lu QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %x NextElementDescriptor %x\n", + DPRINT1("Index %d QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %p NextElementDescriptor %p\n", 3, m_QueueHead[3], m_QueueHead[3]->LinkPhysical, @@ -756,7 +756,7 @@ CUSBHardwareDevice::InitializeController() m_QueueHead[3]->PhysicalAddress, m_QueueHead[3]->Request, m_QueueHead[3]->NextElementDescriptor); - DPRINT1("Index %lu QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %x NextElementDescriptor %x\n", + DPRINT1("Index %d QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %p NextElementDescriptor %p\n", 4, m_QueueHead[4], m_QueueHead[4]->LinkPhysical, @@ -934,7 +934,7 @@ CUSBHardwareDevice::ResetPort( // delay is 20 ms for port reset // Timeout.QuadPart = 20; - DPRINT1("Waiting %d milliseconds for port reset\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port reset\n", Timeout.LowPart); // // convert to 100 ns units (absolute) diff --git a/hal/halx86/CMakeLists.txt b/hal/halx86/CMakeLists.txt index daec98d5b98..c4bb719ddde 100644 --- a/hal/halx86/CMakeLists.txt +++ b/hal/halx86/CMakeLists.txt @@ -7,263 +7,77 @@ include_directories( include ${REACTOS_SOURCE_DIR}/ntoskrnl/include) -list(APPEND HAL_GENERIC_SOURCE - generic/beep.c - generic/cmos.c - generic/display.c - generic/dma.c - generic/drive.c - generic/halinit.c - generic/memory.c - generic/misc.c - generic/reboot.c - generic/sysinfo.c - generic/usage.c) +function(add_hal _halname) + cmake_parse_arguments(_haldata "" "" "SOURCES;COMPONENTS" ${ARGN}) -if(ARCH STREQUAL "i386") - list(APPEND HAL_GENERIC_SOURCE - generic/bios.c - generic/portio.c) -endif() - -if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(lib_hal_generic OBJECT ${HAL_GENERIC_SOURCE}) -else() - add_library(lib_hal_generic ${HAL_GENERIC_SOURCE}) -endif() - -add_dependencies(lib_hal_generic asm) -add_pch(lib_hal_generic include/hal.h) - -if(ARCH STREQUAL "i386") - - ##################################### - # Generate the pcidata source files in the x86 build - # - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.h - COMMAND native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_classes.ids ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.h ClassTable INIT_FUNCTION ${CMAKE_CURRENT_SOURCE_DIR}/include/hal.h - DEPENDS native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_classes.ids) - - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.h - COMMAND native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_vendors.ids ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.h VendorTable INIT_FUNCTION ${CMAKE_CURRENT_SOURCE_DIR}/include/hal.h - DEPENDS native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_vendors.ids) - ##################################### - - list(APPEND HAL_LEGACY_SOURCE - legacy/bus/bushndlr.c - legacy/bus/cmosbus.c - legacy/bus/isabus.c - legacy/bus/pcibus.c - ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c - ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c - legacy/bus/sysbus.c - legacy/bussupp.c - legacy/halpnpdd.c - legacy/halpcat.c) + # Handle the spec file for the dll name + spec2def(${_halname}.dll ../hal.spec ADD_IMPORTLIB) + # Create the actual target if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(lib_hal_legacy OBJECT ${HAL_LEGACY_SOURCE}) + foreach(_component ${_haldata_COMPONENTS}) + list(APPEND _haldata_SOURCES "$") + endforeach() + add_library(${_halname} SHARED + ${_haldata_SOURCES} + ${CMAKE_CURRENT_BINARY_DIR}/hal.def) else() - add_library(lib_hal_legacy ${HAL_LEGACY_SOURCE}) + foreach(_component ${_haldata_COMPONENTS}) + list(APPEND _haldata_LIBS "lib_hal_${_component}") + endforeach() + add_library(${_halname} SHARED + ${_haldata_SOURCES} + ${CMAKE_CURRENT_BINARY_DIR}/hal.def) + target_link_libraries(${_halname} ${_haldata_LIBS}) endif() - #add_pch(lib_hal_legacy include/hal.h) - - if(MSVC OR (NOT CMAKE_VERSION VERSION_GREATER 2.8.7)) - target_link_libraries(lib_hal_legacy lib_hal_generic) + target_link_libraries(${_halname} libcntpr) + add_importlibs(${_halname} ntoskrnl) + #add_pch(${_halname} include/hal.h) + add_dependencies(${_halname} psdk bugcodes asm) + set_entrypoint(${_halname} HalInitSystem 8) + set_subsystem(${_halname} native) + set_image_base(${_halname} 0x00010000) + add_cd_file(TARGET ${_halname} DESTINATION reactos/system32 NO_CAB FOR all) + if(MSVC) + add_target_link_flags(${_halname} "/ignore:4216 /ignore:4078") + else() + target_link_libraries(${_halname} -lgcc) endif() +endfunction() -endif() - -list(APPEND HAL_ACPI_SOURCE - acpi/halacpi.c - acpi/halpnpdd.c - acpi/busemul.c - legacy/bus/pcibus.c) - -if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(lib_hal_acpi OBJECT ${HAL_ACPI_SOURCE}) -else() - add_library(lib_hal_acpi ${HAL_ACPI_SOURCE}) -endif() -#add_pch(lib_hal_acpi include/hal.h) - -if(MSVC OR (NOT CMAKE_VERSION VERSION_GREATER 2.8.7)) - target_link_libraries(lib_hal_acpi lib_hal_generic) -endif() - -list(APPEND HAL_UP_SOURCE - generic/spinlock.c - up/processor.c) - -if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(lib_hal_up OBJECT ${HAL_UP_SOURCE}) -endif() - -list(APPEND HAL_APIC_ASM_SOURCE - apic/apictrap.S - apic/tsccal.S) - -list(APPEND HAL_APIC_SOURCE - apic/apic.c - apic/apictimer.c - apic/halinit_apic.c - apic/rtctimer.c - apic/tsc.c) +# The components +include(generic.cmake) +include(acpi.cmake) +include(apic.cmake) if(ARCH STREQUAL "i386") - list(APPEND HAL_PIC_ASM_SOURCE - generic/systimer.S - generic/trap.S) - list(APPEND HAL_PIC_SOURCE - generic/profil.c - generic/timer.c - up/halinit_up.c - up/pic.c) - - if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(lib_hal_pic OBJECT ${HAL_PIC_SOURCE} ${HAL_PIC_ASM_SOURCE}) - add_dependencies(lib_hal_pic asm) - endif() - - list(APPEND MINI_HAL_SOURCE - generic/portio.c - generic/systimer.S - legacy/bus/bushndlr.c - legacy/bus/cmosbus.c - legacy/bus/isabus.c - legacy/bus/pcibus.c - legacy/bus/sysbus.c - legacy/bussupp.c - generic/beep.c - generic/bios.c - generic/cmos.c - generic/dma.c - generic/display.c - generic/drive.c - generic/misc.c - generic/profil.c - generic/reboot.c - generic/spinlock.c - generic/sysinfo.c - generic/timer.c - generic/usage.c - up/halinit_mini.c - up/pic.c - up/processor.c) - - spec2def(hal.dll ../hal.spec ADD_IMPORTLIB) + include(pcidata.cmake) + include(legacy.cmake) + include(up.cmake) + include(pic.cmake) + include(minihal.cmake) # hal - if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(hal SHARED - $ - $ - $ - $ - generic/v86.S - up/halup.rc - ${CMAKE_CURRENT_BINARY_DIR}/hal.def) - else() - add_asm_files(hal_asm - ${HAL_PIC_ASM_SOURCE} - generic/v86.S) - add_library(hal SHARED - ${HAL_UP_SOURCE} - ${HAL_PIC_SOURCE} - ${hal_asm} - up/halup.rc - ${CMAKE_CURRENT_BINARY_DIR}/hal.def) - endif() + add_hal(hal SOURCES up/halup.rc COMPONENTS generic legacy up pic) + add_hal(halacpi SOURCES acpi/halacpi.rc COMPONENTS generic acpi up pic) + add_hal(halapic SOURCES acpi/halacpi.rc COMPONENTS generic legacy up apic) + add_hal(halaacpi SOURCES acpi/halacpi.rc COMPONENTS generic acpi up apic) - if(MSVC OR (NOT CMAKE_VERSION VERSION_GREATER 2.8.7)) - target_link_libraries(hal lib_hal_generic lib_hal_legacy) - endif() - target_link_libraries(hal libcntpr) - add_importlibs(hal ntoskrnl) - #add_pch(hal include/hal.h) - add_dependencies(hal psdk bugcodes asm) - set_entrypoint(hal HalInitSystem 8) - set_subsystem(hal native) - set_image_base(hal 0x00010000) - add_cd_file(TARGET hal DESTINATION reactos/system32 NO_CAB FOR all) - if(MSVC) - add_target_link_flags(hal "/ignore:4216 /ignore:4078") - endif() - - # hal acpi - spec2def(halacpi.dll ../hal.spec) - if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(halacpi SHARED - $ - $ - $ - $ - generic/v86.S - acpi/halacpi.rc - ${CMAKE_CURRENT_BINARY_DIR}/halacpi.def) - else() - set_source_files_properties(${HAL_PIC_ASM_SOURCE} generic/v86.S PROPERTIES COMPILE_DEFINITIONS "CONFIG_ACPI") - add_asm_files(halacpi_asm ${HAL_PIC_ASM_SOURCE} generic/v86.S) - add_library(halacpi SHARED - ${HAL_UP_SOURCE} - ${HAL_PIC_SOURCE} - ${halacpi_asm} - acpi/halacpi.rc - ${CMAKE_CURRENT_BINARY_DIR}/halacpi.def) - endif() - - if(MSVC OR (NOT CMAKE_VERSION VERSION_GREATER 2.8.7)) - target_link_libraries(halacpi lib_hal_generic lib_hal_acpi) - endif() - target_link_libraries(halacpi libcntpr) - add_importlibs(halacpi ntoskrnl) - add_dependencies(halacpi psdk bugcodes asm) - set_entrypoint(halacpi HalInitSystem@8) - set_subsystem(halacpi native) - set_image_base(halacpi 0x00010000) - add_target_compile_definitions(halacpi CONFIG_ACPI) - add_cd_file(TARGET halacpi DESTINATION reactos/system32 NO_CAB FOR all) - if(MSVC) - add_target_link_flags(halacpi "/ignore:4216 /ignore:4078") - endif() - - # mini_hal - add_library(mini_hal ${MINI_HAL_SOURCE}) - add_target_compile_definitions(mini_hal _BLDR_ _MINIHAL_) - add_dependencies(mini_hal psdk bugcodes asm) + #add_hal(halmps SOURCES up/halup.rc COMPONENTS generic legacy smp pic) + #add_hal(halmacpi SOURCES acpi/halacpi.rc COMPONENTS generic acpi smp pic) + #add_hal(halmapic SOURCES acpi/halacpi.rc COMPONENTS generic legacy smp apic) + #add_hal(halmaacpi SOURCES acpi/halacpi.rc COMPONENTS generic acpi smp apic) elseif(ARCH STREQUAL "amd64") - spec2def(hal.dll ../hal.spec ADD_IMPORTLIB) - list(APPEND HAL_SOURCE - ${HAL_GENERIC_SOURCE} - ${HAL_ACPI_SOURCE} - ${HAL_APIC_SOURCE} generic/spinlock.c amd64/x86bios.c amd64/halinit.c - amd64/processor.c - ${CMAKE_CURRENT_BINARY_DIR}/hal.def) + amd64/processor.c) - # hal - add_library(hal SHARED ${HAL_SOURCE}) - add_pch(hal include/hal.h) - add_dependencies(hal psdk bugcodes asm) - - set_entrypoint(hal HalInitSystem) - set_subsystem(hal native) - set_image_base(hal 0x00010000) - add_importlibs(hal ntoskrnl) - target_link_libraries(hal libcntpr) - if(MSVC) - add_target_link_flags(hal "/ignore:4216") - endif() - - add_cd_file(TARGET hal DESTINATION reactos/system32 NO_CAB FOR all) + add_hal(hal SOURCES ${HAL_SOURCE} COMPONENTS generic acpi apic) endif() diff --git a/hal/halx86/acpi.cmake b/hal/halx86/acpi.cmake new file mode 100644 index 00000000000..1c710f4cf89 --- /dev/null +++ b/hal/halx86/acpi.cmake @@ -0,0 +1,14 @@ + +list(APPEND HAL_ACPI_SOURCE + acpi/halacpi.c + acpi/halpnpdd.c + acpi/busemul.c + legacy/bus/pcibus.c) + +add_object_library(lib_hal_acpi ${HAL_ACPI_SOURCE}) + +#add_pch(lib_hal_acpi include/hal.h) + +if(MSVC OR (NOT CMAKE_VERSION VERSION_GREATER 2.8.7)) + target_link_libraries(lib_hal_acpi lib_hal_generic) +endif() diff --git a/hal/halx86/apic.cmake b/hal/halx86/apic.cmake new file mode 100644 index 00000000000..8fd16fe8e78 --- /dev/null +++ b/hal/halx86/apic.cmake @@ -0,0 +1,14 @@ + +list(APPEND HAL_APIC_ASM_SOURCE + apic/apictrap.S + apic/tsccal.S) + +list(APPEND HAL_APIC_SOURCE + apic/apic.c + apic/apictimer.c + apic/halinit_apic.c + apic/rtctimer.c + apic/tsc.c) + +add_object_library(lib_hal_apic ${HAL_APIC_SOURCE} ${HAL_APIC_ASM_SOURCE}) +add_dependencies(lib_hal_apic asm) diff --git a/hal/halx86/generic.cmake b/hal/halx86/generic.cmake new file mode 100644 index 00000000000..129f64cd647 --- /dev/null +++ b/hal/halx86/generic.cmake @@ -0,0 +1,27 @@ + +list(APPEND HAL_GENERIC_SOURCE + generic/beep.c + generic/cmos.c + generic/display.c + generic/dma.c + generic/drive.c + generic/halinit.c + generic/memory.c + generic/misc.c + generic/reboot.c + generic/sysinfo.c + generic/usage.c) + +if(ARCH STREQUAL "i386") + list(APPEND HAL_GENERIC_SOURCE + generic/bios.c + generic/portio.c) + + list(APPEND HAL_GENERIC_ASM_SOURCE + generic/v86.S) +endif() + +add_asm_files(halacpi_asm ${HAL_PIC_ASM_SOURCE} generic/v86.S) +add_object_library(lib_hal_generic ${HAL_GENERIC_SOURCE} ${HAL_GENERIC_ASM_SOURCE}) +add_dependencies(lib_hal_generic asm) +add_pch(lib_hal_generic include/hal.h) diff --git a/hal/halx86/legacy.cmake b/hal/halx86/legacy.cmake new file mode 100644 index 00000000000..1fb59012bcb --- /dev/null +++ b/hal/halx86/legacy.cmake @@ -0,0 +1,20 @@ + +list(APPEND HAL_LEGACY_SOURCE + legacy/bus/bushndlr.c + legacy/bus/cmosbus.c + legacy/bus/isabus.c + legacy/bus/pcibus.c + ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c + ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c + legacy/bus/sysbus.c + legacy/bussupp.c + legacy/halpnpdd.c + legacy/halpcat.c) + +add_object_library(lib_hal_legacy ${HAL_LEGACY_SOURCE}) + +#add_pch(lib_hal_legacy include/hal.h) + +if(MSVC OR (NOT CMAKE_VERSION VERSION_GREATER 2.8.7)) + target_link_libraries(lib_hal_legacy lib_hal_generic) +endif() diff --git a/hal/halx86/minihal.cmake b/hal/halx86/minihal.cmake new file mode 100644 index 00000000000..0d7bb3089ca --- /dev/null +++ b/hal/halx86/minihal.cmake @@ -0,0 +1,32 @@ + + +list(APPEND MINI_HAL_SOURCE + generic/portio.c + generic/systimer.S + legacy/bus/bushndlr.c + legacy/bus/cmosbus.c + legacy/bus/isabus.c + legacy/bus/pcibus.c + legacy/bus/sysbus.c + legacy/bussupp.c + generic/beep.c + generic/bios.c + generic/cmos.c + generic/dma.c + generic/display.c + generic/drive.c + generic/misc.c + generic/profil.c + generic/reboot.c + generic/spinlock.c + generic/sysinfo.c + generic/timer.c + generic/usage.c + up/halinit_mini.c + up/pic.c + up/processor.c) + +# mini_hal +add_library(mini_hal ${MINI_HAL_SOURCE}) +add_target_compile_definitions(mini_hal _BLDR_ _MINIHAL_) +add_dependencies(mini_hal psdk bugcodes asm) diff --git a/hal/halx86/pcidata.cmake b/hal/halx86/pcidata.cmake new file mode 100644 index 00000000000..5860e507fc8 --- /dev/null +++ b/hal/halx86/pcidata.cmake @@ -0,0 +1,13 @@ +##################################### +# Generate the pcidata source files in the x86 build +# +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.h + COMMAND native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_classes.ids ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.h ClassTable INIT_FUNCTION ${CMAKE_CURRENT_SOURCE_DIR}/include/hal.h + DEPENDS native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_classes.ids) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.h + COMMAND native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_vendors.ids ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.h VendorTable INIT_FUNCTION ${CMAKE_CURRENT_SOURCE_DIR}/include/hal.h + DEPENDS native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_vendors.ids) +##################################### diff --git a/hal/halx86/pic.cmake b/hal/halx86/pic.cmake new file mode 100644 index 00000000000..f06ed8bc4c0 --- /dev/null +++ b/hal/halx86/pic.cmake @@ -0,0 +1,13 @@ + +list(APPEND HAL_PIC_ASM_SOURCE + generic/systimer.S + generic/trap.S) + +list(APPEND HAL_PIC_SOURCE + generic/profil.c + generic/timer.c + up/halinit_up.c + up/pic.c) + +add_object_library(lib_hal_pic ${HAL_PIC_SOURCE} ${HAL_PIC_ASM_SOURCE}) +add_dependencies(lib_hal_pic asm) diff --git a/hal/halx86/up.cmake b/hal/halx86/up.cmake new file mode 100644 index 00000000000..08c04316a45 --- /dev/null +++ b/hal/halx86/up.cmake @@ -0,0 +1,6 @@ + +list(APPEND HAL_UP_SOURCE + generic/spinlock.c + up/processor.c) + +add_object_library(lib_hal_up ${HAL_UP_SOURCE}) diff --git a/include/asm/genincdata.c b/include/asm/genincdata.c index 2f55a40efd9..bfd99090104 100644 --- a/include/asm/genincdata.c +++ b/include/asm/genincdata.c @@ -31,14 +31,14 @@ typedef struct _FIBER /* Field offsets: */ { /* 32 bit 64 bit */ /* this must be the first field */ PVOID Parameter; /* 0x00 0x00 */ - struct _EXCEPTION_REGISTRATION_RECORD * ExceptionList; /* 0x04 0x08 */ + PEXCEPTION_REGISTRATION_RECORD ExceptionList; /* 0x04 0x08 */ PVOID StackBase; /* 0x08 0x10 */ PVOID StackLimit; /* 0x0C 0x18 */ PVOID DeallocationStack; /* 0x10 0x20 */ CONTEXT Context; /* 0x14 0x28 */ ULONG GuaranteedStackBytes; /* 0x2E0 */ PVOID FlsData; /* 0x2E4 */ - PVOID ActivationContextStack; /* 0x2E8 */ + PVOID /* PACTIVATION_CONTEXT_STACK */ ActivationContextStack; /* 0x2E8 */ } FIBER, *PFIBER; typedef struct diff --git a/include/crt/mbstring.h b/include/crt/mbstring.h index cbcff718617..87ec6e397f0 100644 --- a/include/crt/mbstring.h +++ b/include/crt/mbstring.h @@ -31,100 +31,791 @@ extern "C" { #ifndef _MBSTRING_DEFINED #define _MBSTRING_DEFINED - _CRTIMP unsigned char *__cdecl _mbsdup(const unsigned char *_Str); - _CRTIMP unsigned int __cdecl _mbbtombc(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbbtombc_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _mbbtype(unsigned char _Ch,int _CType); - _CRTIMP int __cdecl _mbbtype_l(unsigned char _Ch,int _CType,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbctombb(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbctombb_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _mbsbtype(const unsigned char *_Str,size_t _Pos); - _CRTIMP int __cdecl _mbsbtype_l(const unsigned char *_Str,size_t _Pos,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbscat(unsigned char *_Dest,const unsigned char *_Source); - _CRTIMP unsigned char *_mbscat_l(unsigned char *_Dest,const unsigned char *_Source,_locale_t _Locale); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbschr(const unsigned char *_Str,unsigned int _Ch); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbschr_l(const unsigned char *_Str,unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _mbscmp(const unsigned char *_Str1,const unsigned char *_Str2); - _CRTIMP int __cdecl _mbscmp_l(const unsigned char *_Str1,const unsigned char *_Str2,_locale_t _Locale); - _CRTIMP int __cdecl _mbscoll(const unsigned char *_Str1,const unsigned char *_Str2); - _CRTIMP int __cdecl _mbscoll_l(const unsigned char *_Str1,const unsigned char *_Str2,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbscpy(unsigned char *_Dest,const unsigned char *_Source); - _CRTIMP unsigned char *_mbscpy_l(unsigned char *_Dest,const unsigned char *_Source,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbscspn(const unsigned char *_Str,const unsigned char *_Control); - _CRTIMP size_t __cdecl _mbscspn_l(const unsigned char *_Str,const unsigned char *_Control,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsdec(const unsigned char *_Start,const unsigned char *_Pos); - _CRTIMP unsigned char *__cdecl _mbsdec_l(const unsigned char *_Start,const unsigned char *_Pos,_locale_t _Locale); - _CRTIMP int __cdecl _mbsicmp(const unsigned char *_Str1,const unsigned char *_Str2); - _CRTIMP int __cdecl _mbsicmp_l(const unsigned char *_Str1,const unsigned char *_Str2,_locale_t _Locale); - _CRTIMP int __cdecl _mbsicoll(const unsigned char *_Str1,const unsigned char *_Str2); - _CRTIMP int __cdecl _mbsicoll_l(const unsigned char *_Str1,const unsigned char *_Str2,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsinc(const unsigned char *_Ptr); - _CRTIMP unsigned char *__cdecl _mbsinc_l(const unsigned char *_Ptr,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbslen(const unsigned char *_Str); - _CRTIMP size_t __cdecl _mbslen_l(const unsigned char *_Str,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbsnlen(const unsigned char *_Str,size_t _MaxCount); - _CRTIMP size_t __cdecl _mbsnlen_l(const unsigned char *_Str,size_t _MaxCount,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbslwr(unsigned char *_String); - _CRTIMP unsigned char *_mbslwr_l(unsigned char *_String,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsnbcat(unsigned char *_Dest,const unsigned char *_Source,size_t _Count); - _CRTIMP unsigned char *__cdecl _mbsnbcat_l(unsigned char *_Dest,const unsigned char *_Source,size_t _Count,_locale_t _Locale); - _CRTIMP int __cdecl _mbsnbcmp(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsnbcmp_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP int __cdecl _mbsnbcoll(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsnbcoll_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbsnbcnt(const unsigned char *_Str,size_t _MaxCount); - _CRTIMP size_t __cdecl _mbsnbcnt_l(const unsigned char *_Str,size_t _MaxCount,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsnbcpy(unsigned char *_Dest,const unsigned char *_Source,size_t _Count); - _CRTIMP int __cdecl _mbsnbcpy_s(unsigned char* dst, size_t size, const unsigned char* src, size_t n); - _CRTIMP unsigned char *__cdecl _mbsnbcpy_l(unsigned char *_Dest,const unsigned char *_Source,size_t _Count,_locale_t _Locale); - _CRTIMP int __cdecl _mbsnbicmp(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsnbicmp_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP int __cdecl _mbsnbicoll(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsnbicoll_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsnbset(unsigned char *_Str,unsigned int _Ch,size_t _MaxCount); - _CRTIMP unsigned char *__cdecl _mbsnbset_l(unsigned char *_Str,unsigned int _Ch,size_t _MaxCount,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsncat(unsigned char *_Dest,const unsigned char *_Source,size_t _Count); - _CRTIMP unsigned char *__cdecl _mbsncat_l(unsigned char *_Dest,const unsigned char *_Source,size_t _Count,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbsnccnt(const unsigned char *_Str,size_t _MaxCount); - _CRTIMP size_t __cdecl _mbsnccnt_l(const unsigned char *_Str,size_t _MaxCount,_locale_t _Locale); - _CRTIMP int __cdecl _mbsncmp(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsncmp_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP int __cdecl _mbsncoll(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsncoll_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsncpy(unsigned char *_Dest,const unsigned char *_Source,size_t _Count); - _CRTIMP unsigned char *__cdecl _mbsncpy_l(unsigned char *_Dest,const unsigned char *_Source,size_t _Count,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbsnextc (const unsigned char *_Str); - _CRTIMP unsigned int __cdecl _mbsnextc_l(const unsigned char *_Str,_locale_t _Locale); - _CRTIMP int __cdecl _mbsnicmp(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsnicmp_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP int __cdecl _mbsnicoll(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsnicoll_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsninc(const unsigned char *_Str,size_t _Count); - _CRTIMP unsigned char *__cdecl _mbsninc_l(const unsigned char *_Str,size_t _Count,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsnset(unsigned char *_Dst,unsigned int _Val,size_t _MaxCount); - _CRTIMP unsigned char *__cdecl _mbsnset_l(unsigned char *_Dst,unsigned int _Val,size_t _MaxCount,_locale_t _Locale); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbspbrk(const unsigned char *_Str,const unsigned char *_Control); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbspbrk_l(const unsigned char *_Str,const unsigned char *_Control,_locale_t _Locale); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbsrchr(const unsigned char *_Str,unsigned int _Ch); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbsrchr_l(const unsigned char *_Str,unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsrev(unsigned char *_Str); - _CRTIMP unsigned char *__cdecl _mbsrev_l(unsigned char *_Str,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsset(unsigned char *_Str,unsigned int _Val); - _CRTIMP unsigned char *__cdecl _mbsset_l(unsigned char *_Str,unsigned int _Val,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbsspn(const unsigned char *_Str,const unsigned char *_Control); - _CRTIMP size_t __cdecl _mbsspn_l(const unsigned char *_Str,const unsigned char *_Control,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsspnp(const unsigned char *_Str1,const unsigned char *_Str2); - _CRTIMP unsigned char *__cdecl _mbsspnp_l(const unsigned char *_Str1,const unsigned char *_Str2,_locale_t _Locale); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbsstr(const unsigned char *_Str,const unsigned char *_Substr); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbsstr_l(const unsigned char *_Str,const unsigned char *_Substr,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbstok(unsigned char *_Str,const unsigned char *_Delim); - _CRTIMP unsigned char *__cdecl _mbstok_l(unsigned char *_Str,const unsigned char *_Delim,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsupr(unsigned char *_String); - _CRTIMP unsigned char *_mbsupr_l(unsigned char *_String,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbclen(const unsigned char *_Str); - _CRTIMP size_t __cdecl _mbclen_l(const unsigned char *_Str,_locale_t _Locale); - _CRTIMP void __cdecl _mbccpy(unsigned char *_Dst,const unsigned char *_Src); - _CRTIMP void __cdecl _mbccpy_l(unsigned char *_Dst,const unsigned char *_Src,_locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsdup( + _In_z_ const unsigned char *_Str); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbbtombc( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbbtombc_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbbtype( + _In_ unsigned char _Ch, + _In_ int _CType); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbbtype_l( + _In_ unsigned char _Ch, + _In_ int _CType, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctombb( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctombb_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _CRTIMP + int + __cdecl + _mbsbtype( + _In_reads_bytes_(_Pos) _Pre_z_ const unsigned char *_Str, + _In_ size_t _Pos); + + _CRTIMP + int + __cdecl + _mbsbtype_l( + _In_reads_bytes_(_Pos) _Pre_z_ const unsigned char *_Str, + _In_ size_t _Pos, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbscat( + _Inout_updates_z_(_String_length_(_Curr_) + _String_length_(_Source) + 1) unsigned char *_Dest, + _In_z_ const unsigned char *_Source); + + _CRTIMP + unsigned char* + _mbscat_l( + _Inout_z_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbschr( + _In_z_ const unsigned char *_Str, + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbschr_l( + _In_z_ const unsigned char *_Str, + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbscmp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbscmp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbscoll( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbscoll_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbscpy( + _Out_writes_z_(_String_length_(_Source) + 1) unsigned char *_Dest, + _In_z_ const unsigned char *_Source); + + _CRTIMP + unsigned char* + _mbscpy_l( + _Pre_notnull_ _Post_z_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbscspn( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Control); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbscspn_l( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Control, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsdec( + _In_reads_z_(_Pos-_Start + 1) const unsigned char *_Start, + _In_z_ const unsigned char *_Pos); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsdec_l( + _In_reads_z_(_Pos-_Start + 1) const unsigned char *_Start, + _In_z_ const unsigned char *_Pos, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsicmp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsicmp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsicoll( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsicoll_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsinc( + _In_z_ const unsigned char *_Ptr); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsinc_l( + _In_z_ const unsigned char *_Ptr, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbslen( + _In_z_ const unsigned char *_Str); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbslen_l( + _In_z_ const unsigned char *_Str, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsnlen( + _In_z_ const unsigned char *_Str, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsnlen_l( + _In_z_ const unsigned char *_Str, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbslwr( + _Inout_z_ unsigned char *_String); + + _CRTIMP + unsigned char* + _mbslwr_l( + _Inout_z_ unsigned char *_String, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsnbcat( + _Inout_z_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count); + + _CRTIMP + unsigned char* + __cdecl + _mbsnbcat_l( + _Inout_z_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbcmp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbcmp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbcoll( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbcoll_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsnbcnt( + _In_reads_bytes_(_MaxCount) _Pre_z_ const unsigned char *_Str, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsnbcnt_l( + _In_reads_bytes_(_MaxCount) _Pre_z_ const unsigned char *_Str, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsnbcpy( + _Out_writes_(_Count) _Post_maybez_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count); + + _CRTIMP + int + __cdecl + _mbsnbcpy_s( + _Out_writes_z_(size) unsigned char* dst, + _In_ size_t size, + _In_z_ const unsigned char* src, + _In_ size_t n); + + _CRTIMP + unsigned char* + __cdecl + _mbsnbcpy_l( + _Out_writes_(_Count) _Post_maybez_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbicmp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbicmp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbicoll( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbicoll_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsnbset( + _Inout_updates_z_(_MaxCount) unsigned char *_Str, + _In_ unsigned int _Ch, + _In_ size_t _MaxCount); + + _CRTIMP + unsigned char* + __cdecl + _mbsnbset_l( + _Inout_updates_z_(_MaxCount) unsigned char *_Str, + _In_ unsigned int _Ch, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsncat( + _Inout_z_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count); + + _CRTIMP + unsigned char* + __cdecl + _mbsncat_l( + _Inout_z_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsnccnt( + _In_reads_bytes_(_MaxCount) _Pre_z_ const unsigned char *_Str, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsnccnt_l( + _In_reads_bytes_(_MaxCount) _Pre_z_ const unsigned char *_Str, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsncmp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsncmp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsncoll( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsncoll_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsncpy( + _Pre_notnull_ _Out_writes_(2 * _Count) _Post_maybez_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count); + + _CRTIMP + unsigned char* + __cdecl + _mbsncpy_l( + _Out_writes_(_Count) _Post_maybez_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbsnextc( + _In_z_ const unsigned char *_Str); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbsnextc_l( + _In_z_ const unsigned char *_Str, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnicmp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnicmp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnicoll( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnicoll_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsninc( + _In_reads_bytes_(_Count) _Pre_z_ const unsigned char *_Str, + _In_ size_t _Count); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsninc_l( + _In_reads_bytes_(_Count) _Pre_z_ const unsigned char *_Str, + _In_ size_t _Count, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsnset( + _Inout_updates_z_(_MaxCount) unsigned char *_Dst, + _In_ unsigned int _Val, + _In_ size_t _MaxCount); + + _CRTIMP + unsigned char* + __cdecl + _mbsnset_l( + _Inout_updates_z_(_MaxCount) unsigned char *_Dst, + _In_ unsigned int _Val, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbspbrk( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Control); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbspbrk_l( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Control, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbsrchr( + _In_z_ const unsigned char *_Str, + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbsrchr_l( + _In_z_ const unsigned char *_Str, + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsrev( + _Inout_z_ unsigned char *_Str); + + _CRTIMP + unsigned char* + __cdecl + _mbsrev_l( + _Inout_z_ unsigned char *_Str, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsset( + _Inout_z_ unsigned char *_Str, + _In_ unsigned int _Val); + + _CRTIMP + unsigned char* + __cdecl + _mbsset_l( + _Inout_z_ unsigned char *_Str, + _In_ unsigned int _Val, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsspn( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Control); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsspn_l( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Control, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsspnp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsspnp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbsstr( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Substr); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbsstr_l( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Substr, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbstok( + _Inout_opt_z_ unsigned char *_Str, + _In_z_ const unsigned char *_Delim); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbstok_l( + _Inout_opt_z_ unsigned char *_Str, + _In_z_ const unsigned char *_Delim, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsupr( + _Inout_z_ unsigned char *_String); + + _CRTIMP + unsigned char* + _mbsupr_l( + _Inout_z_ unsigned char *_String, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbclen( + _In_z_ const unsigned char *_Str); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbclen_l( + _In_z_ const unsigned char *_Str, + _In_opt_ _locale_t _Locale); + + _CRTIMP + void + __cdecl + _mbccpy( + _Out_writes_bytes_(2) unsigned char *_Dst, + _In_z_ const unsigned char *_Src); + + _CRTIMP + void + __cdecl + _mbccpy_l( + _Out_writes_bytes_(2) unsigned char *_Dst, + _In_z_ const unsigned char *_Src, + _In_opt_ _locale_t _Locale); + #define _mbccmp(_cpc1,_cpc2) _mbsncmp((_cpc1),(_cpc2),1) #ifdef __cplusplus @@ -143,64 +834,406 @@ extern "C" { #endif #endif - _CRTIMP int __cdecl _ismbcalnum(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcalnum_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcalpha(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcalpha_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcdigit(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcdigit_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcgraph(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcgraph_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbclegal(unsigned int _Ch); - _CRTIMP int __cdecl _ismbclegal_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbclower(unsigned int _Ch); - _CRTIMP int __cdecl _ismbclower_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcprint(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcprint_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcpunct(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcpunct_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcspace(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcspace_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcupper(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcupper_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbctolower(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbctolower_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbctoupper(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbctoupper_l(unsigned int _Ch,_locale_t _Locale); -#endif + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcalnum( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcalnum_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcalpha( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcalpha_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcdigit( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcdigit_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcgraph( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcgraph_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbclegal( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbclegal_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbclower( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbclower_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcprint( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcprint_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcpunct( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcpunct_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcspace( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcspace_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcupper( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + __cdecl _ismbcupper_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctolower( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctolower_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctoupper( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctoupper_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + +#endif /* _MBSTRING_DEFINED */ #ifndef _MBLEADTRAIL_DEFINED #define _MBLEADTRAIL_DEFINED - _CRTIMP int __cdecl _ismbblead(unsigned int _Ch); - _CRTIMP int __cdecl _ismbblead_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbbtrail(unsigned int _Ch); - _CRTIMP int __cdecl _ismbbtrail_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbslead(const unsigned char *_Str,const unsigned char *_Pos); - _CRTIMP int __cdecl _ismbslead_l(const unsigned char *_Str,const unsigned char *_Pos,_locale_t _Locale); - _CRTIMP int __cdecl _ismbstrail(const unsigned char *_Str,const unsigned char *_Pos); - _CRTIMP int __cdecl _ismbstrail_l(const unsigned char *_Str,const unsigned char *_Pos,_locale_t _Locale); -#endif - _CRTIMP int __cdecl _ismbchira(unsigned int _Ch); - _CRTIMP int __cdecl _ismbchira_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbckata(unsigned int _Ch); - _CRTIMP int __cdecl _ismbckata_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcsymbol(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcsymbol_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcl0(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcl0_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcl1(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcl1_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcl2(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcl2_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbcjistojms(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbcjistojms_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbcjmstojis(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbcjmstojis_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbctohira(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbctohira_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbctokata(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbctokata_l(unsigned int _Ch,_locale_t _Locale); + _Check_return_ + _CRTIMP + int + __cdecl + _ismbblead( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbblead_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbbtrail( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbbtrail_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbslead( + _In_reads_z_(_Pos - _Str + 1) const unsigned char *_Str, + _In_z_ const unsigned char *_Pos); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbslead_l( + _In_reads_z_(_Pos - _Str + 1) const unsigned char *_Str, + _In_z_ const unsigned char *_Pos, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbstrail( + _In_reads_z_(_Pos - _Str + 1) const unsigned char *_Str, + _In_z_ const unsigned char *_Pos); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbstrail_l( + _In_reads_z_(_Pos - _Str + 1) const unsigned char *_Str, + _In_z_ const unsigned char *_Pos, + _In_opt_ _locale_t _Locale); + +#endif /* _MBLEADTRAIL_DEFINED */ + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbchira( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbchira_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbckata( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbckata_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcsymbol( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcsymbol_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcl0( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcl0_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcl1( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcl1_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcl2( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcl2_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbcjistojms( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbcjistojms_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbcjmstojis( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbcjmstojis_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctohira( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctohira_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctokata( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctokata_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); #ifdef __cplusplus } @@ -210,4 +1243,4 @@ extern "C" { #include -#endif +#endif /* _INC_MBSTRING */ diff --git a/include/crt/msc/intrin.h b/include/crt/msc/intrin.h index 6875399828e..d021a782168 100644 --- a/include/crt/msc/intrin.h +++ b/include/crt/msc/intrin.h @@ -117,6 +117,8 @@ void __movsd(unsigned long * Destination, unsigned long const * Source, size_t C #pragma intrinsic(__movsd) #endif #ifdef _M_AMD64 +void __stosq(unsigned __int64 * Dest, unsigned __int64 Data, size_t Count); +#pragma intrinsic(__stosq) void __movsq(unsigned __int64 * Destination, unsigned __int64 const * Source, size_t Count); #pragma intrinsic(__movsq) #endif diff --git a/include/crt/sys/stat.h b/include/crt/sys/stat.h index 45ec7eaad57..766536c7c8a 100644 --- a/include/crt/sys/stat.h +++ b/include/crt/sys/stat.h @@ -139,30 +139,122 @@ extern "C" { #define _S_IWRITE 0x0080 #define _S_IEXEC 0x0040 - _CRTIMP int __cdecl _fstat(int _FileDes,struct _stat *_Stat); - _CRTIMP int __cdecl _fstat32(int _FileDes,struct _stat32 *_Stat); - _CRTIMP int __cdecl _stat(const char *_Name,struct _stat *_Stat); - _CRTIMP int __cdecl _stat32(const char *_Name,struct _stat32 *_Stat); + _CRTIMP + int + __cdecl + _fstat( + _In_ int _FileDes, + _Out_ struct _stat *_Stat); + + _CRTIMP + int + __cdecl + _fstat32( + _In_ int _FileDes, + _Out_ struct _stat32 *_Stat); + + _CRTIMP + int + __cdecl + _stat( + _In_z_ const char *_Name, + _Out_ struct _stat *_Stat); + + _CRTIMP + int + __cdecl + _stat32( + _In_z_ const char *_Name, + _Out_ struct _stat32 *_Stat); #if _INTEGRAL_MAX_BITS >= 64 - _CRTIMP int __cdecl _fstat64(int _FileDes,struct _stat64 *_Stat); - _CRTIMP int __cdecl _fstat32i64(int _FileDes,struct _stat32i64 *_Stat); - _CRTIMP int __cdecl _fstat64i32(int _FileDes,struct _stat64i32 *_Stat); - _CRTIMP int __cdecl _stat64(const char *_Name,struct _stat64 *_Stat); - _CRTIMP int __cdecl _stat32i64(const char *_Name,struct _stat32i64 *_Stat); - _CRTIMP int __cdecl _stat64i32(const char *_Name,struct _stat64i32 *_Stat); + + _CRTIMP + int + __cdecl + _fstat64( + _In_ int _FileDes, + _Out_ struct _stat64 *_Stat); + + _CRTIMP + int + __cdecl + _fstat32i64( + _In_ int _FileDes, + _Out_ struct _stat32i64 *_Stat); + + _CRTIMP + int + __cdecl + _fstat64i32( + _In_ int _FileDes, + _Out_ struct _stat64i32 *_Stat); + + _CRTIMP + int + __cdecl + _stat64( + _In_z_ const char *_Name, + _Out_ struct _stat64 *_Stat); + + _CRTIMP + int + __cdecl + _stat32i64( + _In_z_ const char *_Name, + _Out_ struct _stat32i64 *_Stat); + + _CRTIMP + int + __cdecl + _stat64i32( + _In_z_ const char *_Name, + _Out_ struct _stat64i32 *_Stat); + #endif /* _INTEGRAL_MAX_BITS >= 64 */ #ifndef _WSTAT_DEFINED #define _WSTAT_DEFINED - _CRTIMP int __cdecl _wstat(const wchar_t *_Name,struct _stat *_Stat); - _CRTIMP int __cdecl _wstat32(const wchar_t *_Name,struct _stat32 *_Stat); + + _CRTIMP + int + __cdecl + _wstat( + _In_z_ const wchar_t *_Name, + _Out_ struct _stat *_Stat); + + _CRTIMP + int + __cdecl + _wstat32( + _In_z_ const wchar_t *_Name, + _Out_ struct _stat32 *_Stat); + #if _INTEGRAL_MAX_BITS >= 64 - _CRTIMP int __cdecl _wstat32i64(const wchar_t *_Name,struct _stat32i64 *_Stat); - _CRTIMP int __cdecl _wstat64i32(const wchar_t *_Name,struct _stat64i32 *_Stat); - _CRTIMP int __cdecl _wstat64(const wchar_t *_Name,struct _stat64 *_Stat); -#endif -#endif + _CRTIMP + int + __cdecl + _wstat32i64( + _In_z_ const wchar_t *_Name, + _Out_ struct _stat32i64 *_Stat); + + _CRTIMP + int + __cdecl + _wstat64i32( + _In_z_ const wchar_t *_Name, + _Out_ struct _stat64i32 *_Stat); + + _CRTIMP + int + __cdecl + _wstat64( + _In_z_ const wchar_t *_Name, + _Out_ struct _stat64 *_Stat); + +#endif /* _INTEGRAL_MAX_BITS >= 64 */ + +#endif /* _WSTAT_DEFINED */ /** Compatibility definitons *************************************************/ diff --git a/include/crt/sys/timeb.h b/include/crt/sys/timeb.h index 574c9704f27..c4ba001033b 100644 --- a/include/crt/sys/timeb.h +++ b/include/crt/sys/timeb.h @@ -55,13 +55,41 @@ extern "C" { #endif /* !_TIMEB_DEFINED */ - _CRTIMP void __cdecl _ftime(struct _timeb *_Time); - _CRT_INSECURE_DEPRECATE(_ftime32_s) _CRTIMP void __cdecl _ftime32(struct __timeb32 *_Time); - _CRTIMP errno_t __cdecl _ftime32_s(struct __timeb32 *_Time); + _CRTIMP + void + __cdecl + _ftime( + _Out_ struct _timeb *_Time); + + _CRT_INSECURE_DEPRECATE(_ftime32_s) + _CRTIMP + void + __cdecl + _ftime32( + _Out_ struct __timeb32 *_Time); + + _CRTIMP + errno_t + __cdecl + _ftime32_s( + _Out_ struct __timeb32 *_Time); + #if _INTEGRAL_MAX_BITS >= 64 - _CRT_INSECURE_DEPRECATE(_ftime64_s) _CRTIMP void __cdecl _ftime64(struct __timeb64 *_Time); - _CRTIMP errno_t __cdecl _ftime64_s(struct __timeb64 *_Time); -#endif + + _CRT_INSECURE_DEPRECATE(_ftime64_s) + _CRTIMP + void + __cdecl + _ftime64( + _Out_ struct __timeb64 *_Time); + + _CRTIMP + errno_t + __cdecl + _ftime64_s( + _Out_ struct __timeb64 *_Time); + +#endif /* _INTEGRAL_MAX_BITS >= 64 */ #ifndef NO_OLDNAMES #if !defined (RC_INVOKED) diff --git a/include/ddk/ntsam.h b/include/ddk/ntsam.h index 16883866db6..79e4f84fdcc 100644 --- a/include/ddk/ntsam.h +++ b/include/ddk/ntsam.h @@ -225,6 +225,19 @@ extern "C" { #define USER_ALL_OWFPASSWORD 0x20000000 #define USER_ALL_UNDEFINED_MASK 0xC0000000 +#define USER_ALL_READ_GENERAL_MASK 0x0000003F +#define USER_ALL_READ_LOGON_MASK 0x0003FFC0 +#define USER_ALL_READ_ACCOUNT_MASK 0x003C0000 +#define USER_ALL_READ_PREFERENCES_MASK 0x00C00000 +#define USER_ALL_READ_TRUSTED_MASK 0x1F000000 +#define USER_ALL_READ_CANT_MASK 0xC0000000 + +#define USER_ALL_WRITE_ACCOUNT_MASK 0x003827DB +#define USER_ALL_WRITE_PREFERENCES_MASK 0x00C00020 +#define USER_ALL_WRITE_FORCE_PASSWORD_CHANGE_MASK 0x0B000000 +#define USER_ALL_WRITE_TRUSTED_MASK 0x1404D800 +#define USER_ALL_WRITE_CANT_MASK 0xC0030004 + /* Values used by USER_PWD_CHANGE_FAILURE_INFORMATION.ExtendedFailureReason */ #define SAM_PWD_CHANGE_NO_ERROR 0 #define SAM_PWD_CHANGE_PASSWORD_TOO_SHORT 1 diff --git a/include/ddk/ntstrsafe.h b/include/ddk/ntstrsafe.h index b44910b7db8..b2a199cec47 100644 --- a/include/ddk/ntstrsafe.h +++ b/include/ddk/ntstrsafe.h @@ -59,6 +59,11 @@ typedef const char *STRSAFE_LPCSTR; typedef wchar_t *STRSAFE_LPWSTR; typedef const wchar_t *STRSAFE_LPCWSTR; +typedef _Null_terminated_ char *NTSTRSAFE_PSTR; +typedef _Null_terminated_ const char *NTSTRSAFE_PCSTR; +typedef _Null_terminated_ wchar_t *NTSTRSAFE_PWSTR; +typedef _Null_terminated_ const wchar_t *NTSTRSAFE_PCWSTR; + typedef ULONG STRSAFE_DWORD; NTSTRSAFEAPI RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc); @@ -81,38 +86,79 @@ NTSTRSAFEAPI RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAF NTSTRSAFEAPI RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList); NTSTRSAFEAPI RtlStringVPrintfExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList); NTSTRSAFEAPI RtlStringVPrintfExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList); -NTSTRSAFEAPI RtlStringLengthWorkerA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength); -NTSTRSAFEAPI RtlStringLengthWorkerW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength); -NTSTRSAFEAPI RtlStringCchCopyA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc); -NTSTRSAFEAPI RtlStringCchCopyW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc); +NTSTRSAFEAPI +RtlStringLengthWorkerA( + _In_reads_or_z_(cchMax) STRSAFE_LPCSTR psz, + _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) size_t *pcchLength); +NTSTRSAFEAPI +RtlStringLengthWorkerW( + _In_reads_or_z_(cchMax) STRSAFE_LPCWSTR psz, + _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) size_t *pcchLength); -NTSTRSAFEAPI RtlStringCchCopyA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc) +NTSTRSAFEAPI +RtlStringCchCopyA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc); + +NTSTRSAFEAPI +RtlStringCchCopyW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc); + +NTSTRSAFEAPI +RtlStringCchCopyA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc) { return (cchDest > NTSTRSAFE_MAX_CCH ? STATUS_INVALID_PARAMETER : RtlStringCopyWorkerA(pszDest,cchDest,pszSrc)); } -NTSTRSAFEAPI RtlStringCchCopyW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc) +NTSTRSAFEAPI +RtlStringCchCopyW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyWorkerW(pszDest,cchDest,pszSrc); } +NTSTRSAFEAPI +RtlStringCbCopyA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc); -NTSTRSAFEAPI RtlStringCbCopyA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc); -NTSTRSAFEAPI RtlStringCbCopyW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc); +NTSTRSAFEAPI +RtlStringCbCopyW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc); - -NTSTRSAFEAPI RtlStringCbCopyA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc) +NTSTRSAFEAPI +RtlStringCbCopyA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc) { if (cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyWorkerA(pszDest,cbDest,pszSrc); } -NTSTRSAFEAPI RtlStringCbCopyW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc) +NTSTRSAFEAPI +RtlStringCbCopyW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc) { size_t cchDest = cbDest / sizeof(wchar_t); if (cchDest > NTSTRSAFE_MAX_CCH) @@ -120,19 +166,46 @@ NTSTRSAFEAPI RtlStringCbCopyW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWS return RtlStringCopyWorkerW(pszDest,cchDest,pszSrc); } +NTSTRSAFEAPI +RtlStringCchCopyExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCopyExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCopyExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCchCopyExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCchCopyExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCopyExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyExWorkerA(pszDest,cchDest,cchDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); } -NTSTRSAFEAPI RtlStringCchCopyExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCopyExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { size_t cbDest; if (cchDest > NTSTRSAFE_MAX_CCH) @@ -141,12 +214,32 @@ NTSTRSAFEAPI RtlStringCchCopyExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_L return RtlStringCopyExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); } +NTSTRSAFEAPI +RtlStringCbCopyExA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) STRSAFE_LPSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCopyExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCopyExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCbCopyExW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCbCopyExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCopyExA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) STRSAFE_LPSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchRemaining = 0; @@ -161,7 +254,14 @@ NTSTRSAFEAPI RtlStringCbCopyExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCS return Status; } -NTSTRSAFEAPI RtlStringCbCopyExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCopyExW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchDest = cbDest / sizeof(wchar_t); @@ -178,38 +278,77 @@ NTSTRSAFEAPI RtlStringCbCopyExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPC return Status; } +NTSTRSAFEAPI +RtlStringCchCopyNA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToCopy); -NTSTRSAFEAPI RtlStringCchCopyNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy); -NTSTRSAFEAPI RtlStringCchCopyNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy); +NTSTRSAFEAPI +RtlStringCchCopyNW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToCopy); -NTSTRSAFEAPI RtlStringCchCopyNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy) +NTSTRSAFEAPI +RtlStringCchCopyNA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToCopy) { if (cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyNWorkerA(pszDest,cchDest,pszSrc,cchToCopy); } -NTSTRSAFEAPI RtlStringCchCopyNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy) +NTSTRSAFEAPI +RtlStringCchCopyNW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToCopy) { if (cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyNWorkerW(pszDest,cchDest,pszSrc,cchToCopy); } +NTSTRSAFEAPI +RtlStringCbCopyNA( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToCopy); -NTSTRSAFEAPI RtlStringCbCopyNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy); -NTSTRSAFEAPI RtlStringCbCopyNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy); +NTSTRSAFEAPI +RtlStringCbCopyNW( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToCopy); - -NTSTRSAFEAPI RtlStringCbCopyNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy) +NTSTRSAFEAPI +RtlStringCbCopyNA( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToCopy) { if (cbDest > NTSTRSAFE_MAX_CCH || cbToCopy > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyNWorkerA(pszDest,cbDest,pszSrc,cbToCopy); } -NTSTRSAFEAPI RtlStringCbCopyNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy) +NTSTRSAFEAPI +RtlStringCbCopyNW( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToCopy) { size_t cchDest = cbDest / sizeof(wchar_t); size_t cchToCopy = cbToCopy / sizeof(wchar_t); @@ -218,31 +357,85 @@ NTSTRSAFEAPI RtlStringCbCopyNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCW return RtlStringCopyNWorkerW(pszDest,cchDest,pszSrc,cchToCopy); } +NTSTRSAFEAPI +RtlStringCchCopyNExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToCopy, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCopyNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCopyNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCchCopyNExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToCopy, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCchCopyNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCopyNExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToCopy, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyNExWorkerA(pszDest,cchDest,cchDest,pszSrc,cchToCopy,ppszDestEnd,pcchRemaining,dwFlags); } -NTSTRSAFEAPI RtlStringCchCopyNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCopyNExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToCopy, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyNExWorkerW(pszDest,cchDest,cchDest * sizeof(wchar_t),pszSrc,cchToCopy,ppszDestEnd,pcchRemaining,dwFlags); } +NTSTRSAFEAPI +RtlStringCbCopyNExA( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToCopy, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCopyNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCopyNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCbCopyNExW( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToCopy, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCbCopyNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCopyNExA( + _Out_writes_bytes_(cbDest) STRSAFE_LPSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToCopy, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) STRSAFE_LPSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchRemaining = 0; @@ -255,7 +448,15 @@ NTSTRSAFEAPI RtlStringCbCopyNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPC return Status; } -NTSTRSAFEAPI RtlStringCbCopyNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCopyNExW( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToCopy, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchDest; @@ -272,38 +473,68 @@ NTSTRSAFEAPI RtlStringCbCopyNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LP return Status; } +NTSTRSAFEAPI +RtlStringCchCatA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc); -NTSTRSAFEAPI RtlStringCchCatA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc); -NTSTRSAFEAPI RtlStringCchCatW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc); +NTSTRSAFEAPI +RtlStringCchCatW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc); - -NTSTRSAFEAPI RtlStringCchCatA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc) +NTSTRSAFEAPI +RtlStringCchCatA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatWorkerA(pszDest,cchDest,pszSrc); } -NTSTRSAFEAPI RtlStringCchCatW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc) +NTSTRSAFEAPI +RtlStringCchCatW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatWorkerW(pszDest,cchDest,pszSrc); } +NTSTRSAFEAPI +RtlStringCbCatA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc); -NTSTRSAFEAPI RtlStringCbCatA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc); -NTSTRSAFEAPI RtlStringCbCatW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc); +NTSTRSAFEAPI +RtlStringCbCatW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc); - -NTSTRSAFEAPI RtlStringCbCatA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc) +NTSTRSAFEAPI +RtlStringCbCatA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc) { if (cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatWorkerA(pszDest,cbDest,pszSrc); } -NTSTRSAFEAPI RtlStringCbCatW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc) +NTSTRSAFEAPI +RtlStringCbCatW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc) { size_t cchDest = cbDest / sizeof(wchar_t); if (cchDest > NTSTRSAFE_MAX_CCH) @@ -311,19 +542,46 @@ NTSTRSAFEAPI RtlStringCbCatW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWST return RtlStringCatWorkerW(pszDest,cchDest,pszSrc); } +NTSTRSAFEAPI +RtlStringCchCatExA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCatExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCatExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCchCatExW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCchCatExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCatExA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatExWorkerA(pszDest,cchDest,cchDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); } -NTSTRSAFEAPI RtlStringCchCatExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCatExW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { size_t cbDest = cchDest*sizeof(wchar_t); if (cchDest > NTSTRSAFE_MAX_CCH) @@ -331,12 +589,32 @@ NTSTRSAFEAPI RtlStringCchCatExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LP return RtlStringCatExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); } +NTSTRSAFEAPI +RtlStringCbCatExA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCatExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCatExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCbCatExW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCbCatExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCatExA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchRemaining = 0; @@ -349,7 +627,14 @@ NTSTRSAFEAPI RtlStringCbCatExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCST return Status; } -NTSTRSAFEAPI RtlStringCbCatExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCatExW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchDest = cbDest / sizeof(wchar_t); @@ -364,38 +649,76 @@ NTSTRSAFEAPI RtlStringCbCatExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCW return Status; } +NTSTRSAFEAPI +RtlStringCchCatNA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToAppend); -NTSTRSAFEAPI RtlStringCchCatNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend); -NTSTRSAFEAPI RtlStringCchCatNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend); +NTSTRSAFEAPI +RtlStringCchCatNW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToAppend); - -NTSTRSAFEAPI RtlStringCchCatNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend) +NTSTRSAFEAPI +RtlStringCchCatNA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToAppend) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatNWorkerA(pszDest,cchDest,pszSrc,cchToAppend); } -NTSTRSAFEAPI RtlStringCchCatNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend) +NTSTRSAFEAPI +RtlStringCchCatNW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToAppend) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatNWorkerW(pszDest,cchDest,pszSrc,cchToAppend); } +NTSTRSAFEAPI +RtlStringCbCatNA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToAppend); -NTSTRSAFEAPI RtlStringCbCatNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend); -NTSTRSAFEAPI RtlStringCbCatNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend); +NTSTRSAFEAPI +RtlStringCbCatNW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToAppend); - -NTSTRSAFEAPI RtlStringCbCatNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend) +NTSTRSAFEAPI +RtlStringCbCatNA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToAppend) { if (cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatNWorkerA(pszDest,cbDest,pszSrc,cbToAppend); } -NTSTRSAFEAPI RtlStringCbCatNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend) +NTSTRSAFEAPI +RtlStringCbCatNW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToAppend) { size_t cchDest = cbDest / sizeof(wchar_t); size_t cchToAppend = cbToAppend / sizeof(wchar_t); @@ -405,31 +728,85 @@ NTSTRSAFEAPI RtlStringCbCatNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWS return RtlStringCatNWorkerW(pszDest,cchDest,pszSrc,cchToAppend); } +NTSTRSAFEAPI +RtlStringCchCatNExA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToAppend, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCatNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCatNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCchCatNExW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToAppend, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCchCatNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCatNExA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToAppend, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatNExWorkerA(pszDest,cchDest,cchDest,pszSrc,cchToAppend,ppszDestEnd,pcchRemaining,dwFlags); } -NTSTRSAFEAPI RtlStringCchCatNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCatNExW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToAppend, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatNExWorkerW(pszDest,cchDest,(cchDest*sizeof(wchar_t)),pszSrc,cchToAppend,ppszDestEnd,pcchRemaining,dwFlags); } +NTSTRSAFEAPI +RtlStringCbCatNExA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToAppend, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCatNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCatNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCbCatNExW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToAppend, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCbCatNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCatNExA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToAppend, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchRemaining = 0; @@ -442,7 +819,15 @@ NTSTRSAFEAPI RtlStringCbCatNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCS return Status; } -NTSTRSAFEAPI RtlStringCbCatNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCatNExW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToAppend, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchDest = cbDest / sizeof(wchar_t); @@ -457,38 +842,76 @@ NTSTRSAFEAPI RtlStringCbCatNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPC return Status; } +NTSTRSAFEAPI +RtlStringCchVPrintfA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList); -NTSTRSAFEAPI RtlStringCchVPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,va_list argList); -NTSTRSAFEAPI RtlStringCchVPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList); +NTSTRSAFEAPI +RtlStringCchVPrintfW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList); - -NTSTRSAFEAPI RtlStringCchVPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCchVPrintfA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringVPrintfWorkerA(pszDest,cchDest,pszFormat,argList); } -NTSTRSAFEAPI RtlStringCchVPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCchVPrintfW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList); } +NTSTRSAFEAPI +RtlStringCbVPrintfA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList); -NTSTRSAFEAPI RtlStringCbVPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,va_list argList); -NTSTRSAFEAPI RtlStringCbVPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,va_list argList); +NTSTRSAFEAPI +RtlStringCbVPrintfW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList); - -NTSTRSAFEAPI RtlStringCbVPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCbVPrintfA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList) { if (cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringVPrintfWorkerA(pszDest,cbDest,pszFormat,argList); } -NTSTRSAFEAPI RtlStringCbVPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCbVPrintfW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList) { size_t cchDest = cbDest / sizeof(wchar_t); if (cchDest > NTSTRSAFE_MAX_CCH) @@ -496,12 +919,26 @@ NTSTRSAFEAPI RtlStringCbVPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LP return RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList); } +NTSTRSAFEAPI +RtlStringCchPrintfA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...); -NTSTRSAFEAPI RtlStringCchPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,...); -NTSTRSAFEAPI RtlStringCchPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,...); +NTSTRSAFEAPI +RtlStringCchPrintfW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...); - -NTSTRSAFEAPI RtlStringCchPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCchPrintfA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...) { NTSTATUS Status; va_list argList; @@ -513,7 +950,12 @@ NTSTRSAFEAPI RtlStringCchPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LP return Status; } -NTSTRSAFEAPI RtlStringCchPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCchPrintfW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...) { NTSTATUS Status; va_list argList; @@ -525,12 +967,26 @@ NTSTRSAFEAPI RtlStringCchPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_L return Status; } +NTSTRSAFEAPI +RtlStringCbPrintfA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...); -NTSTRSAFEAPI RtlStringCbPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,...); -NTSTRSAFEAPI RtlStringCbPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,...); +NTSTRSAFEAPI +RtlStringCbPrintfW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...); - -NTSTRSAFEAPI RtlStringCbPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCbPrintfA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...) { NTSTATUS Status; va_list argList; @@ -542,7 +998,12 @@ NTSTRSAFEAPI RtlStringCbPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCS return Status; } -NTSTRSAFEAPI RtlStringCbPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCbPrintfW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...) { NTSTATUS Status; va_list argList; @@ -555,12 +1016,35 @@ NTSTRSAFEAPI RtlStringCbPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPC return Status; } +NTSTRSAFEAPI +RtlStringCchPrintfExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...); -NTSTRSAFEAPI RtlStringCchPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,...); -NTSTRSAFEAPI RtlStringCchPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,...); +NTSTRSAFEAPI +RtlStringCchPrintfExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...); - -NTSTRSAFEAPI RtlStringCchPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCchPrintfExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...) { NTSTATUS Status; va_list argList; @@ -572,7 +1056,15 @@ NTSTRSAFEAPI RtlStringCchPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_ return Status; } -NTSTRSAFEAPI RtlStringCchPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCchPrintfExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...) { NTSTATUS Status; size_t cbDest = cchDest * sizeof(wchar_t); @@ -585,12 +1077,35 @@ NTSTRSAFEAPI RtlStringCchPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE return Status; } +NTSTRSAFEAPI +RtlStringCbPrintfExA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...); -NTSTRSAFEAPI RtlStringCbPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,...); -NTSTRSAFEAPI RtlStringCbPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,...); +NTSTRSAFEAPI +RtlStringCbPrintfExW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...); - -NTSTRSAFEAPI RtlStringCbPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCbPrintfExA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...) { NTSTATUS Status; size_t cchDest; @@ -615,7 +1130,15 @@ NTSTRSAFEAPI RtlStringCbPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LP return Status; } -NTSTRSAFEAPI RtlStringCbPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCbPrintfExW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...) { NTSTATUS Status; size_t cchDest; @@ -640,12 +1163,35 @@ NTSTRSAFEAPI RtlStringCbPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_L return Status; } +NTSTRSAFEAPI +RtlStringCchVPrintfExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList); -NTSTRSAFEAPI RtlStringCchVPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList); -NTSTRSAFEAPI RtlStringCchVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList); +NTSTRSAFEAPI +RtlStringCchVPrintfExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList); - -NTSTRSAFEAPI RtlStringCchVPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCchVPrintfExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList) { NTSTATUS Status; if (cchDest > NTSTRSAFE_MAX_CCH) @@ -659,7 +1205,15 @@ NTSTRSAFEAPI RtlStringCchVPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE return Status; } -NTSTRSAFEAPI RtlStringCchVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCchVPrintfExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList) { NTSTATUS Status; if (cchDest > NTSTRSAFE_MAX_CCH) @@ -673,12 +1227,35 @@ NTSTRSAFEAPI RtlStringCchVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAF return Status; } +NTSTRSAFEAPI +RtlStringCbVPrintfExA( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList); -NTSTRSAFEAPI RtlStringCbVPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList); -NTSTRSAFEAPI RtlStringCbVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList); +NTSTRSAFEAPI +RtlStringCbVPrintfExW( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList); - -NTSTRSAFEAPI RtlStringCbVPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCbVPrintfExA( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList) { NTSTATUS Status; size_t cchDest; @@ -698,7 +1275,15 @@ NTSTRSAFEAPI RtlStringCbVPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_L return Status; } -NTSTRSAFEAPI RtlStringCbVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCbVPrintfExW( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList) { NTSTATUS Status; size_t cchDest; @@ -719,11 +1304,26 @@ NTSTRSAFEAPI RtlStringCbVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_ } -NTSTRSAFEAPI RtlStringCchLengthA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength); -NTSTRSAFEAPI RtlStringCchLengthW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength); +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCchLengthA( + _In_reads_or_z_(cchMax) STRSAFE_LPCSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t *pcchLength); +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCchLengthW( + _In_reads_or_z_(cchMax) STRSAFE_LPCWSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t *pcchLength); -NTSTRSAFEAPI RtlStringCchLengthA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength) +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCchLengthA( + _In_reads_or_z_(cchMax) STRSAFE_LPCSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t *pcchLength) { NTSTATUS Status; if (!psz || (cchMax > NTSTRSAFE_MAX_CCH)) @@ -737,7 +1337,12 @@ NTSTRSAFEAPI RtlStringCchLengthA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLe return Status; } -NTSTRSAFEAPI RtlStringCchLengthW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength) +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCchLengthW( + _In_reads_or_z_(cchMax) STRSAFE_LPCWSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t *pcchLength) { NTSTATUS Status; if (!psz || (cchMax > NTSTRSAFE_MAX_CCH)) @@ -751,12 +1356,26 @@ NTSTRSAFEAPI RtlStringCchLengthW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchL return Status; } +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCbLengthA( + _In_reads_or_z_(cbMax) STRSAFE_LPCSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(char)) size_t cbMax, + _Out_opt_ _Deref_out_range_(<, cbMax) size_t *pcbLength); -NTSTRSAFEAPI RtlStringCbLengthA(STRSAFE_LPCSTR psz,size_t cbMax,size_t *pcbLength); -NTSTRSAFEAPI RtlStringCbLengthW(STRSAFE_LPCWSTR psz,size_t cbMax,size_t *pcbLength); +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCbLengthW( + _In_reads_or_z_(cbMax / sizeof(wchar_t)) STRSAFE_LPCWSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(wchar_t)) size_t cbMax, + _Out_opt_ _Deref_out_range_(<, cbMax - 1) size_t *pcbLength); - -NTSTRSAFEAPI RtlStringCbLengthA(STRSAFE_LPCSTR psz,size_t cbMax,size_t *pcbLength) +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCbLengthA( + _In_reads_or_z_(cbMax) STRSAFE_LPCSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(char)) size_t cbMax, + _Out_opt_ _Deref_out_range_(<, cbMax) size_t *pcbLength) { NTSTATUS Status; size_t cchMax; @@ -780,7 +1399,12 @@ NTSTRSAFEAPI RtlStringCbLengthA(STRSAFE_LPCSTR psz,size_t cbMax,size_t *pcbLengt return Status; } -NTSTRSAFEAPI RtlStringCbLengthW(STRSAFE_LPCWSTR psz,size_t cbMax,size_t *pcbLength) +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCbLengthW( + _In_reads_or_z_(cbMax / sizeof(wchar_t)) STRSAFE_LPCWSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(wchar_t)) size_t cbMax, + _Out_opt_ _Deref_out_range_(<, cbMax - 1) size_t *pcbLength) { NTSTATUS Status; size_t cchMax; @@ -2004,7 +2628,11 @@ NTSTRSAFEAPI RtlStringVPrintfExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,siz return Status; } -NTSTRSAFEAPI RtlStringLengthWorkerA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength) +NTSTRSAFEAPI +RtlStringLengthWorkerA( + _In_reads_or_z_(cchMax) STRSAFE_LPCSTR psz, + _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) size_t *pcchLength) { NTSTATUS Status = STATUS_SUCCESS; size_t cchMaxPrev = cchMax; @@ -2025,7 +2653,11 @@ NTSTRSAFEAPI RtlStringLengthWorkerA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcc return Status; } -NTSTRSAFEAPI RtlStringLengthWorkerW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength) +NTSTRSAFEAPI +RtlStringLengthWorkerW( + _In_reads_or_z_(cchMax) STRSAFE_LPCWSTR psz, + _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) size_t *pcchLength) { NTSTATUS Status = STATUS_SUCCESS; size_t cchMaxPrev = cchMax; @@ -2046,8 +2678,6 @@ NTSTRSAFEAPI RtlStringLengthWorkerW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pc return Status; } - - #define RtlStringCopyWorkerA RtlStringCopyWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA; #define RtlStringCopyWorkerW RtlStringCopyWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW; #define RtlStringCopyExWorkerA RtlStringCopyExWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA; diff --git a/include/ddk/usbbusif.h b/include/ddk/usbbusif.h index 81d60941c1c..95f9c67bac3 100644 --- a/include/ddk/usbbusif.h +++ b/include/ddk/usbbusif.h @@ -12,8 +12,9 @@ typedef PVOID PUSB_DEVICE_HANDLE; #endif +typedef _Must_inspect_result_ -typedef NTSTATUS +NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB) ( _In_ PVOID, _In_ PURB); @@ -26,8 +27,9 @@ typedef VOID _Out_opt_ PUSBD_VERSION_INFORMATION, _Out_opt_ PULONG); +typedef _Must_inspect_result_ -typedef NTSTATUS +NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_TIME) ( _In_ PVOID, _Out_opt_ PULONG); @@ -52,8 +54,9 @@ typedef struct _USB_BUS_INFORMATION_LEVEL_1 { WCHAR ControllerNameUnicodeString[1]; } USB_BUS_INFORMATION_LEVEL_1, *PUSB_BUS_INFORMATION_LEVEL_1; +typedef _Must_inspect_result_ -typedef NTSTATUS +NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_INFORMATION) ( _In_ PVOID, _In_ ULONG, @@ -61,8 +64,9 @@ typedef NTSTATUS _Out_ PULONG, _Out_opt_ PULONG); +typedef _Must_inspect_result_ -typedef BOOLEAN +BOOLEAN (USB_BUSIFFN *PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED) ( _In_opt_ PVOID); @@ -117,14 +121,16 @@ typedef struct _USB_BUS_INTERFACE_USBDI_V2 { #if (NTDDI_VERSION >= NTDDI_VISTA) +typedef _Must_inspect_result_ -typedef NTSTATUS +NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_TIME_EX) ( _In_opt_ PVOID, _Out_opt_ PULONG); +typedef _Must_inspect_result_ -typedef NTSTATUS +NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_CONTROLLER_TYPE) ( _In_opt_ PVOID, _Out_opt_ PULONG, @@ -167,8 +173,9 @@ typedef struct _USBC_FUNCTION_DESCRIPTOR{ PVOID Reserved; } USBC_FUNCTION_DESCRIPTOR, *PUSBC_FUNCTION_DESCRIPTOR; +typedef _Must_inspect_result_ -typedef NTSTATUS +NTSTATUS (USB_BUSIFFN *USBC_START_DEVICE_CALLBACK)( _In_ PUSB_DEVICE_DESCRIPTOR DeviceDescriptor, _In_ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, @@ -178,8 +185,9 @@ typedef NTSTATUS _In_ PDEVICE_OBJECT FdoDeviceObject, _In_ PDEVICE_OBJECT PdoDeviceObject); +typedef _Must_inspect_result_ -typedef BOOLEAN +BOOLEAN (USB_BUSIFFN *USBC_PDO_ENABLE_CALLBACK)( _In_ PVOID Context, _In_ USHORT FirstInterfaceNumber, diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 00f9f2f79d8..5b1a3169409 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1676,567 +1676,6 @@ extern PCCHAR KeNumberProcessors; #endif -#if defined(_M_IX86) -/** Kernel definitions for x86 **/ - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define CMCI_LEVEL 5 -#define PROFILE_LEVEL 27 -#define CLOCK1_LEVEL 28 -#define CLOCK2_LEVEL 28 -#define IPI_LEVEL 29 -#define POWER_LEVEL 30 -#define HIGH_LEVEL 31 -#define CLOCK_LEVEL CLOCK2_LEVEL - -#define KIP0PCRADDRESS 0xffdff000 -#define KI_USER_SHARED_DATA 0xffdf0000 -#define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA) - -#define PAGE_SIZE 0x1000 -#define PAGE_SHIFT 12L -#define KeGetDcacheFillSize() 1L - -#define EFLAG_SIGN 0x8000 -#define EFLAG_ZERO 0x4000 -#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) - -#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) -#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT) -#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) - - -typedef struct _KFLOATING_SAVE { - ULONG ControlWord; - ULONG StatusWord; - ULONG ErrorOffset; - ULONG ErrorSelector; - ULONG DataOffset; - ULONG DataSelector; - ULONG Cr0NpxState; - ULONG Spare1; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount; - -#define YieldProcessor _mm_pause - -FORCEINLINE -VOID -KeMemoryBarrier(VOID) -{ - LONG Barrier, *Dummy = &Barrier; - UNREFERENCED_LOCAL_VARIABLE(Dummy); - -#if defined(__GNUC__) - __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax"); -#elif defined(_MSC_VER) - __asm xchg [Barrier], eax -#endif -} - -#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() - -_IRQL_requires_max_(HIGH_LEVEL) -_IRQL_saves_ -NTHALAPI -KIRQL -NTAPI -KeGetCurrentIrql(VOID); - -_IRQL_requires_max_(HIGH_LEVEL) -NTHALAPI -VOID -FASTCALL -KfLowerIrql( - _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql); -#define KeLowerIrql(a) KfLowerIrql(a) - -_IRQL_requires_max_(HIGH_LEVEL) -_IRQL_raises_(NewIrql) -_IRQL_saves_ -NTHALAPI -KIRQL -FASTCALL -KfRaiseIrql( - _In_ KIRQL NewIrql); -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -_IRQL_requires_max_(DISPATCH_LEVEL) -_IRQL_saves_ -_IRQL_raises_(DISPATCH_LEVEL) -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToDpcLevel(VOID); - -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToSynchLevel(VOID); - -_Requires_lock_not_held_(*SpinLock) -_Acquires_lock_(*SpinLock) -_IRQL_requires_max_(DISPATCH_LEVEL) -_IRQL_saves_ -_IRQL_raises_(DISPATCH_LEVEL) -NTHALAPI -KIRQL -FASTCALL -KfAcquireSpinLock( - _Inout_ PKSPIN_LOCK SpinLock); -#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) - -_Requires_lock_held_(*SpinLock) -_Releases_lock_(*SpinLock) -_IRQL_requires_(DISPATCH_LEVEL) -NTHALAPI -VOID -FASTCALL -KfReleaseSpinLock( - _Inout_ PKSPIN_LOCK SpinLock, - _In_ _IRQL_restores_ KIRQL NewIrql); -#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) - -_Requires_lock_not_held_(*SpinLock) -_Acquires_lock_(*SpinLock) -_IRQL_requires_min_(DISPATCH_LEVEL) -NTKERNELAPI -VOID -FASTCALL -KefAcquireSpinLockAtDpcLevel( - _Inout_ PKSPIN_LOCK SpinLock); -#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) - -_Requires_lock_held_(*SpinLock) -_Releases_lock_(*SpinLock) -_IRQL_requires_min_(DISPATCH_LEVEL) -NTKERNELAPI -VOID -FASTCALL -KefReleaseSpinLockFromDpcLevel( - _Inout_ PKSPIN_LOCK SpinLock); -#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) - -NTSYSAPI -PKTHREAD -NTAPI -KeGetCurrentThread(VOID); - -_Always_(_Post_satisfies_(return<=0)) -_Must_inspect_result_ -_IRQL_requires_max_(DISPATCH_LEVEL) -_Kernel_float_saved_ -_At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState)) -NTKERNELAPI -NTSTATUS -NTAPI -KeSaveFloatingPointState( - _Out_ PKFLOATING_SAVE FloatSave); - -_Success_(1) -_Kernel_float_restored_ -_At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState)) -NTKERNELAPI -NTSTATUS -NTAPI -KeRestoreFloatingPointState( - _In_ PKFLOATING_SAVE FloatSave); - -/* VOID - * KeFlushIoBuffers( - * IN PMDL Mdl, - * IN BOOLEAN ReadOperation, - * IN BOOLEAN DmaOperation) - */ -#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) - -/* x86 and x64 performs a 0x2C interrupt */ -#define DbgRaiseAssertionFailure __int2c - -FORCEINLINE -VOID -_KeQueryTickCount( - OUT PLARGE_INTEGER CurrentCount) -{ - for (;;) { -#ifdef NONAMELESSUNION - CurrentCount->s.HighPart = KeTickCount.High1Time; - CurrentCount->s.LowPart = KeTickCount.LowPart; - if (CurrentCount->s.HighPart == KeTickCount.High2Time) break; -#else - CurrentCount->HighPart = KeTickCount.High1Time; - CurrentCount->LowPart = KeTickCount.LowPart; - if (CurrentCount->HighPart == KeTickCount.High2Time) break; -#endif - YieldProcessor(); - } -} -#define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) - - - - - -#elif defined(_M_AMD64) -/** Kernel definitions for AMD64 **/ - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define CMCI_LEVEL 5 -#define CLOCK_LEVEL 13 -#define IPI_LEVEL 14 -#define DRS_LEVEL 14 -#define POWER_LEVEL 14 -#define PROFILE_LEVEL 15 -#define HIGH_LEVEL 15 - -#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL -#define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA) -#define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8) -#define SharedSystemTime (KI_USER_SHARED_DATA + 0x14) -#define SharedTickCount (KI_USER_SHARED_DATA + 0x320) - -#define PAGE_SIZE 0x1000 -#define PAGE_SHIFT 12L - -#define EFLAG_SIGN 0x8000 -#define EFLAG_ZERO 0x4000 -#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) - -typedef struct _KFLOATING_SAVE { - ULONG Dummy; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; - -#define KeQueryInterruptTime() \ - (*(volatile ULONG64*)SharedInterruptTime) - -#define KeQuerySystemTime(CurrentCount) \ - *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime - -#define KeQueryTickCount(CurrentCount) \ - *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount - -#define KeGetDcacheFillSize() 1L - -#define YieldProcessor _mm_pause -#define MemoryBarrier __faststorefence -#define FastFence __faststorefence -#define LoadFence _mm_lfence -#define MemoryFence _mm_mfence -#define StoreFence _mm_sfence -#define LFENCE_ACQUIRE() LoadFence() - -FORCEINLINE -VOID -KeMemoryBarrier(VOID) -{ - // FIXME: Do we really need lfence after the __faststorefence ? - FastFence(); - LFENCE_ACQUIRE(); -} - -#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() - -FORCEINLINE -KIRQL -KeGetCurrentIrql(VOID) -{ - return (KIRQL)__readcr8(); -} - -FORCEINLINE -VOID -KeLowerIrql(IN KIRQL NewIrql) -{ - ASSERT((KIRQL)__readcr8() >= NewIrql); - __writecr8(NewIrql); -} - -FORCEINLINE -KIRQL -KfRaiseIrql(IN KIRQL NewIrql) -{ - KIRQL OldIrql; - - OldIrql = (KIRQL)__readcr8(); - ASSERT(OldIrql <= NewIrql); - __writecr8(NewIrql); - return OldIrql; -} -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -FORCEINLINE -KIRQL -KeRaiseIrqlToDpcLevel(VOID) -{ - return KfRaiseIrql(DISPATCH_LEVEL); -} - -FORCEINLINE -KIRQL -KeRaiseIrqlToSynchLevel(VOID) -{ - return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 -} - -FORCEINLINE -PKTHREAD -KeGetCurrentThread(VOID) -{ - return (struct _KTHREAD *)__readgsqword(0x188); -} - -FORCEINLINE -NTSTATUS -KeSaveFloatingPointState(PVOID FloatingState) -{ - UNREFERENCED_PARAMETER(FloatingState); - return STATUS_SUCCESS; -} - -FORCEINLINE -NTSTATUS -KeRestoreFloatingPointState(PVOID FloatingState) -{ - UNREFERENCED_PARAMETER(FloatingState); - return STATUS_SUCCESS; -} - -/* VOID - * KeFlushIoBuffers( - * IN PMDL Mdl, - * IN BOOLEAN ReadOperation, - * IN BOOLEAN DmaOperation) - */ -#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) - -/* x86 and x64 performs a 0x2C interrupt */ -#define DbgRaiseAssertionFailure __int2c - -#elif defined(_M_IA64) -/** Kernel definitions for IA64 **/ - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define CMC_LEVEL 3 -#define DEVICE_LEVEL_BASE 4 -#define PC_LEVEL 12 -#define IPI_LEVEL 14 -#define DRS_LEVEL 14 -#define CLOCK_LEVEL 13 -#define POWER_LEVEL 15 -#define PROFILE_LEVEL 15 -#define HIGH_LEVEL 15 - -#define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000)) -extern volatile LARGE_INTEGER KeTickCount; - -#define PAUSE_PROCESSOR __yield(); - -FORCEINLINE -VOID -KeFlushWriteBuffer(VOID) -{ - __mf (); - return; -} - -NTSYSAPI -PKTHREAD -NTAPI -KeGetCurrentThread(VOID); - - -#elif defined(_M_PPC) - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define PROFILE_LEVEL 27 -#define CLOCK1_LEVEL 28 -#define CLOCK2_LEVEL 28 -#define IPI_LEVEL 29 -#define POWER_LEVEL 30 -#define HIGH_LEVEL 31 - -// -// Used to contain PFNs and PFN counts -// -typedef ULONG PFN_COUNT; -typedef ULONG PFN_NUMBER, *PPFN_NUMBER; -typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; - - -typedef struct _KFLOATING_SAVE { - ULONG Dummy; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -typedef struct _KPCR_TIB { - PVOID ExceptionList; /* 00 */ - PVOID StackBase; /* 04 */ - PVOID StackLimit; /* 08 */ - PVOID SubSystemTib; /* 0C */ - _ANONYMOUS_UNION union { - PVOID FiberData; /* 10 */ - ULONG Version; /* 10 */ - } DUMMYUNIONNAME; - PVOID ArbitraryUserPointer; /* 14 */ - struct _KPCR_TIB *Self; /* 18 */ -} KPCR_TIB, *PKPCR_TIB; /* 1C */ - -#define PCR_MINOR_VERSION 1 -#define PCR_MAJOR_VERSION 1 - -typedef struct _KPCR { - KPCR_TIB Tib; /* 00 */ - struct _KPCR *Self; /* 1C */ - struct _KPRCB *Prcb; /* 20 */ - KIRQL Irql; /* 24 */ - ULONG IRR; /* 28 */ - ULONG IrrActive; /* 2C */ - ULONG IDR; /* 30 */ - PVOID KdVersionBlock; /* 34 */ - PUSHORT IDT; /* 38 */ - PUSHORT GDT; /* 3C */ - struct _KTSS *TSS; /* 40 */ - USHORT MajorVersion; /* 44 */ - USHORT MinorVersion; /* 46 */ - KAFFINITY SetMember; /* 48 */ - ULONG StallScaleFactor; /* 4C */ - UCHAR SpareUnused; /* 50 */ - UCHAR Number; /* 51 */ -} KPCR, *PKPCR; /* 54 */ - -#define KeGetPcr() PCR - -#define YieldProcessor() __asm__ __volatile__("nop"); - -FORCEINLINE -ULONG -NTAPI -KeGetCurrentProcessorNumber(VOID) -{ - ULONG Number; - __asm__ __volatile__ ( - "lwz %0, %c1(12)\n" - : "=r" (Number) - : "i" (FIELD_OFFSET(KPCR, Number)) - ); - return Number; -} - -NTHALAPI -VOID -FASTCALL -KfLowerIrql( - IN KIRQL NewIrql); -#define KeLowerIrql(a) KfLowerIrql(a) - -NTHALAPI -KIRQL -FASTCALL -KfRaiseIrql( - IN KIRQL NewIrql); -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToDpcLevel(VOID); - -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToSynchLevel(VOID); - - - -#elif defined(_M_MIPS) -#error MIPS Headers are totally incorrect - -// -// Used to contain PFNs and PFN counts -// -typedef ULONG PFN_COUNT; -typedef ULONG PFN_NUMBER, *PPFN_NUMBER; -typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; - -#define PASSIVE_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define PROFILE_LEVEL 27 -#define IPI_LEVEL 29 -#define HIGH_LEVEL 31 - -typedef struct _KPCR { - struct _KPRCB *Prcb; /* 20 */ - KIRQL Irql; /* 24 */ - ULONG IRR; /* 28 */ - ULONG IDR; /* 30 */ -} KPCR, *PKPCR; - -#define KeGetPcr() PCR - -typedef struct _KFLOATING_SAVE { -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -static __inline -ULONG -NTAPI -KeGetCurrentProcessorNumber(VOID) -{ - return 0; -} - -#define YieldProcessor() __asm__ __volatile__("nop"); - -#define KeLowerIrql(a) KfLowerIrql(a) -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -NTKERNELAPI -VOID -NTAPI -KfLowerIrql( - IN KIRQL NewIrql); - -NTKERNELAPI -KIRQL -NTAPI -KfRaiseIrql( - IN KIRQL NewIrql); - -NTKERNELAPI -KIRQL -NTAPI -KeRaiseIrqlToDpcLevel(VOID); - -NTKERNELAPI -KIRQL -NTAPI -KeRaiseIrqlToSynchLevel(VOID); - - -#elif defined(_M_ARM) -#include -#else -#error Unknown Architecture -#endif - /****************************************************************************** * Memory manager Types * ******************************************************************************/ @@ -10169,6 +9608,566 @@ RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)( /****************************************************************************** * Kernel Functions * ******************************************************************************/ +#if defined(_M_IX86) +/** Kernel definitions for x86 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMCI_LEVEL 5 +#define PROFILE_LEVEL 27 +#define CLOCK1_LEVEL 28 +#define CLOCK2_LEVEL 28 +#define IPI_LEVEL 29 +#define POWER_LEVEL 30 +#define HIGH_LEVEL 31 +#define CLOCK_LEVEL CLOCK2_LEVEL + +#define KIP0PCRADDRESS 0xffdff000 +#define KI_USER_SHARED_DATA 0xffdf0000 +#define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA) + +#define PAGE_SIZE 0x1000 +#define PAGE_SHIFT 12L +#define KeGetDcacheFillSize() 1L + +#define EFLAG_SIGN 0x8000 +#define EFLAG_ZERO 0x4000 +#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) + +#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) + + +typedef struct _KFLOATING_SAVE { + ULONG ControlWord; + ULONG StatusWord; + ULONG ErrorOffset; + ULONG ErrorSelector; + ULONG DataOffset; + ULONG DataSelector; + ULONG Cr0NpxState; + ULONG Spare1; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount; + +#define YieldProcessor _mm_pause + +FORCEINLINE +VOID +KeMemoryBarrier(VOID) +{ + LONG Barrier, *Dummy = &Barrier; + UNREFERENCED_LOCAL_VARIABLE(Dummy); + +#if defined(__GNUC__) + __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax"); +#elif defined(_MSC_VER) + __asm xchg [Barrier], eax +#endif +} + +#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() + +_IRQL_requires_max_(HIGH_LEVEL) +_IRQL_saves_ +NTHALAPI +KIRQL +NTAPI +KeGetCurrentIrql(VOID); + +_IRQL_requires_max_(HIGH_LEVEL) +NTHALAPI +VOID +FASTCALL +KfLowerIrql( + _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql); +#define KeLowerIrql(a) KfLowerIrql(a) + +_IRQL_requires_max_(HIGH_LEVEL) +_IRQL_raises_(NewIrql) +_IRQL_saves_ +NTHALAPI +KIRQL +FASTCALL +KfRaiseIrql( + _In_ KIRQL NewIrql); +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(DISPATCH_LEVEL) +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(DISPATCH_LEVEL) +NTHALAPI +KIRQL +FASTCALL +KfAcquireSpinLock( + _Inout_ PKSPIN_LOCK SpinLock); +#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) + +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_(DISPATCH_LEVEL) +NTHALAPI +VOID +FASTCALL +KfReleaseSpinLock( + _Inout_ PKSPIN_LOCK SpinLock, + _In_ _IRQL_restores_ KIRQL NewIrql); +#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) + +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) +NTKERNELAPI +VOID +FASTCALL +KefAcquireSpinLockAtDpcLevel( + _Inout_ PKSPIN_LOCK SpinLock); +#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) + +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) +NTKERNELAPI +VOID +FASTCALL +KefReleaseSpinLockFromDpcLevel( + _Inout_ PKSPIN_LOCK SpinLock); +#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) + +NTSYSAPI +PKTHREAD +NTAPI +KeGetCurrentThread(VOID); + +_Always_(_Post_satisfies_(return<=0)) +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_Kernel_float_saved_ +_At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState)) +NTKERNELAPI +NTSTATUS +NTAPI +KeSaveFloatingPointState( + _Out_ PKFLOATING_SAVE FloatSave); + +_Success_(1) +_Kernel_float_restored_ +_At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState)) +NTKERNELAPI +NTSTATUS +NTAPI +KeRestoreFloatingPointState( + _In_ PKFLOATING_SAVE FloatSave); + +/* VOID + * KeFlushIoBuffers( + * IN PMDL Mdl, + * IN BOOLEAN ReadOperation, + * IN BOOLEAN DmaOperation) + */ +#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) + +/* x86 and x64 performs a 0x2C interrupt */ +#define DbgRaiseAssertionFailure __int2c + +FORCEINLINE +VOID +_KeQueryTickCount( + OUT PLARGE_INTEGER CurrentCount) +{ + for (;;) { +#ifdef NONAMELESSUNION + CurrentCount->s.HighPart = KeTickCount.High1Time; + CurrentCount->s.LowPart = KeTickCount.LowPart; + if (CurrentCount->s.HighPart == KeTickCount.High2Time) break; +#else + CurrentCount->HighPart = KeTickCount.High1Time; + CurrentCount->LowPart = KeTickCount.LowPart; + if (CurrentCount->HighPart == KeTickCount.High2Time) break; +#endif + YieldProcessor(); + } +} +#define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) + + + + + +#elif defined(_M_AMD64) +/** Kernel definitions for AMD64 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMCI_LEVEL 5 +#define CLOCK_LEVEL 13 +#define IPI_LEVEL 14 +#define DRS_LEVEL 14 +#define POWER_LEVEL 14 +#define PROFILE_LEVEL 15 +#define HIGH_LEVEL 15 + +#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL +#define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA) +#define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8) +#define SharedSystemTime (KI_USER_SHARED_DATA + 0x14) +#define SharedTickCount (KI_USER_SHARED_DATA + 0x320) + +#define PAGE_SIZE 0x1000 +#define PAGE_SHIFT 12L + +#define EFLAG_SIGN 0x8000 +#define EFLAG_ZERO 0x4000 +#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) + +typedef struct _KFLOATING_SAVE { + ULONG Dummy; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; + +#define KeQueryInterruptTime() \ + (*(volatile ULONG64*)SharedInterruptTime) + +#define KeQuerySystemTime(CurrentCount) \ + *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime + +#define KeQueryTickCount(CurrentCount) \ + *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount + +#define KeGetDcacheFillSize() 1L + +#define YieldProcessor _mm_pause +#define MemoryBarrier __faststorefence +#define FastFence __faststorefence +#define LoadFence _mm_lfence +#define MemoryFence _mm_mfence +#define StoreFence _mm_sfence +#define LFENCE_ACQUIRE() LoadFence() + +FORCEINLINE +VOID +KeMemoryBarrier(VOID) +{ + // FIXME: Do we really need lfence after the __faststorefence ? + FastFence(); + LFENCE_ACQUIRE(); +} + +#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() + +FORCEINLINE +KIRQL +KeGetCurrentIrql(VOID) +{ + return (KIRQL)__readcr8(); +} + +FORCEINLINE +VOID +KeLowerIrql(IN KIRQL NewIrql) +{ + ASSERT((KIRQL)__readcr8() >= NewIrql); + __writecr8(NewIrql); +} + +FORCEINLINE +KIRQL +KfRaiseIrql(IN KIRQL NewIrql) +{ + KIRQL OldIrql; + + OldIrql = (KIRQL)__readcr8(); + ASSERT(OldIrql <= NewIrql); + __writecr8(NewIrql); + return OldIrql; +} +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +FORCEINLINE +KIRQL +KeRaiseIrqlToDpcLevel(VOID) +{ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +FORCEINLINE +KIRQL +KeRaiseIrqlToSynchLevel(VOID) +{ + return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 +} + +FORCEINLINE +PKTHREAD +KeGetCurrentThread(VOID) +{ + return (struct _KTHREAD *)__readgsqword(0x188); +} + +FORCEINLINE +NTSTATUS +KeSaveFloatingPointState(PVOID FloatingState) +{ + UNREFERENCED_PARAMETER(FloatingState); + return STATUS_SUCCESS; +} + +FORCEINLINE +NTSTATUS +KeRestoreFloatingPointState(PVOID FloatingState) +{ + UNREFERENCED_PARAMETER(FloatingState); + return STATUS_SUCCESS; +} + +/* VOID + * KeFlushIoBuffers( + * IN PMDL Mdl, + * IN BOOLEAN ReadOperation, + * IN BOOLEAN DmaOperation) + */ +#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) + +/* x86 and x64 performs a 0x2C interrupt */ +#define DbgRaiseAssertionFailure __int2c + +#elif defined(_M_IA64) +/** Kernel definitions for IA64 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMC_LEVEL 3 +#define DEVICE_LEVEL_BASE 4 +#define PC_LEVEL 12 +#define IPI_LEVEL 14 +#define DRS_LEVEL 14 +#define CLOCK_LEVEL 13 +#define POWER_LEVEL 15 +#define PROFILE_LEVEL 15 +#define HIGH_LEVEL 15 + +#define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000)) +extern volatile LARGE_INTEGER KeTickCount; + +#define PAUSE_PROCESSOR __yield(); + +FORCEINLINE +VOID +KeFlushWriteBuffer(VOID) +{ + __mf (); + return; +} + +NTSYSAPI +PKTHREAD +NTAPI +KeGetCurrentThread(VOID); + + +#elif defined(_M_PPC) + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define PROFILE_LEVEL 27 +#define CLOCK1_LEVEL 28 +#define CLOCK2_LEVEL 28 +#define IPI_LEVEL 29 +#define POWER_LEVEL 30 +#define HIGH_LEVEL 31 + +// +// Used to contain PFNs and PFN counts +// +typedef ULONG PFN_COUNT; +typedef ULONG PFN_NUMBER, *PPFN_NUMBER; +typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; + + +typedef struct _KFLOATING_SAVE { + ULONG Dummy; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +typedef struct _KPCR_TIB { + PVOID ExceptionList; /* 00 */ + PVOID StackBase; /* 04 */ + PVOID StackLimit; /* 08 */ + PVOID SubSystemTib; /* 0C */ + _ANONYMOUS_UNION union { + PVOID FiberData; /* 10 */ + ULONG Version; /* 10 */ + } DUMMYUNIONNAME; + PVOID ArbitraryUserPointer; /* 14 */ + struct _KPCR_TIB *Self; /* 18 */ +} KPCR_TIB, *PKPCR_TIB; /* 1C */ + +#define PCR_MINOR_VERSION 1 +#define PCR_MAJOR_VERSION 1 + +typedef struct _KPCR { + KPCR_TIB Tib; /* 00 */ + struct _KPCR *Self; /* 1C */ + struct _KPRCB *Prcb; /* 20 */ + KIRQL Irql; /* 24 */ + ULONG IRR; /* 28 */ + ULONG IrrActive; /* 2C */ + ULONG IDR; /* 30 */ + PVOID KdVersionBlock; /* 34 */ + PUSHORT IDT; /* 38 */ + PUSHORT GDT; /* 3C */ + struct _KTSS *TSS; /* 40 */ + USHORT MajorVersion; /* 44 */ + USHORT MinorVersion; /* 46 */ + KAFFINITY SetMember; /* 48 */ + ULONG StallScaleFactor; /* 4C */ + UCHAR SpareUnused; /* 50 */ + UCHAR Number; /* 51 */ +} KPCR, *PKPCR; /* 54 */ + +#define KeGetPcr() PCR + +#define YieldProcessor() __asm__ __volatile__("nop"); + +FORCEINLINE +ULONG +NTAPI +KeGetCurrentProcessorNumber(VOID) +{ + ULONG Number; + __asm__ __volatile__ ( + "lwz %0, %c1(12)\n" + : "=r" (Number) + : "i" (FIELD_OFFSET(KPCR, Number)) + ); + return Number; +} + +NTHALAPI +VOID +FASTCALL +KfLowerIrql( + IN KIRQL NewIrql); +#define KeLowerIrql(a) KfLowerIrql(a) + +NTHALAPI +KIRQL +FASTCALL +KfRaiseIrql( + IN KIRQL NewIrql); +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + + + +#elif defined(_M_MIPS) +#error MIPS Headers are totally incorrect + +// +// Used to contain PFNs and PFN counts +// +typedef ULONG PFN_COUNT; +typedef ULONG PFN_NUMBER, *PPFN_NUMBER; +typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; + +#define PASSIVE_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define PROFILE_LEVEL 27 +#define IPI_LEVEL 29 +#define HIGH_LEVEL 31 + +typedef struct _KPCR { + struct _KPRCB *Prcb; /* 20 */ + KIRQL Irql; /* 24 */ + ULONG IRR; /* 28 */ + ULONG IDR; /* 30 */ +} KPCR, *PKPCR; + +#define KeGetPcr() PCR + +typedef struct _KFLOATING_SAVE { +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +static __inline +ULONG +NTAPI +KeGetCurrentProcessorNumber(VOID) +{ + return 0; +} + +#define YieldProcessor() __asm__ __volatile__("nop"); + +#define KeLowerIrql(a) KfLowerIrql(a) +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +NTKERNELAPI +VOID +NTAPI +KfLowerIrql( + IN KIRQL NewIrql); + +NTKERNELAPI +KIRQL +NTAPI +KfRaiseIrql( + IN KIRQL NewIrql); + +NTKERNELAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTKERNELAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + + +#elif defined(_M_ARM) +#include +#else +#error Unknown Architecture +#endif NTKERNELAPI VOID diff --git a/include/ndk/mmtypes.h b/include/ndk/mmtypes.h index ec96ec3dddc..82a1668a433 100644 --- a/include/ndk/mmtypes.h +++ b/include/ndk/mmtypes.h @@ -66,12 +66,12 @@ Author: // // Flags for ProcessExecutionOptions // -#define MEM_EXECUTE_OPTION_DISABLE 0x1 +#define MEM_EXECUTE_OPTION_DISABLE 0x1 #define MEM_EXECUTE_OPTION_ENABLE 0x2 #define MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION 0x4 #define MEM_EXECUTE_OPTION_PERMANENT 0x8 #define MEM_EXECUTE_OPTION_EXECUTE_DISPATCH_ENABLE 0x10 -#define MEM_EXECUTE_OPTION_IMAGE_DISPATCH_ENABLE 0x20 +#define MEM_EXECUTE_OPTION_IMAGE_DISPATCH_ENABLE 0x20 #define MEM_EXECUTE_OPTION_VALID_FLAGS 0x3F #ifndef NTOS_MODE_USER @@ -989,6 +989,10 @@ typedef struct _DRIVER_SPECIFIED_VERIFIER_THUNKS ULONG NumberOfThunks; } DRIVER_SPECIFIED_VERIFIER_THUNKS, *PDRIVER_SPECIFIED_VERIFIER_THUNKS; +#ifdef __cplusplus +extern "C" { +#endif + // // Default heap size values. For user mode, these values are copied to a new // process's PEB by the kernel in MmCreatePeb. In kernel mode, RtlCreateHeap @@ -1007,6 +1011,10 @@ extern SIZE_T MmHeapDeCommitFreeBlockThreshold; // extern POBJECT_TYPE NTSYSAPI MmSectionObjectType; +#ifdef __cplusplus +}; // extern "C" +#endif + #endif // !NTOS_MODE_USER #endif // _MMTYPES_H diff --git a/include/ndk/obfuncs.h b/include/ndk/obfuncs.h index 96cc917564f..48c9ac88b9e 100644 --- a/include/ndk/obfuncs.h +++ b/include/ndk/obfuncs.h @@ -26,6 +26,10 @@ Author: #include #include +#ifdef __cplusplus +extern "C" { +#endif + #ifndef NTOS_MODE_USER // @@ -576,4 +580,8 @@ ZwWaitForSingleObject( #endif /* NTOS_MODE_USER */ +#ifdef __cplusplus +}; // extern "C" +#endif + #endif diff --git a/include/ndk/rtlfuncs.h b/include/ndk/rtlfuncs.h index 46e180e2669..d565d4cd461 100644 --- a/include/ndk/rtlfuncs.h +++ b/include/ndk/rtlfuncs.h @@ -3259,6 +3259,7 @@ DbgPrompt( _In_ ULONG MaximumResponseLength ); +#undef DbgBreakPoint VOID NTAPI DbgBreakPoint( @@ -3503,7 +3504,7 @@ NTSYSAPI NTSTATUS NTAPI RtlAllocateActivationContextStack( - _In_ PVOID *Context + _In_ PACTIVATION_CONTEXT_STACK *Stack ); NTSYSAPI @@ -3539,7 +3540,14 @@ RtlDeactivateActivationContext( NTSYSAPI VOID NTAPI -RtlFreeThreadActivationContextStack(void); +RtlFreeActivationContextStack( + _In_ PACTIVATION_CONTEXT_STACK Stack +); + +NTSYSAPI +VOID +NTAPI +RtlFreeThreadActivationContextStack(VOID); NTSYSAPI PRTL_ACTIVATION_CONTEXT_STACK_FRAME diff --git a/include/psdk/propvarutil.h b/include/psdk/propvarutil.h index 2573d38d1a1..4791543b01e 100644 --- a/include/psdk/propvarutil.h +++ b/include/psdk/propvarutil.h @@ -19,7 +19,6 @@ #ifndef __WINE_PROPVARUTIL_H #define __WINE_PROPVARUTIL_H -#include #include #include @@ -35,7 +34,85 @@ enum tagPROPVAR_CHANGE_FLAGS typedef int PROPVAR_CHANGE_FLAGS; +enum tagPROPVAR_COMPARE_UNIT +{ + PVCU_DEFAULT = 0x00000000, + PVCU_SECOND = 0x00000001, + PVCU_MINUTE = 0x00000002, + PVCU_HOUR = 0x00000003, + PVCU_DAY = 0x00000004, + PVCU_MONTH = 0x00000005, + PVCU_YEAR = 0x00000006, +}; + +typedef int PROPVAR_COMPARE_UNIT; + +enum tagPROPVAR_COMPARE_FLAGS +{ + PVCF_DEFAULT = 0x00000000, + PVCF_TREATEMPTYASGREATERTHAN = 0x00000001, + PVCF_USESTRCMP = 0x00000002, + PVCF_USESTRCMPC = 0x00000004, + PVCF_USESTRCMPI = 0x00000008, + PVCF_USESTRCMPIC = 0x00000010, +}; + +typedef int PROPVAR_COMPARE_FLAGS; + HRESULT WINAPI PropVariantChangeType(PROPVARIANT *ppropvarDest, REFPROPVARIANT propvarSrc, PROPVAR_CHANGE_FLAGS flags, VARTYPE vt); +HRESULT WINAPI InitPropVariantFromGUIDAsString(REFGUID guid, PROPVARIANT *ppropvar); +HRESULT WINAPI InitVariantFromGUIDAsString(REFGUID guid, VARIANT *pvar); +HRESULT WINAPI InitPropVariantFromBuffer(const VOID *pv, UINT cb, PROPVARIANT *ppropvar); +HRESULT WINAPI InitVariantFromBuffer(const VOID *pv, UINT cb, VARIANT *pvar); +HRESULT WINAPI PropVariantToGUID(const PROPVARIANT *ppropvar, GUID *guid); +HRESULT WINAPI VariantToGUID(const VARIANT *pvar, GUID *guid); +INT WINAPI PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2, + PROPVAR_COMPARE_UNIT uint, PROPVAR_COMPARE_FLAGS flags); + +HRESULT WINAPI PropVariantToInt16(REFPROPVARIANT propvarIn, SHORT *ret); +HRESULT WINAPI PropVariantToInt32(REFPROPVARIANT propvarIn, LONG *ret); +HRESULT WINAPI PropVariantToInt64(REFPROPVARIANT propvarIn, LONGLONG *ret); +HRESULT WINAPI PropVariantToUInt16(REFPROPVARIANT propvarIn, USHORT *ret); +HRESULT WINAPI PropVariantToUInt32(REFPROPVARIANT propvarIn, ULONG *ret); +HRESULT WINAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret); + +#ifdef __cplusplus + +HRESULT InitPropVariantFromBoolean(BOOL fVal, PROPVARIANT *ppropvar); +HRESULT InitPropVariantFromString(PCWSTR psz, PROPVARIANT *ppropvar); +HRESULT InitPropVariantFromInt64(LONGLONG llVal, PROPVARIANT *ppropvar); + +#ifndef NO_PROPVAR_INLINES + +inline HRESULT InitPropVariantFromBoolean(BOOL fVal, PROPVARIANT *ppropvar) +{ + ppropvar->vt = VT_BOOL; + ppropvar->boolVal = fVal ? VARIANT_TRUE : VARIANT_FALSE; + return S_OK; +} + +inline HRESULT InitPropVariantFromString(PCWSTR psz, PROPVARIANT *ppropvar) +{ + HRESULT hres; + + hres = SHStrDupW(psz, &ppropvar->pwszVal); + if(SUCCEEDED(hres)) + ppropvar->vt = VT_LPWSTR; + else + PropVariantInit(ppropvar); + + return hres; +} + +inline HRESULT InitPropVariantFromInt64(LONGLONG llVal, PROPVARIANT *ppropvar) +{ + ppropvar->vt = VT_I8; + ppropvar->hVal.QuadPart = llVal; + return S_OK; +} + +#endif +#endif #endif /* __WINE_PROPVARUTIL_H */ diff --git a/include/psdk/sal.h b/include/psdk/sal.h index 8f0ed8f4b5a..e87475d82d2 100644 --- a/include/psdk/sal.h +++ b/include/psdk/sal.h @@ -832,7 +832,7 @@ enum __SAL_YesNo {_SAL_notpresent, _SAL_no, _SAL_maybe, _SAL_yes, _SAL_default}; #define _Outptr_result_bytebuffer_(size) _SAL2_NAME(_Outptr_result_bytebuffer_) _Group_([SA_Pre(Null=SA_No,Notref=1)] [SA_Pre(WritableElementsConst=1,Notref=1)] [SA_Post(Valid=SA_Yes)] [SA_Post(Deref=1,Null=SA_No,Notref=1,WritableBytes="\n" _SA_SPECSTRIZE(size))]) //#define _Outptr_result_bytebuffer_all_(size) //#define _Outptr_result_bytebuffer_all_maybenull_(size) -//#define _Outptr_result_bytebuffer_maybenull_(size) +#define _Outptr_result_bytebuffer_maybenull_(size) _SAL2_NAME(_Outptr_result_bytebuffer_maybenull_) _Group_([SA_Pre(Null=SA_No,Notref=1)] [SA_Pre(WritableElementsConst=1,Notref=1)] [SA_Post(Valid=SA_Yes)] [SA_Post(Deref=1,Null=SA_Maybe,Notref=1,WritableBytes="\n" _SA_SPECSTRIZE(size))]) #define _Outptr_result_bytebuffer_to_(size, count) _SAL2_NAME(_Outptr_result_bytebuffer_to_) _Group_([SA_Pre(Null=SA_No,Notref=1)] [SA_Pre(WritableElementsConst=1,Notref=1)] [SA_Post(Valid=SA_Yes)] [SA_Post(Deref=1,Null=SA_No,Notref=1,WritableBytes="\n" _SA_SPECSTRIZE(size), ValidBytes="\n" _SA_SPECSTRIZE(count))]) //#define _Outptr_result_bytebuffer_to_maybenull_(size, count) #define _Outptr_result_maybenull_ _SAL2_NAME(_Outptr_result_maybenull_) _Group_([SA_Pre(Null=SA_No,Notref=1)] [SA_Pre(WritableElementsConst=1,Notref=1)] [SA_Post(Valid=SA_Yes)] [SA_Post(Deref=1,Null=SA_Maybe,Notref=1,ValidElements="\n""1")] ) @@ -980,7 +980,7 @@ enum __SAL_YesNo {_SAL_notpresent, _SAL_no, _SAL_maybe, _SAL_yes, _SAL_default}; //#define _Raises_SEH_exception_ #define _Maybe_raises_SEH_exception_ #define _Readable_bytes_(size) _SAL2_NAME(_Readable_bytes_) _Group_(_SA_annotes1(SAL_readableTo, byteCount(size))) -//#define _Readable_elements_(size) +#define _Readable_elements_(size) _SAL2_NAME(_Readable_elements_) _Group_([SAL_annotes(Name="SAL_readableTo", p1="elementCount(size)")]) #define _Reserved_ _SAL2_NAME(_Reserved_) _Group_([SA_Pre(Null=SA_Yes)]) //#define _Result_nullonfailure_ //#define _Result_zeroonfailure_ @@ -1090,7 +1090,6 @@ __PRIMOP(int, _In_function_class_(__In_impl_ char*);) #define _In_function_class_(x) _In_function_class_(#x) #define _Called_from_function_class_(x) _In_function_class_(x) -#define _Function_class_(x) _SA_annotes1(SAL_functionClassNew, #x) #else // ] [ !_PREFAST_ diff --git a/include/psdk/sal_old.h b/include/psdk/sal_old.h index 74a97652593..9b93826d4e9 100644 --- a/include/psdk/sal_old.h +++ b/include/psdk/sal_old.h @@ -53,7 +53,6 @@ #define __inner_fallthrough_dec __inline __nothrow void __FallThrough() {} #define __inner_override __declspec("__override") #define __inner_success(expr) __declspec("SAL_success("SPECSTRINGIZE(expr)")") -#define __inner_typefix(ctype) __declspec("SAL_typefix("SPECSTRINGIZE(ctype)")") #define __maybenull __declspec("SAL_maybenull") #define __maybereadonly __declspec("SAL_maybereadonly") #define __maybevalid __declspec("SAL_maybevalid") diff --git a/include/psdk/urlmon.idl b/include/psdk/urlmon.idl index 2ea4063a7d9..7407c18b61b 100644 --- a/include/psdk/urlmon.idl +++ b/include/psdk/urlmon.idl @@ -28,6 +28,7 @@ cpp_quote("#undef SetPort") cpp_quote("#endif") interface IInternetProtocolSink; +interface IUri; /***************************************************************************** * IInternet interface @@ -354,7 +355,6 @@ interface IBindStatusCallbackEx : IBindStatusCallback * IAuthenticate interface */ [ - local, object, uuid(79EAC9D0-BAf9-11CE-8C82-00AA004BA90B), pointer_default(unique) @@ -540,6 +540,39 @@ interface IWindowForBindingUI : IUnknown [out] HWND *phwnd); } +/***************************************************************************** + * ICodeInstall interface + */ +[ + local, + object, + uuid(79eac9d1-baf9-11ce-8c82-00aa004ba90b), + pointer_default(unique) +] +interface ICodeInstall : IWindowForBindingUI +{ + typedef [unique] ICodeInstall *LPCODEINSTALL; + + typedef enum { + CIP_DISK_FULL, + CIP_ACCESS_DENIED, + CIP_NEWER_VERSION_EXISTS, + CIP_OLDER_VERSION_EXISTS, + CIP_NAME_CONFLICT, + CIP_TRUST_VERIFICATION_COMPONENT_MISSING, + CIP_EXE_SELF_REGISTERATION_TIMEOUT, + CIP_UNSAFE_TO_ABORT, + CIP_NEED_REBOOT, + CIP_NEED_REBOOT_UI_PERMISSION + } CIP_STATUS; + + HRESULT OnCodeInstallProblem( + [in] ULONG ulStatusCode, + [in, unique] LPCWSTR szDestination, + [in, unique] LPCWSTR szSource, + [in] DWORD dwReserved); +} + /***************************************************************************** * IHttpSecurity interface */ @@ -880,7 +913,8 @@ interface IInternetProtocolInfo : IUnknown QUERY_USES_CACHE, QUERY_IS_SECURE, QUERY_IS_SAFE, - QUERY_USES_HISTORYFOLDER + QUERY_USES_HISTORYFOLDER, + QUERY_IS_CACHED_AND_USABLE_OFFLINE } QUERYOPTION; HRESULT ParseUrl( @@ -1066,6 +1100,76 @@ cpp_quote("#define MAX_SIZE_SECURITY_ID 512") [in] DWORD dwFlags); } +/***************************************************************************** + * IInternetSecurityManagerEx interface + */ +cpp_quote("#define SID_SInternetSecurityManagerEx IID_IInternetSecurityManagerEx") + +[ + object, + uuid(f164edf1-cc7c-4f0d-9a94-34222625C393), + pointer_default(unique) +] +interface IInternetSecurityManagerEx : IInternetSecurityManager +{ + HRESULT ProcessUrlActionEx( + [in] LPCWSTR pwszUrl, + [in] DWORD dwAction, + [out] BYTE *pPolicy, + [in] DWORD cbPolicy, + [in] BYTE *pContext, + [in] DWORD cbContext, + [in] DWORD dwFlags, + [in] DWORD dwReserved, + [out] DWORD *pdwOutFlags); +} + +/***************************************************************************** + * IInternetSecurityManagerEx2 interface + */ +cpp_quote("#define SID_SInternetSecurityManagerEx2 IID_IInternetSecurityManagerEx2") + +[ + object, + uuid(f1e50292-a795-4117-8e09-2b560a72ac60), + pointer_default(unique) +] +interface IInternetSecurityManagerEx2 : IInternetSecurityManagerEx +{ + HRESULT MapUrlToZoneEx2( + [in] IUri *pUri, + [out] DWORD *pdwZone, + [in] DWORD dwFlags, + [out] LPWSTR *ppwszMappedUrl, + [out] DWORD *pdwOutFlags); + + HRESULT ProcessUrlActionEx2( + [in] IUri *pUri, + [in] DWORD dwAction, + [out] BYTE *pPolicy, + [in] DWORD cbPolicy, + [in] BYTE *pContext, + [in] DWORD cbContext, + [in] DWORD dwFlags, + [in] DWORD_PTR dwReserved, + [out] DWORD *pdwOutFlags); + + HRESULT GetSecurityIdEx2( + [in] IUri *pUri, + [out] BYTE *pbSecurityId, + [in, out] DWORD *pcbSecurityId, + [in] DWORD_PTR dwReserved); + + HRESULT QueryCustomPolicyEx2( + [in] IUri *pUri, + [in] REFGUID guidKey, + [out] BYTE **ppPolicy, + [out] DWORD *pcbPolicy, + [in] BYTE *pContext, + [in] DWORD cbContext, + [in] DWORD_PTR dwReserved); +} + /***************************************************************************** * IInternetHostSecurityManager interface */ @@ -1191,6 +1295,18 @@ cpp_quote("#define URLPOLICY_CHANNEL_SOFTDIST_PRECACHE 0x00020000") cpp_quote("#define URLPOLICY_CHANNEL_SOFTDIST_AUTOINSTALL 0x00030000") cpp_quote("#define URLACTION_CHANNEL_SOFTDIST_MAX 0x00001eff") +cpp_quote("#define URLACTION_BEHAVIOR_MIN 0x00002000") +cpp_quote("#define URLACTION_BEHAVIOR_RUN 0x00002000") +cpp_quote("#define URLPOLICY_BEHAVIOR_CHECK_LIST 0x00010000") + +cpp_quote("#define URLACTION_FEATURE_MIN 0x00002100") +cpp_quote("#define URLACTION_FEATURE_MIME_SNIFFING 0x00002100") +cpp_quote("#define URLACTION_FEATURE_ZONE_ELEVATION 0x00002101") +cpp_quote("#define URLACTION_FEATURE_WINDOW_RESTRICTIONS 0x00002102") +cpp_quote("#define URLACTION_FEATURE_SCRIPT_STATUS_BAR 0x00002103") +cpp_quote("#define URLACTION_FEATURE_FORCE_ADDR_AND_STATUS 0x00002104") +cpp_quote("#define URLACTION_FEATURE_BLOCK_INPUT_PROMPTS 0x00002105") + cpp_quote("#define URLPOLICY_ALLOW 0x00") cpp_quote("#define URLPOLICY_QUERY 0x01") cpp_quote("#define URLPOLICY_DISALLOW 0x03") @@ -1544,7 +1660,6 @@ typedef struct _tagPROTOCOLFILTERDATA { * IUri interface */ [ - local, object, uuid(a39ee748-6a27-4817-a6f2-13914bef5890), pointer_default(unique) @@ -1883,6 +1998,30 @@ interface IInternetProtocolEx : IInternetProtocol [in] HANDLE *dwReserved); } +/***************************************************************************** + * IGetBindHandle interface + */ +[ + local, + object, + uuid(AF0FF408-129D-4b20-91F0-02BD23D88352), + pointer_default(unique) +] +interface IGetBindHandle : IUnknown +{ + typedef [unique] IGetBindHandle *LPGETBINDHANDLE; + + typedef enum { + BINDHANDLETYPES_APPCACHE = 0x00000000, + BINDHANDLETYPES_DEPENDENCY = 0x00000001, + BINDHANDLETYPES_COUNT + } BINDHANDLETYPES; + + HRESULT GetBindHandle( + [in] BINDHANDLETYPES enumRequestedHandle, + [out] HANDLE *pRetHandle); +} + cpp_quote("#define CONFIRMSAFETYACTION_LOADOBJECT 0x00000001") struct CONFIRMSAFETY @@ -1977,8 +2116,11 @@ cpp_quote("HRESULT WINAPI CoInternetParseUrl(LPCWSTR,PARSEACTION,DWORD,LPWSTR,DW cpp_quote("HRESULT WINAPI CoInternetParseIUri(IUri*,PARSEACTION,DWORD,LPWSTR,DWORD,DWORD*,DWORD_PTR);") cpp_quote("HRESULT WINAPI CoInternetQueryInfo(LPCWSTR,QUERYOPTION,DWORD,LPVOID,DWORD,DWORD*,DWORD);") cpp_quote("HRESULT WINAPI CoInternetSetFeatureEnabled(INTERNETFEATURELIST,DWORD,BOOL);") +cpp_quote("HRESULT WINAPI CoInternetIsFeatureEnabled(INTERNETFEATURELIST,DWORD dwFlags);") +cpp_quote("HRESULT WINAPI CoInternetIsFeatureEnabledForUrl(INTERNETFEATURELIST,DWORD,LPCWSTR,IInternetSecurityManager*);") cpp_quote("HRESULT WINAPI CoInternetGetSecurityUrl(LPCWSTR,LPWSTR*,PSUACTION,DWORD);") cpp_quote("HRESULT WINAPI CoInternetGetSecurityUrlEx(IUri*,IUri**,PSUACTION,DWORD_PTR);") +cpp_quote("HRESULT WINAPI AsyncInstallDistributionUnit(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,DWORD,LPCWSTR,IBindCtx*,LPVOID,DWORD);") cpp_quote("HRESULT WINAPI CreateFormatEnumerator(UINT,FORMATETC*,IEnumFORMATETC**);") cpp_quote("HRESULT WINAPI GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi);") cpp_quote("HRESULT WINAPI FaultInIEFeature(HWND,uCLSSPEC*,QUERYCONTEXT*,DWORD);") @@ -1996,6 +2138,7 @@ cpp_quote("HRESULT WINAPI RegisterFormatEnumerator(LPBC,IEnumFORMATETC*,DWORD);" cpp_quote("HRESULT WINAPI RevokeFormatEnumerator(LPBC,IEnumFORMATETC*);") cpp_quote("HRESULT WINAPI RevokeBindStatusCallback(LPBC,IBindStatusCallback*);") cpp_quote("HRESULT WINAPI CopyStgMedium(const STGMEDIUM*,STGMEDIUM*);") +cpp_quote("HRESULT WINAPI CopyBindInfo(const BINDINFO*,BINDINFO*);") cpp_quote("void WINAPI ReleaseBindInfo(BINDINFO*);") cpp_quote("HRESULT WINAPI UrlMkGetSessionOption(DWORD,LPVOID,DWORD,DWORD*,DWORD);") cpp_quote("HRESULT WINAPI UrlMkSetSessionOption(DWORD,LPVOID,DWORD,DWORD);") @@ -2017,3 +2160,4 @@ cpp_quote("#define IsLoggingEnabled WINELIB_NAME_AW(IsLoggingEnabled)") cpp_quote("#define MKSYS_URLMONIKER 6") cpp_quote("#define URL_MK_LEGACY 0") cpp_quote("#define URL_MK_UNIFORM 1") +cpp_quote("#define URL_MK_NO_CANONICALIZE 2") diff --git a/include/xdk/kefuncs.h b/include/xdk/kefuncs.h index 06196cce606..d33a8a4f34f 100644 --- a/include/xdk/kefuncs.h +++ b/include/xdk/kefuncs.h @@ -2,6 +2,21 @@ * Kernel Functions * ******************************************************************************/ $if (_WDMDDK_) +#if defined(_M_IX86) +$include(x86/ke.h) +#elif defined(_M_AMD64) +$include(amd64/ke.h) +#elif defined(_M_IA64) +$include(ia64/ke.h) +#elif defined(_M_PPC) +$include(ppc/ke.h) +#elif defined(_M_MIPS) +$include(mips/ke.h) +#elif defined(_M_ARM) +$include(arm/ke.h) +#else +#error Unknown Architecture +#endif NTKERNELAPI VOID diff --git a/include/xdk/ketypes.h b/include/xdk/ketypes.h index f65c9a6e47d..1ef6473ba2e 100644 --- a/include/xdk/ketypes.h +++ b/include/xdk/ketypes.h @@ -1237,21 +1237,3 @@ typedef struct _KQUEUE { $endif (_NTIFS_) -$if (_WDMDDK_) -#if defined(_M_IX86) -$include(x86/ke.h) -#elif defined(_M_AMD64) -$include(amd64/ke.h) -#elif defined(_M_IA64) -$include(ia64/ke.h) -#elif defined(_M_PPC) -$include(ppc/ke.h) -#elif defined(_M_MIPS) -$include(mips/ke.h) -#elif defined(_M_ARM) -$include(arm/ke.h) -#else -#error Unknown Architecture -#endif -$endif (_WDMDDK_) - diff --git a/lib/drivers/libusb/hcd_controller.cpp b/lib/drivers/libusb/hcd_controller.cpp index ef6b4175a4c..aa6bac984be 100644 --- a/lib/drivers/libusb/hcd_controller.cpp +++ b/lib/drivers/libusb/hcd_controller.cpp @@ -635,7 +635,7 @@ CHCDController::CreateFDO( // // construct device name // - swprintf(CharDeviceName, L"\\Device\\USBFDO-%d", UsbDeviceNumber); + swprintf(CharDeviceName, L"\\Device\\USBFDO-%lu", UsbDeviceNumber); // // initialize device name @@ -706,8 +706,8 @@ CHCDController::SetSymbolicLink( // // create legacy link // - swprintf(LinkName, L"\\DosDevices\\HCD%d", m_FDODeviceNumber); - swprintf(FDOName, L"\\Device\\USBFDO-%d", m_FDODeviceNumber); + swprintf(LinkName, L"\\DosDevices\\HCD%lu", m_FDODeviceNumber); + swprintf(FDOName, L"\\Device\\USBFDO-%lu", m_FDODeviceNumber); RtlInitUnicodeString(&Link, LinkName); RtlInitUnicodeString(&FDO, FDOName); @@ -729,7 +729,7 @@ CHCDController::SetSymbolicLink( // // create legacy link // - swprintf(LinkName, L"\\DosDevices\\HCD%d", m_FDODeviceNumber); + swprintf(LinkName, L"\\DosDevices\\HCD%lu", m_FDODeviceNumber); RtlInitUnicodeString(&Link, LinkName); // diff --git a/lib/drivers/libusb/hub_controller.cpp b/lib/drivers/libusb/hub_controller.cpp index 5b70f034380..520d56ac590 100644 --- a/lib/drivers/libusb/hub_controller.cpp +++ b/lib/drivers/libusb/hub_controller.cpp @@ -321,7 +321,7 @@ CHubController::QueryStatusChageEndpoint( { m_Hardware->GetPortStatus(PortId, &PortStatus, &PortChange); - DPRINT1("[%S] Port %d: Status %x, Change %x\n", m_USBType, PortId, PortStatus, PortChange); + DPRINT1("[%S] Port %lu: Status %x, Change %x\n", m_USBType, PortId, PortStatus, PortChange); // @@ -329,7 +329,7 @@ CHubController::QueryStatusChageEndpoint( // if (PortChange != 0) { - DPRINT1("[%S] Change state on port %d\n", m_USBType, PortId); + DPRINT1("[%S] Change state on port %lu\n", m_USBType, PortId); // Set the value for the port number *TransferBuffer = 1 << ((PortId + 1) & 7); Changed = TRUE; @@ -1798,8 +1798,8 @@ CHubController::HandleClassEndpoint( DPRINT1("URB_FUNCTION_CLASS_ENDPOINT\n"); DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags); DPRINT1("TransferBufferLength %x\n", Urb->UrbControlVendorClassRequest.TransferBufferLength); - DPRINT1("TransferBuffer %x\n", Urb->UrbControlVendorClassRequest.TransferBuffer); - DPRINT1("TransferBufferMDL %x\n", Urb->UrbControlVendorClassRequest.TransferBufferMDL); + DPRINT1("TransferBuffer %p\n", Urb->UrbControlVendorClassRequest.TransferBuffer); + DPRINT1("TransferBufferMDL %p\n", Urb->UrbControlVendorClassRequest.TransferBufferMDL); DPRINT1("RequestTypeReservedBits %x\n", Urb->UrbControlVendorClassRequest.RequestTypeReservedBits); DPRINT1("Request %x\n", Urb->UrbControlVendorClassRequest.Request); DPRINT1("Value %x\n", Urb->UrbControlVendorClassRequest.Value); @@ -2141,8 +2141,8 @@ CHubController::HandleClassInterface( DPRINT1("URB_FUNCTION_CLASS_INTERFACE\n"); DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags); DPRINT1("TransferBufferLength %x\n", Urb->UrbControlVendorClassRequest.TransferBufferLength); - DPRINT1("TransferBuffer %x\n", Urb->UrbControlVendorClassRequest.TransferBuffer); - DPRINT1("TransferBufferMDL %x\n", Urb->UrbControlVendorClassRequest.TransferBufferMDL); + DPRINT1("TransferBuffer %p\n", Urb->UrbControlVendorClassRequest.TransferBuffer); + DPRINT1("TransferBufferMDL %p\n", Urb->UrbControlVendorClassRequest.TransferBufferMDL); DPRINT1("RequestTypeReservedBits %x\n", Urb->UrbControlVendorClassRequest.RequestTypeReservedBits); DPRINT1("Request %x\n", Urb->UrbControlVendorClassRequest.Request); DPRINT1("Value %x\n", Urb->UrbControlVendorClassRequest.Value); @@ -3853,7 +3853,7 @@ CHubController::CreatePDO( // // construct device name // - swprintf(CharDeviceName, L"\\Device\\USBPDO-%d", UsbDeviceNumber); + swprintf(CharDeviceName, L"\\Device\\USBPDO-%lu", UsbDeviceNumber); // // initialize device name diff --git a/lib/drivers/libusb/usb_device.cpp b/lib/drivers/libusb/usb_device.cpp index c9795d186b4..3615863c241 100644 --- a/lib/drivers/libusb/usb_device.cpp +++ b/lib/drivers/libusb/usb_device.cpp @@ -844,7 +844,7 @@ CUSBDevice::GetConfigurationDescriptorsLength() VOID CUSBDevice::DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor) { - DPRINT1("Dumping Device Descriptor %x\n", DeviceDescriptor); + DPRINT1("Dumping Device Descriptor %p\n", DeviceDescriptor); DPRINT1("bLength %x\n", DeviceDescriptor->bLength); DPRINT1("bDescriptorType %x\n", DeviceDescriptor->bDescriptorType); DPRINT1("bcdUSB %x\n", DeviceDescriptor->bcdUSB); @@ -865,7 +865,7 @@ CUSBDevice::DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor) VOID CUSBDevice::DumpConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor) { - DPRINT1("Dumping ConfigurationDescriptor %x\n", ConfigurationDescriptor); + DPRINT1("Dumping ConfigurationDescriptor %p\n", ConfigurationDescriptor); DPRINT1("bLength %x\n", ConfigurationDescriptor->bLength); DPRINT1("bDescriptorType %x\n", ConfigurationDescriptor->bDescriptorType); DPRINT1("wTotalLength %x\n", ConfigurationDescriptor->wTotalLength); @@ -1247,10 +1247,10 @@ CUSBDevice::SelectInterface( // copy pipe handle DPRINT1("PipeIndex %lu\n", PipeIndex); DPRINT1("EndpointAddress %x\n", InterfaceInfo->Pipes[PipeIndex].EndpointAddress); - DPRINT1("Interval %d\n", InterfaceInfo->Pipes[PipeIndex].Interval); - DPRINT1("MaximumPacketSize %d\n", InterfaceInfo->Pipes[PipeIndex].MaximumPacketSize); - DPRINT1("MaximumTransferSize %d\n", InterfaceInfo->Pipes[PipeIndex].MaximumTransferSize); - DPRINT1("PipeFlags %d\n", InterfaceInfo->Pipes[PipeIndex].PipeFlags); + DPRINT1("Interval %c\n", InterfaceInfo->Pipes[PipeIndex].Interval); + DPRINT1("MaximumPacketSize %hu\n", InterfaceInfo->Pipes[PipeIndex].MaximumPacketSize); + DPRINT1("MaximumTransferSize %lu\n", InterfaceInfo->Pipes[PipeIndex].MaximumTransferSize); + DPRINT1("PipeFlags %lu\n", InterfaceInfo->Pipes[PipeIndex].PipeFlags); DPRINT1("PipeType %d\n", InterfaceInfo->Pipes[PipeIndex].PipeType); DPRINT1("UsbEndPoint %x\n", InterfaceInfo->Pipes[PipeIndex].EndpointAddress); diff --git a/lib/rtl/actctx.c b/lib/rtl/actctx.c index e08034aa5be..8c696f893c2 100644 --- a/lib/rtl/actctx.c +++ b/lib/rtl/actctx.c @@ -2429,7 +2429,7 @@ RtlDeactivateActivationContext( ULONG flags, ULONG_PTR cookie ) VOID NTAPI -RtlFreeActivationContextStack(PACTIVATION_CONTEXT_STACK Stack) +RtlFreeActivationContextStack(IN PACTIVATION_CONTEXT_STACK Stack) { PRTL_ACTIVATION_CONTEXT_STACK_FRAME ActiveFrame, PrevFrame; @@ -2459,7 +2459,7 @@ RtlFreeActivationContextStack(PACTIVATION_CONTEXT_STACK Stack) } VOID -NTAPI RtlFreeThreadActivationContextStack(void) +NTAPI RtlFreeThreadActivationContextStack(VOID) { RtlFreeActivationContextStack(NtCurrentTeb()->ActivationContextStackPointer); NtCurrentTeb()->ActivationContextStackPointer = NULL; @@ -2775,15 +2775,15 @@ RtlFindActivationContextSectionString( ULONG flags, const GUID *guid, ULONG sect NTSTATUS NTAPI -RtlAllocateActivationContextStack(IN PVOID *Context) +RtlAllocateActivationContextStack(IN PACTIVATION_CONTEXT_STACK *Stack) { PACTIVATION_CONTEXT_STACK ContextStack; /* Check if it's already allocated */ - if (*Context) return STATUS_SUCCESS; + if (*Stack) return STATUS_SUCCESS; /* Allocate space for the context stack */ - ContextStack = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof (ACTIVATION_CONTEXT_STACK) ); + ContextStack = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ACTIVATION_CONTEXT_STACK)); if (!ContextStack) { return STATUS_NO_MEMORY; @@ -2796,7 +2796,7 @@ RtlAllocateActivationContextStack(IN PVOID *Context) ContextStack->NextCookieSequenceNumber = 1; ContextStack->StackId = 1; //TODO: Timer-based - *Context = ContextStack; + *Stack = ContextStack; return STATUS_SUCCESS; } diff --git a/lib/sdk/uuid/otherguids.c b/lib/sdk/uuid/otherguids.c index 986a42ca409..69361d1af89 100644 --- a/lib/sdk/uuid/otherguids.c +++ b/lib/sdk/uuid/otherguids.c @@ -48,7 +48,6 @@ DEFINE_GUID(GUID_COMPARTMENT_TIPUISTATUS, 0x148ca3ec,0x0366,0x401c,0x8 DEFINE_GUID(IID_IDsObjectPicker, 0x0c87e64e, 0x3b7a, 0x11d2, 0x00b9, 0xe0,0x00,0xc0,0x4f,0xd8,0xdb,0xf7); DEFINE_GUID(CLSID_DsObjectPicker, 0x17d6ccd8, 0x3b7b, 0x11d2, 0x00b9, 0xe0,0x00,0xc0,0x4f,0xd8,0xdb,0xf7); -DEFINE_GUID(IID_IDeskBarClient, 0xEB0FE175, 0x1A3A, 0x11D0, 0x89,0xB3, 0x00,0xA0,0xC9,0x0A,0x90,0xAC); DEFINE_GUID(CLSID_StdPicture, 0x0BE35204, 0x8F91, 0x11CE, 0x9D,0xE3, 0x00,0xAA,0x00,0x4B,0xB8,0x51); DEFINE_GUID(CLSID_StdFont, 0x0BE35203, 0x8F91, 0x11CE, 0x9D,0xE3, 0x00,0xAA,0x00,0x4B,0xB8,0x51); diff --git a/media/doc/README.WINE b/media/doc/README.WINE index f1b19369251..9dbf1015474 100644 --- a/media/doc/README.WINE +++ b/media/doc/README.WINE @@ -120,7 +120,7 @@ reactos/dll/win32/msvfw32 # Autosync reactos/dll/win32/msvidc32 # Autosync reactos/dll/win32/msxml # Synced to Wine-1.5.19 reactos/dll/win32/msxml2 # Synced to Wine-1.5.19 -reactos/dll/win32/msxml3 # Synced to Wine-1.5.12 +reactos/dll/win32/msxml3 # Synced to Wine-1.5.26 reactos/dll/win32/msxml4 # Synced to Wine-1.5.19 reactos/dll/win32/msxml6 # Synced to Wine-1.5.19 reactos/dll/win32/nddeapi # Synced to Wine-1.5.19 @@ -130,9 +130,9 @@ reactos/dll/win32/ntprint # Synced to Wine-1.5.4 reactos/dll/win32/objsel # Synced to Wine-1.5.19 reactos/dll/win32/odbc32 # Out of sync. Depends on port of Linux ODBC. reactos/dll/win32/odbccp32 # Synced to Wine-1.5.19 -reactos/dll/win32/ole32 # Synced to Wine-1.5.19 +reactos/dll/win32/ole32 # Synced to Wine-1.5.26 reactos/dll/win32/oleacc # Autosync -reactos/dll/win32/oleaut32 # Synced to Wine-1.5.19 +reactos/dll/win32/oleaut32 # Synced to Wine-1.5.26 reactos/dll/win32/olecli32 # Synced to Wine-1.5.19 reactos/dll/win32/oledlg # Autosync reactos/dll/win32/olepro32 # Autosync @@ -142,6 +142,7 @@ reactos/dll/win32/pdh # Autosync reactos/dll/win32/pidgen # Synced to Wine-1.5.19 reactos/dll/win32/powrprof # Forked at Wine-1.0rc5 reactos/dll/win32/printui # Synced to Wine-1.5.4 +reactos/dll/win32/propsys # Synced to Wine-1.5.26 reactos/dll/win32/pstorec # Synced to Wine-1.5.4 reactos/dll/win32/qmgr # Synced to Wine-1.2-rc5? reactos/dll/win32/qmgrprxy # Synced to Wine-1.14? @@ -163,7 +164,7 @@ reactos/dll/win32/shdoclc # Synced to Wine-1.5.19 reactos/dll/win32/shdocvw # Autosync reactos/dll/win32/shell32 # Forked at Wine-20071011 reactos/dll/win32/shfolder # Autosync -reactos/dll/win32/shlwapi # Synced to Wine-1.5.13 +reactos/dll/win32/shlwapi # Synced to Wine-1.5.26 reactos/dll/win32/slbcsp # Synced to Wine-1.5.19 reactos/dll/win32/snmpapi # Synced to Wine-1.5.19 reactos/dll/win32/softpub # Synced to Wine-1.5.19 @@ -178,7 +179,7 @@ reactos/dll/win32/twain_32 # Out of sync reactos/dll/win32/unicows # Synced to Wine-1.3.32 (Win9x only, why do we need this?!) reactos/dll/win32/updspapi # Synced to Wine-1.5.4 reactos/dll/win32/url # Synced to Wine-1.5.19 -reactos/dll/win32/urlmon # Autosync +reactos/dll/win32/urlmon # Synced to Wine-1.5.26 reactos/dll/win32/usp10 # Synced to Wine-1.5.24 reactos/dll/win32/uxtheme # Forked reactos/dll/win32/version # Autosync diff --git a/win32ss/gdi/eng/floatobj.h b/win32ss/gdi/eng/floatobj.h index 16bc2d1a06d..91fe93e399b 100644 --- a/win32ss/gdi/eng/floatobj.h +++ b/win32ss/gdi/eng/floatobj.h @@ -80,9 +80,9 @@ extern const FLOATOBJ gef16; #define FLOATOBJ_16 16. #define FLOATOBJ_1_16 (1./16.) -#define gef0 FLOATOBJ_0 -#define gef1 FLOATOBJ_1 -#define gef16 FLOATOBJ_16 +static const FLOATOBJ gef0 = 0.; +static const FLOATOBJ gef1 = 1.; +static const FLOATOBJ gef16 = 16.; #define FLOATOBJ_Set0(fo) *(fo) = 0; #define FLOATOBJ_Set1(fo) *(fo) = 1; diff --git a/win32ss/gdi/eng/mapping.c b/win32ss/gdi/eng/mapping.c index 971aad6b239..3a99745c4e7 100644 --- a/win32ss/gdi/eng/mapping.c +++ b/win32ss/gdi/eng/mapping.c @@ -26,6 +26,13 @@ EngMapSectionView( PVOID pvBaseAddress; NTSTATUS Status; + /* Check if the size is ok (for 64 bit) */ + if (cjSize > ULONG_MAX) + { + DPRINT1("chSize out of range: 0x%Id\n", cjSize); + return NULL; + } + /* Align the offset at allocation granularity and compensate for the size */ liSectionOffset.QuadPart = cjOffset & ~(MM_ALLOCATION_GRANULARITY - 1); cjSize += cjOffset & (MM_ALLOCATION_GRANULARITY - 1); @@ -48,7 +55,7 @@ EngMapSectionView( } /* Secure the section memory */ - *phSecure = EngSecureMem(pvBaseAddress, cjSize); + *phSecure = EngSecureMem(pvBaseAddress, (ULONG)cjSize); if (!*phSecure) { ZwUnmapViewOfSection(NtCurrentProcess(), pvBaseAddress); @@ -76,10 +83,7 @@ EngUnmapSectionView( /* Unmap the section view */ Status = MmUnmapViewOfSection(PsGetCurrentProcess(), pvBits); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Could not unmap section view!\n"); - } + ASSERT(NT_SUCCESS(Status)); } diff --git a/win32ss/gdi/gdi32/main/dllmain.c b/win32ss/gdi/gdi32/main/dllmain.c index 5b41c6b02c6..c3a42a6746b 100644 --- a/win32ss/gdi/gdi32/main/dllmain.c +++ b/win32ss/gdi/gdi32/main/dllmain.c @@ -1,10 +1,5 @@ /* * dllmain.c - * - * $Revision: 1.11 $ - * $Author: hbelusca $ - * $Date: 2013-01-28 23:45:53 +0100 (lun. 28 janv. 2013) $ - * */ #include diff --git a/win32ss/gdi/ntgdi/freetype.c b/win32ss/gdi/ntgdi/freetype.c index 652f22f6f7f..abcf6b17bc0 100644 --- a/win32ss/gdi/ntgdi/freetype.c +++ b/win32ss/gdi/ntgdi/freetype.c @@ -1646,15 +1646,32 @@ ftGdiGetGlyphOutline( IntLockFreeType; /* Scaling transform */ - if (aveWidth) + /*if (aveWidth)*/ { - FT_Matrix scaleMat; - DPRINT("Scaling Trans!\n"); - scaleMat.xx = FT_FixedFromFloat(widthRatio); - scaleMat.xy = 0; - scaleMat.yx = 0; - scaleMat.yy = (1 << 16); - FT_Matrix_Multiply(&scaleMat, &transMat); + + FT_Matrix ftmatrix; + FLOATOBJ efTemp; + + PMATRIX pmx = DC_pmxWorldToDevice(dc); + + /* Create a freetype matrix, by converting to 16.16 fixpoint format */ + efTemp = pmx->efM11; + FLOATOBJ_MulLong(&efTemp, 0x00010000); + ftmatrix.xx = FLOATOBJ_GetLong(&efTemp); + + efTemp = pmx->efM12; + FLOATOBJ_MulLong(&efTemp, 0x00010000); + ftmatrix.xy = FLOATOBJ_GetLong(&efTemp); + + efTemp = pmx->efM21; + FLOATOBJ_MulLong(&efTemp, 0x00010000); + ftmatrix.yx = FLOATOBJ_GetLong(&efTemp); + + efTemp = pmx->efM22; + FLOATOBJ_MulLong(&efTemp, 0x00010000); + ftmatrix.yy = FLOATOBJ_GetLong(&efTemp); + + FT_Matrix_Multiply(&ftmatrix, &transMat); needsTransform = TRUE; } diff --git a/win32ss/gdi/ntgdi/palette.c b/win32ss/gdi/ntgdi/palette.c index ec173ce3eda..73b4832ac2c 100644 --- a/win32ss/gdi/ntgdi/palette.c +++ b/win32ss/gdi/ntgdi/palette.c @@ -771,6 +771,12 @@ IntGdiRealizePalette(HDC hDC) { goto cleanup; } + + if(pdc->dctype == DCTYPE_DIRECT) + { + UNIMPLEMENTED; + goto cleanup; + } ppalSurf = pdc->dclevel.pSurface->ppal; ppalDC = pdc->dclevel.ppal; diff --git a/win32ss/include/ntuser.h b/win32ss/include/ntuser.h index c1fd55adc1e..ec435e3b480 100644 --- a/win32ss/include/ntuser.h +++ b/win32ss/include/ntuser.h @@ -3317,6 +3317,7 @@ typedef struct tagKMDDELPARAM #define TWOPARAM_ROUTINE_SETMENUBARHEIGHT 0xfffd0050 #define TWOPARAM_ROUTINE_EXITREACTOS 0xfffd0051 #define TWOPARAM_ROUTINE_SETGUITHRDHANDLE 0xfffd0052 +#define HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE 0xfffd0053 #define MSQ_STATE_CAPTURE 0x1 #define MSQ_STATE_ACTIVE 0x2 #define MSQ_STATE_FOCUS 0x3 diff --git a/win32ss/user/ntuser/focus.c b/win32ss/user/ntuser/focus.c index 45025e92bc1..de9e3a3bb1d 100644 --- a/win32ss/user/ntuser/focus.c +++ b/win32ss/user/ntuser/focus.c @@ -862,6 +862,17 @@ co_IntSetForegroundWindow(PWND Window) return co_IntSetForegroundAndFocusWindow(Window, FALSE); } +/* + API Call +*/ +BOOL FASTCALL +co_IntSetForegroundWindowMouse(PWND Window) +{ + if (Window) ASSERT_REFS_CO(Window); + + return co_IntSetForegroundAndFocusWindow(Window, TRUE); +} + /* API Call */ diff --git a/win32ss/user/ntuser/focus.h b/win32ss/user/ntuser/focus.h index e2fc7ad0253..48ac7efacd1 100644 --- a/win32ss/user/ntuser/focus.h +++ b/win32ss/user/ntuser/focus.h @@ -19,5 +19,6 @@ HWND FASTCALL UserGetActiveWindow(VOID); BOOL FASTCALL co_IntMouseActivateWindow(PWND Window); BOOL FASTCALL co_IntSetForegroundWindow(PWND Window); BOOL FASTCALL co_IntSetActiveWindow(PWND,HWND *,BOOL,BOOL,BOOL); +BOOL FASTCALL co_IntSetForegroundWindowMouse(PWND Window); BOOL FASTCALL IntLockSetForegroundWindow(UINT uLockCode); BOOL FASTCALL IntAllowSetForegroundWindow(DWORD dwProcessId); diff --git a/win32ss/user/ntuser/message.c b/win32ss/user/ntuser/message.c index ba4fd3a26f0..1f689c002d0 100644 --- a/win32ss/user/ntuser/message.c +++ b/win32ss/user/ntuser/message.c @@ -1557,7 +1557,7 @@ co_IntSendMessageWithCallBack( HWND hWnd, { if (Win32Thread->TIF_flags & TIF_INCLEANUP) RETURN( FALSE); - ERR("SMWCB: Internal Message!\n"); + TRACE("SMWCB: Internal Message!\n"); Result = (ULONG_PTR)handle_internal_message( Window, Msg, wParam, lParam ); if (uResult) *uResult = Result; RETURN( TRUE); diff --git a/win32ss/user/ntuser/simplecall.c b/win32ss/user/ntuser/simplecall.c index 4c80bf849fa..b96931dab21 100644 --- a/win32ss/user/ntuser/simplecall.c +++ b/win32ss/user/ntuser/simplecall.c @@ -565,6 +565,12 @@ NtUserCallHwndLock( TRACE("co_IntSetForegroundWindow 2 \n"); break; + case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE: + TRACE("co_IntSetForegroundWindow 1 0x%p\n",hWnd); + Ret = co_IntSetForegroundWindowMouse(Window); + TRACE("co_IntSetForegroundWindow 2 0x%p\n",hWnd); + break; + case HWNDLOCK_ROUTINE_UPDATEWINDOW: Ret = co_UserRedrawWindow( Window, NULL, 0, RDW_UPDATENOW | RDW_ALLCHILDREN); break; diff --git a/win32ss/user/user32/lang/en-US.rc b/win32ss/user/user32/lang/en-US.rc index 8f52f67ad49..d2f49c0b4c0 100644 --- a/win32ss/user/user32/lang/en-US.rc +++ b/win32ss/user/user32/lang/en-US.rc @@ -45,7 +45,7 @@ BEGIN MENUITEM "Mi&nimize", SC_MINIMIZE MENUITEM "Ma&ximize", SC_MAXIMIZE MENUITEM SEPARATOR - MENUITEM "&Close\tAlt-F4", SC_CLOSE + MENUITEM "&Close\tAlt+F4", SC_CLOSE END ///////////////////////////////////////////////////////////////////////////// diff --git a/win32ss/user/user32/lang/zh-CN.rc b/win32ss/user/user32/lang/zh-CN.rc new file mode 100644 index 00000000000..7b7641366fe --- /dev/null +++ b/win32ss/user/user32/lang/zh-CN.rc @@ -0,0 +1,75 @@ +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +///////////////////////////////////////////////////////////////////////////// +// +// Dialogs +// + +SELWINDOW DIALOGEX DISCARDABLE 20, 20, 220, 140 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "选择窗口" +BEGIN + LISTBOX 100, 5, 5, 210, 110, LBS_NOTIFY | LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL + PUSHBUTTON "确定(&O)", 1, 60, 120, 40, 15, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "取消(&C)", 2, 120, 120, 40, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +///////////////////////////////////////////////////////////////////////////// +// +// Menus +// + +EDITMENU MENU LOADONCALL MOVEABLE DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "撤销(&U)", EM_UNDO + MENUITEM SEPARATOR + MENUITEM "剪切(&t)", WM_CUT + MENUITEM "复制(&C)", WM_COPY + MENUITEM "粘贴(&P)", WM_PASTE + MENUITEM "删除(&D)", WM_CLEAR + MENUITEM SEPARATOR + MENUITEM "全选(&A)", EM_SETSEL + END +END + + +SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE +BEGIN + MENUITEM "还原(&R)", SC_RESTORE + MENUITEM "移动(&M)", SC_MOVE + MENUITEM "大小(&S)", SC_SIZE + MENUITEM "最小化(&n)", SC_MINIMIZE + MENUITEM "最大化(&x)", SC_MAXIMIZE + MENUITEM SEPARATOR + MENUITEM "关闭(&C)\tAlt+F4", SC_CLOSE +END + +///////////////////////////////////////////////////////////////////////////// +// +// Strings +// + +STRINGTABLE +BEGIN + IDS_ERROR, "错误" + IDS_OK, "确定" + IDS_CANCEL, "取消" + IDS_ABORT, "中止(&A)" + IDS_RETRY, "重试(&R)" + IDS_IGNORE, "忽略(&I)" + IDS_YES, "是(&Y)" + IDS_NO, "否(&N)" + IDS_HELP, "帮助" + IDS_TRYAGAIN, "重试(&T)" + IDS_CONTINUE, "继续(&C)" +END + +STRINGTABLE +BEGIN + IDS_MDI_MOREWINDOWS, "更多窗口(&M)..." +END + diff --git a/win32ss/user/user32/user32.rc b/win32ss/user/user32/user32.rc index 3bc29059a9e..36e098430b4 100644 --- a/win32ss/user/user32/user32.rc +++ b/win32ss/user/user32/user32.rc @@ -179,9 +179,12 @@ OBM_OLD_CLOSE BITMAP "resources/obm_old_close.bmp" #ifdef LANGUAGE_SV_SE #include "lang/sv-SE.rc" #endif -#ifdef LANGUAGE_UK_UA - #include "lang/uk-UA.rc" -#endif #ifdef LANGUAGE_TR_TR #include "lang/tr-TR.rc" #endif +#ifdef LANGUAGE_UK_UA + #include "lang/uk-UA.rc" +#endif +#ifdef LANGUAGE_ZH_CN + #include "lang/zh-CN.rc" +#endif diff --git a/win32ss/user/user32/windows/nonclient.c b/win32ss/user/user32/windows/nonclient.c index 01e8c8e98f9..713e2c00d0c 100644 --- a/win32ss/user/user32/windows/nonclient.c +++ b/win32ss/user/user32/windows/nonclient.c @@ -987,7 +987,8 @@ DefWndNCLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam) case HTCAPTION: { HWND hTopWnd = GetAncestor(hWnd, GA_ROOT); - if (SetActiveWindow(hTopWnd) || GetActiveWindow() == hTopWnd) + if ( NtUserCallHwndLock(hTopWnd, HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE) || + GetActiveWindow() == hTopWnd) { SendMessageW(hWnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, lParam); }