diff --git a/reactos/ReactOS-arm.rbuild b/reactos/ReactOS-arm.rbuild
index 7172dd316c8..de897e8629c 100644
--- a/reactos/ReactOS-arm.rbuild
+++ b/reactos/ReactOS-arm.rbuild
@@ -7,74 +7,38 @@
-
-
-
+
+
+
-
-
- 1
-
-
-
-
- 0
-
-
-
- 1
-
-
-
- .
- include
- include
- include/psdk
- include/psdk
- include/dxsdk
- include/dxsdk
- include/crt
- include/crt/mingw32
- include/ddk
- include/GL
- include/ndk
- include/reactos
- include/reactos
- include/reactos/mc
- include/reactos/libs
- include/reactos/arm
-
-
-
+
+
+
+
+
+
+ include/reactos/arm
-
- -Os
- -ftracer
-
-
- -Os
-
-
- -O1
-
-
- -O2
-
-
- -O3
-
+
+
+ -ftracer
+
+ -Wno-attributes
+
-
- -Wno-attributes
- -fno-strict-aliasing
- --strip-debug
- -static
+
+
+
+
+ --strip-debug
+ -static
+
@@ -193,6 +157,4 @@
-
-
diff --git a/reactos/ReactOS-generic.rbuild b/reactos/ReactOS-generic.rbuild
index 65bcc4f44ea..fd5357025ec 100644
--- a/reactos/ReactOS-generic.rbuild
+++ b/reactos/ReactOS-generic.rbuild
@@ -86,47 +86,74 @@
include/reactos
include/reactos/wine
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ -Wall
+ -Wno-non-virtual-dtor
+ -gstabs+
+ -gstabs+
+
+
+
+ __inline
+ /Zl
+ /Zi
+ /W1
+
+
+
+
+ -Os
+
+
+ -Os
+
+
+ -O1
+
+
+ -O2
+
+
+ -O3
-
-
-
-
-
-
-
- -Wno-non-virtual-dtor
+ -fno-strict-aliasing
+ -Wno-strict-aliasing
+ -Wpointer-arith
+ -Wno-multichar
+
+
+
- /wd4711
+
+
+ /O1
+
+
+ /O2
+
+
+ /Ox /GS-
+ /Ot
+
+
+ /Ox /GS-
+ /Os
+
+
+ /Ox /GS-
+ /Os
+ /Ob2
+ /GF
+ /Gy
+
+
+ /GS-
+
+
+
diff --git a/reactos/ReactOS-i386.rbuild b/reactos/ReactOS-i386.rbuild
index c5b35f7de8d..942d50685ba 100644
--- a/reactos/ReactOS-i386.rbuild
+++ b/reactos/ReactOS-i386.rbuild
@@ -21,63 +21,53 @@
- -Os
-ftracer
-momit-leaf-frame-pointer
-
- -Os
-
-
- -O1
-
-
- -O2
-
-
- -O3
-
-
- -mpreferred-stack-boundary=2
- -fno-strict-aliasing
- -Wno-strict-aliasing
- -Wpointer-arith
- -Wno-multichar
-
-
-
-
-
- /O1
-
-
- /O2
-
-
- /Ox /GS-
- /Ot
-
-
- /Ox /GS-
- /Os
-
-
- /Ox /GS-
- /Os
- /Ob2
- /GF
- /Gy
-
-
- /GS-
- /Zl
- /Zi
- /Wall
-
+ -mpreferred-stack-boundary=2
+
-disable-stdcall-fixup
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/reactos/ReactOS-ppc.rbuild b/reactos/ReactOS-ppc.rbuild
index 170c41717a2..1dd201e05b3 100644
--- a/reactos/ReactOS-ppc.rbuild
+++ b/reactos/ReactOS-ppc.rbuild
@@ -20,4 +20,6 @@
-meabi
-O2
-Wno-strict-aliasing
+ -gstabs+
+ -gstabs+
diff --git a/reactos/base/applications/calc/lang/ro-RO.rc b/reactos/base/applications/calc/lang/ro-RO.rc
index aef72cbd9ce..1680780befb 100644
--- a/reactos/base/applications/calc/lang/ro-RO.rc
+++ b/reactos/base/applications/calc/lang/ro-RO.rc
@@ -1,5 +1,7 @@
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
// Dialog
IDD_DIALOG_SCIENTIFIC DIALOGEX 0, 0, 316, 161
@@ -122,7 +124,7 @@ BEGIN
BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP
PUSHBUTTON "E",IDC_BUTTON_E,262,140,24,17,BS_CENTER | BS_VCENTER |
BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP
- PUSHBUTTON "i",IDC_BUTTON_AND,288,64,24,17,BS_CENTER | BS_VCENTER |
+ PUSHBUTTON "Şi",IDC_BUTTON_AND,288,64,24,17,BS_CENTER | BS_VCENTER |
BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP
PUSHBUTTON "Xor",IDC_BUTTON_XOR,288,83,24,17,BS_CENTER | BS_VCENTER |
BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP
@@ -151,7 +153,7 @@ BEGIN
BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP
PUSHBUTTON "CE",IDC_BUTTON_CE,228,40,40,17,BS_CENTER | BS_VCENTER |
BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP
- PUSHBUTTON "napoi",IDC_BUTTON_BACK,184,40,40,17,BS_CENTER |
+ PUSHBUTTON "Înapoi",IDC_BUTTON_BACK,184,40,40,17,BS_CENTER |
BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP
RTEXT "",IDC_TEXT_OUTPUT,4,4,308,12,SS_CENTERIMAGE,
WS_EX_CLIENTEDGE
@@ -168,7 +170,7 @@ BEGIN
BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP
PUSHBUTTON "CE",IDC_BUTTON_CE,84,24,40,17,BS_CENTER | BS_VCENTER |
BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP
- PUSHBUTTON "napoi",IDC_BUTTON_BACK,40,24,40,17,BS_CENTER |
+ PUSHBUTTON "Înapoi",IDC_BUTTON_BACK,40,24,40,17,BS_CENTER |
BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP
RTEXT "",IDC_TEXT_OUTPUT,4,4,164,12,SS_CENTERIMAGE,
WS_EX_CLIENTEDGE
@@ -245,7 +247,7 @@ BEGIN
BS_VCENTER | BS_NOTIFY | WS_TABSTOP,276,24,40,17
CONTROL "CE",IDC_BUTTON_CE,"Button",BS_OWNERDRAW | BS_CENTER |
BS_VCENTER | BS_NOTIFY | WS_TABSTOP,232,24,40,17
- CONTROL "napoi",IDC_BUTTON_BACK,"Button",BS_OWNERDRAW |
+ CONTROL "Înapoi",IDC_BUTTON_BACK,"Button",BS_OWNERDRAW |
BS_CENTER | BS_VCENTER | BS_NOTIFY | WS_TABSTOP,188,24,
40,17
RTEXT "",IDC_TEXT_OUTPUT,4,4,312,12,SS_CENTERIMAGE,
@@ -349,7 +351,7 @@ BEGIN
POPUP "Vizualizare"
BEGIN
MENUITEM "Standard", IDM_VIEW_STANDARD, CHECKED
- MENUITEM "tiinific", IDM_VIEW_SCIENTIFIC, CHECKED
+ MENUITEM "Ştiințific", IDM_VIEW_SCIENTIFIC, CHECKED
MENUITEM "Conversie", IDM_VIEW_CONVERSION
MENUITEM SEPARATOR
MENUITEM "Hex\tF5", IDM_VIEW_HEX, CHECKED
@@ -381,7 +383,7 @@ BEGIN
POPUP "Vizualizare"
BEGIN
MENUITEM "Standard", IDM_VIEW_STANDARD, CHECKED
- MENUITEM "tiinific", IDM_VIEW_SCIENTIFIC, CHECKED
+ MENUITEM "Ştiințific", IDM_VIEW_SCIENTIFIC, CHECKED
MENUITEM "Conversie", IDM_VIEW_CONVERSION
MENUITEM SEPARATOR
MENUITEM "Hex\tF5", IDM_VIEW_HEX, CHECKED
@@ -414,7 +416,7 @@ BEGIN
POPUP "Vizualizare"
BEGIN
MENUITEM "Standard", IDM_VIEW_STANDARD, CHECKED
- MENUITEM "tiinific", IDM_VIEW_SCIENTIFIC, CHECKED
+ MENUITEM "Ştiințific", IDM_VIEW_SCIENTIFIC, CHECKED
MENUITEM "Conversie", IDM_VIEW_CONVERSION
MENUITEM SEPARATOR
MENUITEM "Grupare cifre", IDM_VIEW_GROUP, CHECKED
@@ -431,7 +433,7 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_STRING_LICENSE "ReactOS Calc este software liber sub licena GNU GPL. \r\n\r\nGsii o copie a acestei licene aici:\r\nhttp://www.gnu.org/licenses/gpl.html\r\n\r\nDe asemenea gsii traduceri ale aceste licene aici:\r\nhttp://www.gnu.org/licenses/translations.html\r\nTraducerea n limba romn de Petru Dimitriu."
+ IDS_STRING_LICENSE "ReactOS Calc este software liber sub licența GNU GPL. \r\n\r\nGăsiți o copie a acestei licențe aici:\r\nhttp://www.gnu.org/licenses/gpl.html\r\n\r\nDe asemenea găsiți traduceri ale aceste licențe aici:\r\nhttp://www.gnu.org/licenses/translations.html\r\nTraducerea în limba română de Petru Dimitriu."
IDS_MATH_ERROR "Eroare"
IDS_QUICKHELP "Ajutor rapid"
END
@@ -440,18 +442,18 @@ END
STRINGTABLE DISCARDABLE
BEGIN
IDS_CONV_ANGLE "Unghi"
- IDS_CONV_AREA "Suprafa"
+ IDS_CONV_AREA "Suprafață"
IDS_CONV_CONSUMPTION "Consum (motoare)"
- IDS_CONV_CURRENCY "Valut"
+ IDS_CONV_CURRENCY "Valută"
IDS_CONV_ENERGY "Energie"
IDS_CONV_LENGTH "Lungimi"
IDS_CONV_POWER "Putere"
IDS_CONV_PRESSURE "Presiune"
- IDS_CONV_TEMPERATURE "Temperatur"
+ IDS_CONV_TEMPERATURE "Temperatură"
IDS_CONV_TIME "Timp"
IDS_CONV_VELOCITY "Velocitate"
IDS_CONV_VOLUME "Volum"
- IDS_CONV_WEIGHT "Mas"
+ IDS_CONV_WEIGHT "Masă"
END
// TYPES OF ANGLES
@@ -467,7 +469,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_AREA_ACRES "Acri"
IDS_AREA_ACRES_BRAZIL "Acri (Brazilia)"
- IDS_AREA_ACRES_FRANCE "Acri (Frana)"
+ IDS_AREA_ACRES_FRANCE "Acri (Franța)"
IDS_AREA_ACRES_SCOTS "Acri (Scots)"
IDS_AREA_ACRES_US "Acri (SUA)"
IDS_AREA_ARES "Ares"
@@ -482,21 +484,21 @@ BEGIN
IDS_AREA_PYEONGBANGJA "Pyeongbangja"
IDS_AREA_RAI "Rai"
IDS_AREA_SE "Se"
- IDS_AREA_SQUARE_CENTIMETERS "Centimetri ptrai"
- IDS_AREA_SQUARE_CHR "Chr ptrai"
- IDS_AREA_SQUARE_FATHOMS "Fathomi ptrai"
- IDS_AREA_SQUARE_FATHOMS_HUNGARY "Fathomi ptrai (Ungaria)"
- IDS_AREA_SQUARE_FEET "Picioare ptrate"
- IDS_AREA_SQUARE_INCHES "oli ptrai"
- IDS_AREA_SQUARE_KILOMETERS "Kilometri ptrai"
- IDS_AREA_SQUARE_LAR "Lar ptrai"
- IDS_AREA_SQUARE_METER "Metri ptrai"
- IDS_AREA_SQUARE_MILES "Mile ptrate"
- IDS_AREA_SQUARE_MILLIMETERS "Milimetri ptrai"
- IDS_AREA_SQUARE_SHAKU "Shaku ptrai"
- IDS_AREA_SQUARE_TSUEN "Tsuen ptrai"
- IDS_AREA_SQUARE_VA "Va ptrai"
- IDS_AREA_SQUARE_YARD "Yarzi ptrai"
+ IDS_AREA_SQUARE_CENTIMETERS "Centimetri pătrați"
+ IDS_AREA_SQUARE_CHR "Chr pătrați"
+ IDS_AREA_SQUARE_FATHOMS "Fathomi pătrați"
+ IDS_AREA_SQUARE_FATHOMS_HUNGARY "Fathomi pătrați (Ungaria)"
+ IDS_AREA_SQUARE_FEET "Picioare pătrate"
+ IDS_AREA_SQUARE_INCHES "țoli pătrați"
+ IDS_AREA_SQUARE_KILOMETERS "Kilometri pătrați"
+ IDS_AREA_SQUARE_LAR "Lar pătrați"
+ IDS_AREA_SQUARE_METER "Metri pătrați"
+ IDS_AREA_SQUARE_MILES "Mile pătrate"
+ IDS_AREA_SQUARE_MILLIMETERS "Milimetri pătrați"
+ IDS_AREA_SQUARE_SHAKU "Shaku pătrați"
+ IDS_AREA_SQUARE_TSUEN "Tsuen pătrați"
+ IDS_AREA_SQUARE_VA "Va pătrați"
+ IDS_AREA_SQUARE_YARD "Yarzi pătrați"
IDS_AREA_TAN "Tan"
IDS_AREA_TSUBO "Tsubo"
END
@@ -513,48 +515,48 @@ END
// TYPES OF CURRENCIES
STRINGTABLE DISCARDABLE
BEGIN
- IDS_CURRENCY_AUSTRIAN_SCHILLING "iling autriac"
+ IDS_CURRENCY_AUSTRIAN_SCHILLING "Şiling autriac"
IDS_CURRENCY_BELGIAN_FRANC "Franc belgian"
- IDS_CURRENCY_CYPRIOT_POUND "Lir cipriot"
- IDS_CURRENCY_CZECH_KORUNA "Coroan ceh"
- IDS_CURRENCY_DEUTSCHE_MARK "Marc nemeasc"
+ IDS_CURRENCY_CYPRIOT_POUND "Liră cipriotă"
+ IDS_CURRENCY_CZECH_KORUNA "Coroană cehă"
+ IDS_CURRENCY_DEUTSCHE_MARK "Marcă nemțească"
IDS_CURRENCY_DUTCH_GUILDER "Guilder olandez"
IDS_CURRENCY_EURO "Euro"
- IDS_CURRENCY_FINNISH_MARKKA "Marc finlandez"
+ IDS_CURRENCY_FINNISH_MARKKA "Marcă finlandeză"
IDS_CURRENCY_FRENCH_FRANC "Franc framcez"
- IDS_CURRENCY_GREEK_DRACHMA "Drahm greceasc"
- IDS_CURRENCY_IRISH_POUND "Lir irlandez"
- IDS_CURRENCY_ITALIAN_LIRA "Lir italian"
+ IDS_CURRENCY_GREEK_DRACHMA "Drahmă grecească"
+ IDS_CURRENCY_IRISH_POUND "Liră irlandeză"
+ IDS_CURRENCY_ITALIAN_LIRA "Liră italiană"
IDS_CURRENCY_LUXEMBOURG_FRANC "Franc luxemburghez"
- IDS_CURRENCY_MALTESE_LIRA "Litr maltez"
+ IDS_CURRENCY_MALTESE_LIRA "Litră malteză"
IDS_CURRENCY_PORTOGUESE_ESCUDO "Escudo portughez"
- IDS_CURRENCY_SLOVAK_KORUNA "Coroan slovac"
+ IDS_CURRENCY_SLOVAK_KORUNA "Coroană slovacă"
IDS_CURRENCY_SLOVENIAN_TOLAR "Tolar sloven"
- IDS_CURRENCY_SPANISH_PESETA "Peseta spaniol"
+ IDS_CURRENCY_SPANISH_PESETA "Peseta spaniolă"
END
// TYPES OF ENERGIES
STRINGTABLE DISCARDABLE
BEGIN
- IDS_ENERGY_15_C_CALORIES "Calorii 15 C"
- IDS_ENERGY_BTUS "Uniti termale britanice"
+ IDS_ENERGY_15_C_CALORIES "Calorii 15 °C"
+ IDS_ENERGY_BTUS "Unități termale britanice"
IDS_ENERGY_ERGS "Ergs"
- IDS_ENERGY_EVS "Electron-Voli"
- IDS_ENERGY_FOOT_POUNDS "Picioare-Livr"
- IDS_ENERGY_IT_CALORIES "Calorii Tabel Internaional"
- IDS_ENERGY_IT_KILOCALORIES "Kilocalorii Tabel Internaional"
+ IDS_ENERGY_EVS "Electron-Volți"
+ IDS_ENERGY_FOOT_POUNDS "Picioare-Livră"
+ IDS_ENERGY_IT_CALORIES "Calorii Tabel Internațional"
+ IDS_ENERGY_IT_KILOCALORIES "Kilocalorii Tabel Internațional"
IDS_ENERGY_JOULES "Jouli"
IDS_ENERGY_KILOJOULES "KiloJouli"
IDS_ENERGY_KILOWATT_HOURS "Kilowatt ore"
- IDS_ENERGY_NUTRITION_CALORIES "Calorii nutriie"
- IDS_ENERGY_TH_CALORIES "Calorie termochimic"
+ IDS_ENERGY_NUTRITION_CALORIES "Calorii nutriție"
+ IDS_ENERGY_TH_CALORIES "Calorie termochimică"
END
// TYPES OF LENGTHS
STRINGTABLE DISCARDABLE
BEGIN
- IDS_LENGTH_ANGSTROMS "Angstrms"
- IDS_LENGTH_ASTRONOMICAL_UNITS "Uniti astronomice"
+ IDS_LENGTH_ANGSTROMS "Ångströms"
+ IDS_LENGTH_ASTRONOMICAL_UNITS "Unități astronomice"
IDS_LENGTH_BARLEYCORNS "Barleycorns"
IDS_LENGTH_CENTIMETERS "Centimetri"
IDS_LENGTH_CHAINS_UK "Chains (Marea Britanie)"
@@ -569,7 +571,7 @@ BEGIN
IDS_LENGTH_GAN "Gan"
IDS_LENGTH_HANDS "Hands"
IDS_LENGTH_HUNH "Hunh"
- IDS_LENGTH_INCHES "Incii (oli)"
+ IDS_LENGTH_INCHES "Incii (țoli)"
IDS_LENGTH_JA "Ja"
IDS_LENGTH_JEONG "Jeong"
IDS_LENGTH_KABIET "Kabiet"
@@ -577,7 +579,7 @@ BEGIN
IDS_LENGTH_KEUB "Keub"
IDS_LENGTH_KILOMETERS "Kilometeri"
IDS_LENGTH_LAR "Lar"
- IDS_LENGTH_LIGHT_YEARS "Ani lumin"
+ IDS_LENGTH_LIGHT_YEARS "Ani lumină"
IDS_LENGTH_LINKS_UK "Links (Marea Britanie)"
IDS_LENGTH_METERS "Metri"
IDS_LENGTH_MICRONS "Microni"
@@ -605,12 +607,12 @@ END
// TYPES OF POWERS
STRINGTABLE DISCARDABLE
BEGIN
- IDS_POWER_BTUS_PER_MINUTE "Uniti termice britanice pe minut"
+ IDS_POWER_BTUS_PER_MINUTE "Unități termice britanice pe minut"
IDS_POWER_FPS_PER_MINUTE "Picior-livre pe minut"
IDS_POWER_HORSEPOWER "Cai putere"
- IDS_POWER_KILOWATTS "Kilowai"
- IDS_POWER_MEGAWATTS "Megawai"
- IDS_POWER_WATTS "Wai"
+ IDS_POWER_KILOWATTS "Kilowați"
+ IDS_POWER_MEGAWATTS "Megawați"
+ IDS_POWER_WATTS "Wați"
END
// TYPE OF PRESSURES
@@ -620,9 +622,9 @@ BEGIN
IDS_PRESSURE_BARS "Bari"
IDS_PRESSURE_HECTOPASCALS "Hectopascali"
IDS_PRESSURE_KILOPASCALS "Kilopascali"
- IDS_PRESSURE_MM_OF_MERCURY "Milimetri coloan de mercur"
+ IDS_PRESSURE_MM_OF_MERCURY "Milimetri coloană de mercur"
IDS_PRESSURE_PASCALS "Pascali"
- IDS_PRESSURE_PSI "Livre-for pe ol ptrat"
+ IDS_PRESSURE_PSI "Livre-forță pe țol pătrat"
END
// TYPES OF TEMPERATURES
@@ -643,21 +645,21 @@ BEGIN
IDS_TIME_MILLISECONDS "Milisecunde"
IDS_TIME_MINUTES "Minute"
IDS_TIME_SECONDS "Secunde"
- IDS_TIME_WEEKS "Sptmni"
+ IDS_TIME_WEEKS "Săptămâni"
IDS_TIME_YEARS "Ani"
END
// TYPES OF VELOCITIES
STRINGTABLE DISCARDABLE
BEGIN
- IDS_VELOCITY_CMS_SECOND "Centimetri/or"
- IDS_VELOCITY_FEET_HOUR "Picioare/or"
- IDS_VELOCITY_FEET_SECOND "Picioare/secund"
+ IDS_VELOCITY_CMS_SECOND "Centimetri/oră"
+ IDS_VELOCITY_FEET_HOUR "Picioare/oră"
+ IDS_VELOCITY_FEET_SECOND "Picioare/secundă"
IDS_VELOCITY_KILOMETERS_HOUR "Kilometri/ore"
IDS_VELOCITY_KNOTS "Nod"
IDS_VELOCITY_MACH "Mach"
- IDS_VELOCITY_METERS_SECOND "Metri/secund"
- IDS_VELOCITY_MILES_HOUR "Mile/or"
+ IDS_VELOCITY_METERS_SECOND "Metri/secundă"
+ IDS_VELOCITY_MILES_HOUR "Mile/oră"
END
// TYPES OF VOLUMES
@@ -670,7 +672,7 @@ BEGIN
IDS_VOLUME_BUSHELS_US "Bushels (SUA)"
IDS_VOLUME_CUBIC_CENTIMETERS "Centrimetri cubi"
IDS_VOLUME_CUBIC_FEET "Picioare^3"
- IDS_VOLUME_CUBIC_INCHES "oli cubi"
+ IDS_VOLUME_CUBIC_INCHES "țoli cubi"
IDS_VOLUME_CUBIC_METERS "Metri cubi"
IDS_VOLUME_CUBIC_YARDS "Yarzi cubi"
IDS_VOLUME_DOE "Doe"
@@ -729,3 +731,5 @@ BEGIN
IDS_WEIGHT_TONS_UK "Tone (Marea Britanie)"
IDS_WEIGHT_TONS_US "Tone (SUA)"
END
+
+#pragma code_page(default)
diff --git a/reactos/base/applications/calc/utl.c b/reactos/base/applications/calc/utl.c
index 745ff265fc3..599115e9883 100644
--- a/reactos/base/applications/calc/utl.c
+++ b/reactos/base/applications/calc/utl.c
@@ -21,9 +21,9 @@ void prepare_rpn_result_2(calc_number_t *rpn, TCHAR *buffer, int size, int base)
/* calculate the width of integer number */
width = (rpn->f==0) ? 1 : (int)log10(fabs(rpn->f))+1;
if (calc.sci_out == TRUE || width > MAX_LD_WIDTH || width < -MAX_LD_WIDTH)
- ptr = buffer + _stprintf(buffer, TEXT("%#le"), rpn->f);
+ ptr = buffer + _stprintf(buffer, TEXT("%#e"), rpn->f);
else {
- ptr = buffer + _stprintf(buffer, TEXT("%#*.*lf"), width, ((MAX_LD_WIDTH-width-1)>=0) ? MAX_LD_WIDTH-width-1 : 0, rpn->f);
+ ptr = buffer + _stprintf(buffer, TEXT("%#*.*f"), width, ((MAX_LD_WIDTH-width-1)>=0) ? MAX_LD_WIDTH-width-1 : 0, rpn->f);
dst = _tcschr(buffer, TEXT('.'));
while (--ptr > dst)
if (*ptr != TEXT('0'))
diff --git a/reactos/base/applications/cmdutils/dbgprint/dbgprint.c b/reactos/base/applications/cmdutils/dbgprint/dbgprint.c
index 87ab64f1a1c..372e84780fa 100644
--- a/reactos/base/applications/cmdutils/dbgprint/dbgprint.c
+++ b/reactos/base/applications/cmdutils/dbgprint/dbgprint.c
@@ -35,6 +35,7 @@ int _tmain(int argc, TCHAR ** argv)
{
char psBuffer[128];
char psBuffer2[128];
+ char *nlptr2;
char cmd[255];
char test[300];
FILE *pPipe;
@@ -60,7 +61,7 @@ int _tmain(int argc, TCHAR ** argv)
{
while(fgets(psBuffer2, 128, pPipe2))
{
- char *nlptr2 = strchr(psBuffer2, '\n');
+ nlptr2 = strchr(psBuffer2, '\n');
if (nlptr2)
*nlptr2 = '\0';
puts(psBuffer2);
diff --git a/reactos/base/applications/cmdutils/xcopy/Bg.rc b/reactos/base/applications/cmdutils/xcopy/Bg.rc
deleted file mode 100644
index d62a20a104f..00000000000
--- a/reactos/base/applications/cmdutils/xcopy/Bg.rc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * XCOPY - Wine-compatible xcopy program
- * English language support
- *
- * Copyright (C) 2007 J. Edmeades
- *
- * 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
- */
-
-
-LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
-
-STRINGTABLE
-BEGIN
- STRING_INVPARMS, " - Use xcopy /? \n"
- STRING_INVPARM, " '%s' - Use xcopy /? \n"
- STRING_PAUSE, " \n"
- STRING_SIMCOPY, "%d () \n"
- STRING_COPY, "%d () \n"
- STRING_QISDIR, "'%s' \n" \
- "?\n" \
- "(F - , D - )\n"
- STRING_SRCPROMPT,"%s? (Y-|N-)\n"
- STRING_OVERWRITE," %s? (Y-|N-|A-)\n"
- STRING_COPYFAIL, " '%s' '%s' r/c %d\n"
- STRING_OPENFAIL, " '%s'\n"
- STRING_READFAIL, " '%s'\n"
- STRING_YES_CHAR, "Y"
- STRING_NO_CHAR, "N"
- STRING_ALL_CHAR, "A"
- STRING_FILE_CHAR,"F"
- STRING_DIR_CHAR, "D"
-
- STRING_HELP,
-"XCOPY - \n\
-\n\
-:\n\
-XCOPY [] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U] \n\
-\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\
-\n\
-:\n\
-\n\
-[/I] , \n\
-\t \n\
-[/S] \n\
-[/E] , \n\
-[/Q] , .. .\n\
-[/F] \n\
-[/L] , , \n\
-[/W] \n\
-[/T] , \n\
-[/Y] \n\
-[/-Y] \n\
-[/P] \n\
-[/N] \n\
-[/U] , \n\
-[/R] , \n\
-[/H] \n\
-[/C] , \n\
-[/A] \n\
-[/M] \n\
-\t \n\
-[/D | /D:m-d-y] , .\n\
-\t\t , , - \n\
-\t\t \n\n"
-
-END
diff --git a/reactos/base/applications/cmdutils/xcopy/Da.rc b/reactos/base/applications/cmdutils/xcopy/Da.rc
index 239b3a71d63..6a15a4440b2 100644
--- a/reactos/base/applications/cmdutils/xcopy/Da.rc
+++ b/reactos/base/applications/cmdutils/xcopy/Da.rc
@@ -19,6 +19,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "xcopy.h"
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/cmdutils/xcopy/De.rc b/reactos/base/applications/cmdutils/xcopy/De.rc
index 1af64183b49..c13addfdaaa 100644
--- a/reactos/base/applications/cmdutils/xcopy/De.rc
+++ b/reactos/base/applications/cmdutils/xcopy/De.rc
@@ -20,6 +20,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "xcopy.h"
+
+#pragma code_page(65001)
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
@@ -27,16 +30,16 @@ STRINGTABLE
{
STRING_INVPARMS, "Falsche Parameteranzahl - xcopy /? zeigt Hilfe an\n"
STRING_INVPARM, "Unbekannter Parameter '%s' - xcopy /? zeigt Hilfe an\n"
- STRING_PAUSE, "Eingabetaste bettigen, um mit dem Kopieren zu beginnen\n"
- STRING_SIMCOPY, "%d Datei(en) wrden kopiert\n"
+ STRING_PAUSE, "Eingabetaste betätigen, um mit dem Kopieren zu beginnen\n"
+ STRING_SIMCOPY, "%d Datei(en) würden kopiert\n"
STRING_COPY, "%d Datei(en) kopiert\n"
STRING_QISDIR, "Ist '%s' eine Datei oder ein Verzeichnis\n" \
"am Zielsort?\n" \
"(D - Datei, V - Verzeichnis)\n"
STRING_SRCPROMPT,"%s? (Ja|Nein)\n"
- STRING_OVERWRITE,"%s berschreiben? (Ja|Nein|Alle)\n"
+ STRING_OVERWRITE,"%s überschreiben? (Ja|Nein|Alle)\n"
STRING_COPYFAIL, "Kopieren von '%s' nach '%s' fehlgeschlagen. Fehlernummer: %d\n"
- STRING_OPENFAIL, "Fehler beim ffnen von '%s'\n"
+ STRING_OPENFAIL, "Fehler beim Öffnen von '%s'\n"
STRING_READFAIL, "Fehler beim Lesen von '%s'\n"
STRING_YES_CHAR, "J"
STRING_NO_CHAR, "N"
@@ -58,20 +61,20 @@ Mit:\n\
[/S] Kopiere Verzeichnisse und Unterverzeichnisse\n\
[/E] Kopiere Verzeichnisse und Unterverzeichnisse, auch leere\n\
[/Q] Zeige die Dateinamen beim Kopieren nicht an\n\
-[/F] Zeige vollstndige Dateinamen von Quelle und Ziel an\n\
-[/L] Simulation: Zeige die Namen der Datein, die kopiert wrden\n\
-[/W] Wartet vor Beginn des Kopierens auf Besttigung\n\
+[/F] Zeige vollständige Dateinamen von Quelle und Ziel an\n\
+[/L] Simulation: Zeige die Namen der Datein, die kopiert würden\n\
+[/W] Wartet vor Beginn des Kopierens auf Bestätigung\n\
[/T] Erzeuge eine leere Verzeichnisstruktur, ohne Dateien zu kopieren\n\
-[/Y] Keine Nachfrage vor dem berschreiben von Dateien\n\
-[/-Y] Nachrage vor dem berschreiben von Dateien\n\
-[/P] Fragt fr jede Quelldatei, ob sie kopiert werden soll\n\
+[/Y] Keine Nachfrage vor dem Überschreiben von Dateien\n\
+[/-Y] Nachrage vor dem Überschreiben von Dateien\n\
+[/P] Fragt für jede Quelldatei, ob sie kopiert werden soll\n\
[/N] Kopiert die Dateien unter ihrem Kurznamen\n\
[/U] Kopiert nur Dateien, die am Ziel bereits existieren\n\
-[/R] berschreibt schreibgeschtzte Dateien\n\
+[/R] Überschreibt schreibgeschützte Dateien\n\
[/H] Kopiere auch versteckte und Systemdateien\n\
[/C] Nach Fehlern den Kopiervorgang fortsetzen\n\
[/A] Nur Dateien mit Archivbit kopieren\n\
-[/M] Nur Dateien mit Archivbit kopieren, danach Archivbit lschen\n\
+[/M] Nur Dateien mit Archivbit kopieren, danach Archivbit löschen\n\
[/D | /D:m-d-y] Kopiere neue Dateien und Dateien, die neuer als das\n\
\t\tangegebene Datum sind. Wird kein Datum angegegebn, werden nur\n\
\t\tQuelldateien kopiert, die neuer sind als die Zieldatei\n\n"
diff --git a/reactos/base/applications/cmdutils/xcopy/El.rc b/reactos/base/applications/cmdutils/xcopy/El.rc
deleted file mode 100644
index df56a069945..00000000000
--- a/reactos/base/applications/cmdutils/xcopy/El.rc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * XCOPY - Wine-compatible xcopy program
- * English language support
- *
- * Copyright (C) 2007 J. Edmeades
- *
- * 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
- */
-
-
-LANGUAGE LANG_GREEK, SUBLANG_DEFAULT
-
-STRINGTABLE
-BEGIN
- STRING_INVPARMS, " - xcopy /? \n"
- STRING_INVPARM, " '%s' - xcopy /? \n"
- STRING_PAUSE, " \n"
- STRING_SIMCOPY, "%d () \n"
- STRING_COPY, "%d () \n"
- STRING_QISDIR, " '%s' \n" \
- " ;\n" \
- "(F - , D - )\n"
- STRING_SRCPROMPT,"%s? (()|())\n"
- STRING_OVERWRITE," %s? (()|()|())\n"
- STRING_COPYFAIL, " '%s' '%s' r/c %d\n"
- STRING_OPENFAIL, " '%s'\n"
- STRING_READFAIL, " '%s'\n"
- STRING_YES_CHAR, "Y"
- STRING_NO_CHAR, "N"
- STRING_ALL_CHAR, "A"
- STRING_FILE_CHAR,"F"
- STRING_DIR_CHAR, "D"
-
- STRING_HELP,
-"XCOPY - \n\
-\n\
-:\n\
-XCOPY [] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U] \n\
-\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\
-\n\
-:\n\
-\n\
-[/I] Assume directory if destination does not exist and copying 2 or \n\
-\tmore files\n\
-[/S] \n\
-[/E] , \n\
-[/Q] , .\n\
-[/F] \n\
-[/L] \n\
-[/W] \n\
-[/T] \n\
-[/Y] \n\
-[/-Y] \n\
-[/P] \n\
-[/N] \n\
-[/U] \n\
-[/R] \n\
-[/H] \n\
-[/C] \n\
-[/A] archive attribute set\n\
-[/M] archive attribute set, removes \n\
-\tarchive attribute\n\
-[/D | /D:m-d-y] .\n\
-\t\t , \n\
-\t\t \n\n"
-
-END
diff --git a/reactos/base/applications/cmdutils/xcopy/En.rc b/reactos/base/applications/cmdutils/xcopy/En.rc
index 33324ac9f4e..83ef291c9df 100644
--- a/reactos/base/applications/cmdutils/xcopy/En.rc
+++ b/reactos/base/applications/cmdutils/xcopy/En.rc
@@ -19,6 +19,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "xcopy.h"
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/cmdutils/xcopy/Fr.rc b/reactos/base/applications/cmdutils/xcopy/Fr.rc
index 7fe8f691cb4..047b4b3f739 100644
--- a/reactos/base/applications/cmdutils/xcopy/Fr.rc
+++ b/reactos/base/applications/cmdutils/xcopy/Fr.rc
@@ -18,6 +18,9 @@
* 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 "xcopy.h"
+
#pragma code_page(65001)
@@ -30,12 +33,12 @@ STRINGTABLE
STRING_PAUSE, "Appuyez sur ENTRÉE pour démarrer la copie\n"
STRING_SIMCOPY, "%d fichier(s) seront copiés\n"
STRING_COPY, "%d fichier(s) copiés\n"
- STRING_QISDIR, "Est-ce que « %s » est un fichier ou un répertoire\n" \
+ STRING_QISDIR, "« %s » est-il un fichier ou un répertoire\n" \
"dans la destination ?\n" \
"(F - Fichier, R - Répertoire)\n"
STRING_SRCPROMPT,"%s ? (Oui|Non)\n"
STRING_OVERWRITE,"Écraser %s ? (Oui|Non|Tous)\n"
- STRING_COPYFAIL, "La copie de « %s » vers « %s » a échoué avec le c/r %d\n"
+ STRING_COPYFAIL, "La copie de « %s » vers « %s » a échoué avec le code de retour %d\n"
STRING_OPENFAIL, "Impossible d'ouvrir « %s »\n"
STRING_READFAIL, "Impossible de lire « %s »\n"
STRING_YES_CHAR, "O"
@@ -45,38 +48,36 @@ STRINGTABLE
STRING_DIR_CHAR, "R"
STRING_HELP,
-"XCOPY - Copie les fichiers ou répertoires source vers une destination\n\
+"XCOPY - Copie les fichiers ou répertoires sources vers une destination\n\
\n\
Syntaxe :\n\
-XCOPY source [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\
+XCOPY source [destination] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\
\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\
\n\
-Où :\n\
+où :\n\
\n\
[/I] Suppose que la destination est un répertoire si elle n'existe pas et que l'on copie plus\n\
\td'un fichier\n\
[/S] Copie les répertoires et sous-répertoires\n\
[/E] Copie les répertoires et sous-répertoires, y compris ceux qui sont vides\n\
[/Q] Ne pas afficher la liste des fichiers copiés (mode silencieux)\n\
-[/F] Afficher la source et la destination complète lors de la copie\n\
-[/L] Simuler l'opération, en montrant le nom des fichiers qui auraient été copiés\n\
+[/F] Afficher les source et destination complètes lors de la copie\n\
+[/L] Simuler la copie, en montrant le nom des fichiers qui seraient copiés\n\
[/W] Demande avant de démarrer la copie\n\
-[/T] Créer une structure de répertoires vides, mais ne copie pas les fichiers\n\
+[/T] Créer une structure de répertoires vides, mais ne pas copier les fichiers\n\
[/Y] Ne demande pas de confirmation lors de l'écrasement des fichiers\n\
[/-Y] Demande une confirmation lors de l'écrasement des fichiers\n\
-[/P] Demande avant de copier chaque fichier source\n\
-[/N] Copie en utilisant des noms courts\n\
+[/P] Interroge l'utilisateur avant de copier chaque fichier source\n\
+[/N] Copie en utilisant les noms courts\n\
[/U] Copie uniquement les fichiers qui existent déjà dans la destination\n\
[/R] Écrase même les fichiers en lecture seule\n\
[/H] Inclure les fichiers cachés et système dans la copie\n\
[/C] Continue même si une erreur survient pendant la copie\n\
[/A] Copie uniquement les fichiers qui ont l'attribut archive défini\n\
-[/M] Copie uniquement les fichiers qui ont l'attribut archive défini, supprime\n\
+[/M] Copie uniquement les fichiers qui ont l'attribut archive défini ; supprime\n\
\tensuite l'attribut\n\
-[/D | /D:m-d-y] Copie uniquement les fichiers nouveaux ou ceux modifiés après la date spécifiée.\n\
-\t\tSi aucune date n'est spécifiée, copie uniquement lorsque le fichier de destination est plus vieux\n\
+[/D | /D:m-d-y] Copie uniquement les nouveaux fichiers, ou ceux modifiés après la date spécifiée.\n\
+\t\tSi aucune date n'est spécifiée, copie uniquement lorsque le fichier de destination est plus ancien\n\
\t\tque le fichier source\n\n"
}
-
-#pragma code_page(default)
diff --git a/reactos/base/applications/cmdutils/xcopy/It.rc b/reactos/base/applications/cmdutils/xcopy/It.rc
deleted file mode 100644
index f1487bf891a..00000000000
--- a/reactos/base/applications/cmdutils/xcopy/It.rc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * XCOPY - Wine-compatible xcopy program
- * English language support
- *
- * Copyright (C) 2007 J. Edmeades
- *
- * 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
- */
-
-
-LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
-
-STRINGTABLE
-{
- STRING_INVPARMS, "Numero di parametri non valido - Usare xcopy /? per l'aiuto\n"
- STRING_INVPARM, "Parametro non valido '%s' - Usare xcopy /? per l'aiuto\n"
- STRING_PAUSE, "Premeress per iniziare la copia\n"
- STRING_SIMCOPY, "%d file(s) saranno copiati\n"
- STRING_COPY, "%d file(s) copiati\n"
- STRING_QISDIR, "'%s' un file o una cartella ?\n" \
- "sulla destinazione?\n" \
- "(F - File, C - Cartella)\n"
- STRING_SRCPROMPT,"%s? (Si|No)\n"
- STRING_OVERWRITE,"Sovrascrivere %s? (Si|No|Tutti)\n"
- STRING_COPYFAIL, "Copia di '%s' su '%s' fallitocon r/c %d\n"
- STRING_OPENFAIL, "Impossibile aprire '%s'\n"
- STRING_READFAIL, "Impossibile leggre '%s'\n"
- STRING_YES_CHAR, "S"
- STRING_NO_CHAR, "N"
- STRING_ALL_CHAR, "T"
- STRING_FILE_CHAR,"F"
- STRING_DIR_CHAR, "C"
-
- STRING_HELP,
-"XCOPY - Copia i file sorgenti o un albero di cartelle su una destinazione\n\
-\n\
-Sintassi:\n\
-XCOPY sorgente [destinazione] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U] \n\
-\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\
-\n\
-Dove:\n\
-\n\
-[/I] Assumere che sia una cartella se la destinazione non esiste e vengono \n\
-\t\tcopiati due o pi file\n\
-[/S] Copiare cartelle e sottocartelle\n\
-[/E] Copiare cartelle e sottocartelle, comprese quelle vuote\n\
-[/Q] Non elencare i nomi dei file durante la copia.\n\
-[/F] Mostrare il percorso completo di sorgente e destinazione durante la copia\n\
-[/L] Simulare l'operazione, mostrare i nomi dei file che sarebbero copiati\n\
-[/W] Chidere conferma prima di iniziare la copia\n\
-[/T] Creare una strutture di cartelle vuota senza copiare i file\n\
-[/Y] Supprimere la richiesta di conferma per la sovrascrittura dei file\n\
-[/-Y] Abilitare la richiesta di conferma per la sovrascrittura dei file\n\
-[/P] Chiedere conferma prima della copia di ogni file\n\
-[/N] Copiare usando i nomi corti\n\
-[/U] Copiare solo i file che esistono gi nella destinazione\n\
-[/R] Sovrascrivere i file in sola lettura\n\
-[/H] Includere nella copia i file nascosti e quelli di sistema\n\
-[/C] Continuare nella copia anche se si verificano errori\n\
-[/A] Copiare solo i file con l'attributo di archivio attivo\n\
-[/M] Copiare solo i file con l'attributo di archivio attivo e poi \n\
-\t\tlo disattiva\n\
-[/D | /D:m-d-y] Copiare i file nuovi o modificati dopo la data indicata.\n\
-\t\tSe non indicata una data copiare solo se la destinazione e meno recente\n\
-\t\tdella sorgente\n\n"
-
-}
diff --git a/reactos/base/applications/cmdutils/xcopy/Ko.rc b/reactos/base/applications/cmdutils/xcopy/Ko.rc
index a3a89f99e24..6a5071cae86 100644
--- a/reactos/base/applications/cmdutils/xcopy/Ko.rc
+++ b/reactos/base/applications/cmdutils/xcopy/Ko.rc
@@ -20,6 +20,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "xcopy.h"
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/cmdutils/xcopy/Lt.rc b/reactos/base/applications/cmdutils/xcopy/Lt.rc
new file mode 100644
index 00000000000..182a39ab246
--- /dev/null
+++ b/reactos/base/applications/cmdutils/xcopy/Lt.rc
@@ -0,0 +1,83 @@
+/*
+ * XCOPY - Wine-compatible xcopy program
+ * Lithuanian language support
+ *
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * 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 "xcopy.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE
+{
+ STRING_INVPARMS, "Neteisingas parametrų skaičius - pagalba: xcopy /?\n"
+ STRING_INVPARM, "Neteisingas parametras '%s' - pagalba: xcopy /?\n"
+ STRING_PAUSE, "Spauskite kopijavimui pradėti\n"
+ STRING_SIMCOPY, "bus nukopijuota failų: %d\n"
+ STRING_COPY, "nukopijuota failų: %d\n"
+ STRING_QISDIR, "Ar '%s' yra failas, ar katalogas,\n" \
+ "ar paskirtis?\n" \
+ "(F - failas, K - katalogas)\n"
+ STRING_SRCPROMPT,"%s? (Taip|Ne)\n"
+ STRING_OVERWRITE,"Perrašyti %s? (Taip|Ne|Visus)\n"
+ STRING_COPYFAIL, "'%s' kopijavimas į '%s' nepavyko su r/c %d\n"
+ STRING_OPENFAIL, "Nepavyko atverti '%s'\n"
+ STRING_READFAIL, "Klaida skaitant '%s'\n"
+ STRING_YES_CHAR, "T"
+ STRING_NO_CHAR, "N"
+ STRING_ALL_CHAR, "V"
+ STRING_FILE_CHAR,"F"
+ STRING_DIR_CHAR, "K"
+
+ STRING_HELP,
+"XCOPY - Kopijuoja šaltinio failus ir katalogų medžius į paskirties vietą\n\
+\n\
+Sintaksė:\n\
+XCOPY šaltinis [paskirtis] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\
+\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\
+\n\
+Kur:\n\
+\n\
+[/I] Tarti, kad katalogas, jei paskirtis neegzistuoja ir kopijuojami\n\
+\t2 ar daugiau failų\n\
+[/S] Kopijuoti katalogus ir pakatalogius\n\
+[/E] Kopijuoti katalogus ir pakatalogius, taip pat ir tuščius\n\
+[/Q] Kopijuojant nerodyti vardų, kopijuoti tyliai.\n\
+[/F] Kopijuojant rodyti pilnus šaltinio ir paskirties vardus\n\
+[/L] Modeliuoti veikimą rodant failus, kurie būtų kopijuojami\n\
+[/W] Raginti prieš pradedant kopijavimo operaciją\n\
+[/T] Sukuria tuščią katalogų struktūrą, bet nekopijuoja jokių failų\n\
+[/Y] Nerodyti raginimų, kai perrašomi failai\n\
+[/-Y] Įjungti raginimus, kai perrašomi failai\n\
+[/P] Ragina prieš kopijuojant kiekvieną šaltinio failą\n\
+[/N] Kopijuoti naudojant trumpus vardus\n\
+[/U] Kopijuoti tik tuos failus, kurie jau egzistuoja paskirties vietoje\n\
+[/R] Perrašyti visus nekeičiamus failus\n\
+[/H] Kopijuoti paslėptus ir sisteminius failus\n\
+[/C] Tęsti, net jei įvyksta klaida kopijuojant\n\
+[/A] Kopijuoti tik failus su nustatytu archyvavimo požymiu\n\
+[/M] Kopijuoti tik failus su nustatytu archyvavimo požymiu, pašalinti\n\
+\tarchyvavimo požymį\n\
+[/D | /D:m-d-y] Kopijuoti naujus failus arba modifikuotos po nurodytos datos.\n\
+\t\tJei data nenurodyta, kopijuoti tik jei paskirties failas yra\n\
+\t\tsenesnis už šaltinio failą\n\n"
+
+}
diff --git a/reactos/base/applications/cmdutils/xcopy/Nl.rc b/reactos/base/applications/cmdutils/xcopy/Nl.rc
index f994cdd8f7e..b9db305843f 100644
--- a/reactos/base/applications/cmdutils/xcopy/Nl.rc
+++ b/reactos/base/applications/cmdutils/xcopy/Nl.rc
@@ -19,6 +19,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "xcopy.h"
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
diff --git a/reactos/base/applications/cmdutils/xcopy/No.rc b/reactos/base/applications/cmdutils/xcopy/No.rc
index ddcccf78fef..a3c223fc1e2 100644
--- a/reactos/base/applications/cmdutils/xcopy/No.rc
+++ b/reactos/base/applications/cmdutils/xcopy/No.rc
@@ -19,6 +19,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "xcopy.h"
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
diff --git a/reactos/base/applications/cmdutils/xcopy/Pl.rc b/reactos/base/applications/cmdutils/xcopy/Pl.rc
index 3d094a933ed..8b224eccfd6 100644
--- a/reactos/base/applications/cmdutils/xcopy/Pl.rc
+++ b/reactos/base/applications/cmdutils/xcopy/Pl.rc
@@ -20,6 +20,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "xcopy.h"
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/cmdutils/xcopy/Pt.rc b/reactos/base/applications/cmdutils/xcopy/Pt.rc
index 47e9609bd7f..d8254d5e1fb 100644
--- a/reactos/base/applications/cmdutils/xcopy/Pt.rc
+++ b/reactos/base/applications/cmdutils/xcopy/Pt.rc
@@ -19,6 +19,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "xcopy.h"
LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
diff --git a/reactos/base/applications/cmdutils/xcopy/Ru.rc b/reactos/base/applications/cmdutils/xcopy/Ru.rc
index 1d86ff46f8c..398345713f7 100644
--- a/reactos/base/applications/cmdutils/xcopy/Ru.rc
+++ b/reactos/base/applications/cmdutils/xcopy/Ru.rc
@@ -20,6 +20,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "xcopy.h"
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/cmdutils/xcopy/Si.rc b/reactos/base/applications/cmdutils/xcopy/Si.rc
index 092282c1636..1013837f402 100644
--- a/reactos/base/applications/cmdutils/xcopy/Si.rc
+++ b/reactos/base/applications/cmdutils/xcopy/Si.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "xcopy.h"
+
#pragma code_page(65001)
LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
@@ -78,5 +80,3 @@ Where:\n\
\t\tod izvora\n\n"
}
-
-#pragma code_page(default)
diff --git a/reactos/base/applications/cmdutils/xcopy/xcopy.h b/reactos/base/applications/cmdutils/xcopy/xcopy.h
index ee4bd910cde..1c933951284 100644
--- a/reactos/base/applications/cmdutils/xcopy/xcopy.h
+++ b/reactos/base/applications/cmdutils/xcopy/xcopy.h
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include
+
/* Local #defines */
#define RC_OK 0
#define RC_NOFILES 1
diff --git a/reactos/base/applications/cmdutils/xcopy/xcopy.rbuild b/reactos/base/applications/cmdutils/xcopy/xcopy.rbuild
index ff88fb9be4d..43921283ad3 100644
--- a/reactos/base/applications/cmdutils/xcopy/xcopy.rbuild
+++ b/reactos/base/applications/cmdutils/xcopy/xcopy.rbuild
@@ -3,10 +3,21 @@
.
wine
- kernel32
- advapi32
+ shell32
user32
+ kernel32
xcopy.c
- xcopy.rc
+ Da.rc
+ De.rc
+ En.rc
+ Fr.rc
+ Ko.rc
+ Lt.rc
+ Nl.rc
+ No.rc
+ Pl.rc
+ Pt.rc
+ Ru.rc
+ Si.rc
diff --git a/reactos/base/applications/cmdutils/xcopy/xcopy.rc b/reactos/base/applications/cmdutils/xcopy/xcopy.rc
deleted file mode 100644
index d08be502b12..00000000000
--- a/reactos/base/applications/cmdutils/xcopy/xcopy.rc
+++ /dev/null
@@ -1,14 +0,0 @@
-#include
-#include
-
-LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
-
-#define REACTOS_VERSION_DLL
-#define REACTOS_STR_FILE_DESCRIPTION "xcopy command\0"
-#define REACTOS_STR_INTERNAL_NAME "xcopy\0"
-#define REACTOS_STR_ORIGINAL_FILENAME "xcopy.exe\0"
-#include
-
-#include "rsrc.rc"
-
-
diff --git a/reactos/base/applications/downloader/downloader.xml b/reactos/base/applications/downloader/downloader.xml
index 52f15f14f61..867204bac7d 100644
--- a/reactos/base/applications/downloader/downloader.xml
+++ b/reactos/base/applications/downloader/downloader.xml
@@ -8,11 +8,11 @@
http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.20/win32/en-US/Firefox%20Setup%202.0.0.20.exe
- Mozilla Firefox (3.0.9)
+ Mozilla Firefox (3.0.11)
MPL/GPL/LGPL
- 3.0.9
+ 3.0.11
The most popular and one of the best free Web Browsers out there.
- http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.9/win32/en-US/Firefox%20Setup%203.0.9.exe
+ http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.11/win32/en-US/Firefox%20Setup%203.0.11.exe
Opera
@@ -21,6 +21,13 @@
The popular Opera Browser with many advanced features and including a Mail and BitTorrent client.
http://ftp.opera.com/pub/opera/win/963/en/Opera_963_classic_Setup.exe
+
+ AbyssX1 2.6
+ Freeware
+ 2.6
+ Abyss Web Server enables you to host your Web sites on your computer. It supports secure SSL/TLS connections (HTTPS) as well as a wide range of Web technologies. It can also run advanced PHP, Perl, Python, ASP, ASP.NET, and Ruby on Rails Web applications, which can be backed by databases such as MySQL, SQLite, MS SQL Server, MS Access, or Oracle
+ http://www.aprelium.com/data/abwsx1.exe
+
Mozilla Thunderbird (2.0.0.19)
MPL/GPL/LGPL
@@ -71,6 +78,20 @@
Word processor.
http://www.abiword.org/downloads/abiword/2.6.4/Windows/abiword-setup-2.6.4.exe
+
+ SoftMakerOff08
+ 2008
+ Shareware
+ SoftMaker Office 2008 comes with the following applications: TextMaker 2008: Reads and writes all Microsoft Word files without a hitch. PlanMaker 2008, the fully Excel-compatible spreadsheet. SoftMaker Presentations 2008, fully compatible with Microsoft PowerPoint.
+ http://www.softmaker.net/down/ofw08ev.exe
+
+
+ TextMaker Viewer 2009
+ TMViewer09
+ Freeware
+ A light viewer which lets you open, view, and print documents created with Microsoft Word 6.0 to 2007, TextMaker as well as OpenDocument and other common office file formats.
+ http://www.softmaker.net/down/TMViewerSetup.exe
+
OpenOffice.org 2.4.2
2.4.2
@@ -122,42 +143,36 @@
MFC 4 is needed by some applications
http://download.microsoft.com/download/ole/ole2v/3.5/w351/en-us/ole2v.exe
-
vb5run
5.0
Visual Basic 5 Runtime
http://download.microsoft.com/download/vb50pro/utility/1/win98/en-us/msvbvm50.exe
-
vb6run
6.0
Visual Basic 6 Runtime
http://download.microsoft.com/download/vb60pro/install/6/win98me/en-us/vbrun60.exe
-
vc6run
6.0
Visual Studio 6 Runtime
http://download.microsoft.com/download/vc60pro/update/1/w9xnt4/en-us/vc6redistsetup_enu.exe
-
vc2005run
7.0
Visual Studio 2005 Runtime
http://download.microsoft.com/download/d/3/4/d342efa6-3266-4157-a2ec-5174867be706/vcredist_x86.exe
-
vc2005sp1run
7.1
Visual Studio 2005 Runtime SP1
http://download.microsoft.com/download/e/1/c/e1c773de-73ba-494a-a5ba-f24906ecf088/vcredist_x86.exe
-
vc2008run
8.0
@@ -172,13 +187,20 @@
SMPlayer
http://dfn.dl.sourceforge.net/sourceforge/smplayer/smplayer_0.6.7_setup.exe
+
+ vlc0.8.0
+ GPL
+ 0.8.0
+ VLC media player is a highly portable multimedia player for various audio and video formats (MPEG-1, MPEG-2, MPEG-4, DivX, mp3, ogg, ...) as well as DVDs, VCDs, and various streaming protocols.
+ http://download.videolan.org/pub/videolan/vlc/0.8.0/win32/vlc-0.8.0-win32.exe
+
- ReactOS Build Environment 1.2
- 1.2
+ ReactOS Build Environment 1.4.4
+ 1.4.4
Allows you to build the ReactOS Source. For more instructions see ReactOS wiki.
- http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.2.exe
+ http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.4.4.exe
MinGW 5.1.3
@@ -186,6 +208,13 @@
A Port of the GNU toolchain with GCC, GDB, GNU make, etc.
http://ovh.dl.sourceforge.net/sourceforge/mingw/MinGW-5.1.3.exe
+
+ SciTE 1.78
+ 1.78
+ GPL
+ SciTE is a SCIntilla based Text Editor. Originally built to demonstrate Scintilla, it has grown to be a generally useful editor with facilities for building and running programs.
+ http://fastbull.dl.sourceforge.net/sourceforge/scintilla/Sc178.exe
+
FreeBASIC 0.18.4b
0.18.4b
@@ -213,10 +242,10 @@
http://www.muppetlabs.com/~breadbox/pub/software/tworld/tworld-1.3.0-win32-CCLP2.exe
- OpenTTD 0.6.0
- 0.6.0
- Open Source clone of the "Transport Tycoon Deluxe" game engine. You need a copy of Transport Tycoon.
- http://ovh.dl.sourceforge.net/sourceforge/openttd/openttd-0.6.0-win32.exe
+ OpenTTD 0.7.1
+ 0.7.1
+ Open Source clone of the "Transport Tycoon Deluxe" game engine. You either need a copy of Transport Tycoon or have to manually download and set up the OpenGFX files.
+ http://binaries.openttd.org/releases/0.7.1/openttd-0.7.1-windows-win32.exe
LBreakout2 2.4.1
diff --git a/reactos/base/applications/downloader/lang/ja-JP.rc b/reactos/base/applications/downloader/lang/ja-JP.rc
index 799ce2adcf8..eb8dd3949a4 100644
--- a/reactos/base/applications/downloader/lang/ja-JP.rc
+++ b/reactos/base/applications/downloader/lang/ja-JP.rc
@@ -33,10 +33,10 @@ BEGIN
IDS_NO_APP_TITLE "AvP[VIĂ܂"
IDS_NO_APP "_E[h{^NbNOɃAvP[VIĂ wvKvȏꍇAԉÉH}[N{^NbNĂB"
IDS_UPDATE_TITLE "Abvf[g"
- IDS_UPDATE "\܂B̋@\͖łB"
+ IDS_UPDATE "\\܂B̋@\\͖łB"
IDS_HELP_TITLE "wv"
IDS_HELP "JeSIAAvP[VIă_E[h{^NbNĂB AvP[V̏Abvf[gɂ̓wv{^ׂ̃{^NbNĂB"
- IDS_NO_APPS "\܂B̃JeSɂ̓AvP[V܂܂B `āAƃAvP[Vljł܂B"
+ IDS_NO_APPS "\\܂B̃JeSɂ̓AvP[V܂܂B `āAƃAvP[Vljł܂B"
IDS_CHOOSE_APP "AvP[VIĂB"
IDS_CHOOSE_SUB "TuJeSIĂB"
IDS_CHOOSE_CATEGORY "JeSIĂB"
diff --git a/reactos/base/applications/downloader/lang/pl-PL.rc b/reactos/base/applications/downloader/lang/pl-PL.rc
index b16f7748afa..17e950a7ab0 100644
--- a/reactos/base/applications/downloader/lang/pl-PL.rc
+++ b/reactos/base/applications/downloader/lang/pl-PL.rc
@@ -34,8 +34,8 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_WINDOW_TITLE "cignij ! - Meneder pobierania dla ReactOS"
- IDS_WELCOME_TITLE "Witamy w cignij dla ReactOS"
+ IDS_WINDOW_TITLE "Download! - Meneder pobierania dla ReactOS"
+ IDS_WELCOME_TITLE "Witamy w Download! dla ReactOS"
IDS_WELCOME "Prosz wybra kategori po lewej. Wersja programu: 1.1."
IDS_NO_APP_TITLE "Nie wybrano programu"
IDS_NO_APP "Prosz wybra program, przed klikniciem w przycisk cignij. W razie problemw kliknij w znak zapytania, w prawym grnym rogu okna."
diff --git a/reactos/base/applications/fontview/lang/ro-RO.rc b/reactos/base/applications/fontview/lang/ro-RO.rc
index 3095cbb1c11..07ce527cd66 100644
--- a/reactos/base/applications/fontview/lang/ro-RO.rc
+++ b/reactos/base/applications/fontview/lang/ro-RO.rc
@@ -1,16 +1,17 @@
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
STRINGTABLE DISCARDABLE
BEGIN
- IDS_QUIT, "Ieire"
+ IDS_QUIT, "Ieșire"
IDS_PRINT, "Imprimare"
IDS_STRING, "Profesoara mea de chimie scrie multe poezii frumoase. 1234567890"
IDS_ERROR, "Eroare"
- IDS_ERROR_NOMEM, "Nu e destul memorie pentru a ncheia operaia."
- IDS_ERROR_NOFONT, "Fiierul %1 este un fiier font deteriorat."
- IDS_ERROR_NOCLASS, "Nu s-a putut iniializa clasa de ferestre."
- IDS_ERROR_BADCMD, "Niciun font specificat.\nSintax:\n fontview.exe "
+ IDS_ERROR_NOMEM, "Nu e destulă memorie pentru a încheia operaţia."
+ IDS_ERROR_NOFONT, "Fișierul %1 este un fișier font deteriorat."
+ IDS_ERROR_NOCLASS, "Nu s-a putut iniţializa clasa de ferestre."
+ IDS_ERROR_BADCMD, "Niciun font specificat.\nSintaxă:\n fontview.exe "
END
-
-
+#pragma code_page(default)
diff --git a/reactos/base/applications/games/solitaire/lang/ro-RO.rc b/reactos/base/applications/games/solitaire/lang/ro-RO.rc
index 6865fffe926..8a06d1eaf75 100644
--- a/reactos/base/applications/games/solitaire/lang/ro-RO.rc
+++ b/reactos/base/applications/games/solitaire/lang/ro-RO.rc
@@ -9,19 +9,21 @@
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
/* Dialogs */
IDD_OPTIONS DIALOGEX DISCARDABLE 0, 0, 186, 118
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
-CAPTION "Opiuni"
+CAPTION "Opțiuni"
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX "Cri", -1, 7, 7, 65, 40
+ GROUPBOX "Cărți", -1, 7, 7, 65, 40
AUTORADIOBUTTON "Desenare &una", IDC_OPT_DRAWONE, 14, 19, 52, 10, WS_GROUP | WS_TABSTOP
AUTORADIOBUTTON "Desenare &trei", IDC_OPT_DRAWTHREE, 14, 32, 52, 10
- AUTOCHECKBOX "&Afiare timp", IDC_OPT_SHOWTIME, 7 ,51 ,65 ,10, WS_TABSTOP | WS_DISABLED
- AUTOCHECKBOX "B&ar de stare", IDC_OPT_STATUSBAR, 7, 66, 64, 10, WS_TABSTOP
+ AUTOCHECKBOX "&Afișare timp", IDC_OPT_SHOWTIME, 7 ,51 ,65 ,10, WS_TABSTOP | WS_DISABLED
+ AUTOCHECKBOX "B&ară de stare", IDC_OPT_STATUSBAR, 7, 66, 64, 10, WS_TABSTOP
DEFPUSHBUTTON "OK", IDOK, 35, 97, 50, 14
PUSHBUTTON "Anulare", IDCANCEL, 101, 97, 50, 14
@@ -29,7 +31,7 @@ END
IDD_CARDBACK DIALOGEX 6, 6, 221, 96
-CAPTION "Alegei setul de cri"
+CAPTION "Alegeți setul de cărți"
FONT 8, "MS Shell Dlg"
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
BEGIN
@@ -48,9 +50,9 @@ STRINGTABLE
BEGIN
IDS_SOL_NAME "Solitaire"
IDS_SOL_ABOUT "Solitaire de J Brown\nTradus de Petru Dimitriu\nCardLib versiunea 1.0."
- IDS_SOL_QUIT "Prsii jocul curent?"
- IDS_SOL_WIN "Felicitri, ai ctigat!"
- IDS_SOL_DEAL "Jucai din nou?"
+ IDS_SOL_QUIT "Părăsiți jocul curent?"
+ IDS_SOL_WIN "Felicitări, ați câștigat!"
+ IDS_SOL_DEAL "Jucați din nou?"
END
@@ -63,13 +65,13 @@ BEGIN
MENUITEM "&Joc\tF2", IDM_GAME_NEW
MENUITEM SEPARATOR
MENUITEM "Set&...", IDM_GAME_DECK
- MENUITEM "&Opiuni...", IDM_GAME_OPTIONS
+ MENUITEM "&Opțiuni...", IDM_GAME_OPTIONS
MENUITEM SEPARATOR
- MENUITEM "&Ieire", IDM_GAME_EXIT
+ MENUITEM "&Ieșire", IDM_GAME_EXIT
END
POPUP "&Ajutor"
BEGIN
- MENUITEM "&Coninut\tF1", IDM_HELP_CONTENTS
+ MENUITEM "&Conținut\tF1", IDM_HELP_CONTENTS
MENUITEM "&Despre", IDM_HELP_ABOUT
END
END
@@ -83,3 +85,5 @@ BEGIN
VK_F1, IDM_HELP_CONTENTS, VIRTKEY, NOINVERT
VK_F2, IDM_GAME_NEW, VIRTKEY, NOINVERT
END
+
+#pragma code_page(default)
diff --git a/reactos/base/applications/magnify/lang/ro-RO.rc b/reactos/base/applications/magnify/lang/ro-RO.rc
index 98946e0350b..ad8ad7bbd4a 100644
--- a/reactos/base/applications/magnify/lang/ro-RO.rc
+++ b/reactos/base/applications/magnify/lang/ro-RO.rc
@@ -1,11 +1,13 @@
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
IDC_MAGNIFIER MENU
BEGIN
- POPUP "&Fiier"
+ POPUP "&Fișier"
BEGIN
- MENUITEM "Ieire", IDM_EXIT
- MENUITEM "&Opiuni", IDM_OPTIONS
+ MENUITEM "Ieșire", IDM_EXIT
+ MENUITEM "&Opțiuni", IDM_OPTIONS
MENUITEM SEPARATOR
MENUITEM "&Despre ...", IDM_ABOUT
END
@@ -30,21 +32,21 @@ END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Setri Lup"
+CAPTION "Setări Lupă"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
- DEFPUSHBUTTON "Ieire",IDOK,96,161,50,14
+ DEFPUSHBUTTON "Ieșire",IDOK,96,161,50,14
PUSHBUTTON "Ajutor",IDC_BUTTON_HELP,38,161,50,14
- LTEXT "Nivel mrire:",IDC_STATIC,6,8,68,8
+ LTEXT "Nivel mărire:",IDC_STATIC,6,8,68,8
COMBOBOX IDC_ZOOM,72,6,63,66,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
- GROUPBOX "Urmrire",IDC_STATIC,7,25,139,59
+ GROUPBOX "Urmărire",IDC_STATIC,7,25,139,59
GROUPBOX "Presentare",IDC_STATIC,7,87,139,57
- CONTROL "Urmrire cursor maus",IDC_FOLLOWMOUSECHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,42,114,10
- CONTROL "Urmrire focalizare tastatur",IDC_FOLLOWKEYBOARDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,54,114,10
- CONTROL "Urmrire editare text",IDC_FOLLOWTEXTEDITINGCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,66,114,10
+ CONTROL "Urmărire cursor maus",IDC_FOLLOWMOUSECHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,42,114,10
+ CONTROL "Urmărire focalizare tastatură",IDC_FOLLOWKEYBOARDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,54,114,10
+ CONTROL "Urmărire editare text",IDC_FOLLOWTEXTEDITINGCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,66,114,10
CONTROL "Inversare culori",IDC_INVERTCOLORSCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,102,114,10
CONTROL "Pornire minimizat",IDC_STARTMINIMIZEDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,114,114,10
- CONTROL "Afiare lup",IDC_SHOWMAGNIFIERCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,126,114,10
+ CONTROL "Afișare lupă",IDC_SHOWMAGNIFIERCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,126,114,10
END
IDD_WARNINGDIALOG DIALOGEX 0, 0, 250, 97
@@ -54,11 +56,13 @@ FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,193,76,50,14
ICON IDI_ICON,IDC_STATIC,7,17,20,20
- LTEXT "Acest instrument este destinat celor cu deficiene vizuale minore. Pentru rezultate mai bune, folosii un instrument mai sofisticat.",IDC_STATIC,36,7,207,33
- CONTROL "Nu mai afia acest mesaj",IDC_SHOWWARNINGCHECK, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,43,80,137,10
+ LTEXT "Acest instrument este destinat celor cu deficiențe vizuale minore. Pentru rezultate mai bune, folosiți un instrument mai sofisticat.",IDC_STATIC,36,7,207,33
+ CONTROL "Nu mai afișa acest mesaj",IDC_SHOWWARNINGCHECK, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,43,80,137,10
END
STRINGTABLE
BEGIN
- IDS_APP_TITLE "Lup"
+ IDS_APP_TITLE "Lupă"
END
+
+#pragma code_page(default)
diff --git a/reactos/base/applications/mplay32/mplay32.c b/reactos/base/applications/mplay32/mplay32.c
index a6f2602d4f8..9b1b564908a 100644
--- a/reactos/base/applications/mplay32/mplay32.c
+++ b/reactos/base/applications/mplay32/mplay32.c
@@ -641,9 +641,12 @@ MainWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
break;
case IDM_ABOUT:
- ShellAbout(hwnd, szAppTitle, 0, 0);
+ {
+ HICON mplayIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));
+ ShellAbout(hwnd, szAppTitle, 0, mplayIcon);
+ DeleteObject(mplayIcon);
break;
-
+ }
case IDM_EXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
return 0;
diff --git a/reactos/base/applications/mplay32/mplay32.rbuild b/reactos/base/applications/mplay32/mplay32.rbuild
index 9ee483440b1..d920e958605 100644
--- a/reactos/base/applications/mplay32/mplay32.rbuild
+++ b/reactos/base/applications/mplay32/mplay32.rbuild
@@ -5,6 +5,7 @@
comdlg32
kernel32
user32
+ gdi32
winmm
shell32
mplay32.c
diff --git a/reactos/base/applications/mscutils/servman/lang/ro-RO.rc b/reactos/base/applications/mscutils/servman/lang/ro-RO.rc
index 2f4601e8c87..07f9b07c127 100644
--- a/reactos/base/applications/mscutils/servman/lang/ro-RO.rc
+++ b/reactos/base/applications/mscutils/servman/lang/ro-RO.rc
@@ -1,14 +1,16 @@
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
IDR_MAINMENU MENU
BEGIN
- POPUP "&Fiier"
+ POPUP "&Fișier"
BEGIN
MENUITEM "Export...", ID_EXPORT
MENUITEM SEPARATOR
- MENUITEM "I&eire", ID_EXIT
+ MENUITEM "I&eșire", ID_EXIT
END
- POPUP "Aciuni"
+ POPUP "Acțiuni"
BEGIN
MENUITEM "Conectare la...", ID_CONNECT, GRAYED
MENUITEM SEPARATOR
@@ -18,19 +20,19 @@ BEGIN
MENUITEM "Reluare", ID_RESUME, GRAYED
MENUITEM "Repornire", ID_RESTART, GRAYED
MENUITEM SEPARATOR
- MENUITEM "Remprosptare", ID_REFRESH
+ MENUITEM "Reîmprospătare", ID_REFRESH
MENUITEM SEPARATOR
MENUITEM "Editare...", ID_EDIT, GRAYED
MENUITEM "Creare...", ID_CREATE, GRAYED
- MENUITEM "tergere...", ID_DELETE, GRAYED
+ MENUITEM "Ștergere...", ID_DELETE, GRAYED
MENUITEM SEPARATOR
- MENUITEM "Proprieti...", ID_PROP, GRAYED
+ MENUITEM "Proprietăți...", ID_PROP, GRAYED
END
POPUP "Vizualizare"
BEGIN
MENUITEM "Pictograme mari", ID_VIEW_LARGE
MENUITEM "Pictograme mici", ID_VIEW_SMALL
- MENUITEM "List", ID_VIEW_LIST
+ MENUITEM "Listă", ID_VIEW_LIST
MENUITEM "Detalii", ID_VIEW_DETAILS
MENUITEM SEPARATOR
MENUITEM "Particularizare...",ID_VIEW_CUST, GRAYED
@@ -52,12 +54,12 @@ BEGIN
MENUITEM "Reluare", ID_RESUME, GRAYED
MENUITEM "Repornire", ID_RESTART, GRAYED
MENUITEM SEPARATOR
- MENUITEM "Remprosptare", ID_REFRESH
+ MENUITEM "Reîmprospătare", ID_REFRESH
MENUITEM SEPARATOR
MENUITEM "Editare...", ID_EDIT, GRAYED
- MENUITEM "tergere...", ID_DELETE, GRAYED
+ MENUITEM "Ștergere...", ID_DELETE, GRAYED
MENUITEM SEPARATOR
- MENUITEM "Proprieti...", ID_PROP, GRAYED
+ MENUITEM "Proprietăți...", ID_PROP, GRAYED
MENUITEM SEPARATOR
MENUITEM "Ajutor...", ID_HELP
END
@@ -69,7 +71,7 @@ FONT 8, "MS Shell Dlg",0,0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
BEGIN
LTEXT "Gestionar de servicii v0.8\nDrept de autor (C) 2005-2007\nde Ged Murphy (gedmurphy@reactos.org)", IDC_STATIC, 48, 7, 135, 30
- PUSHBUTTON "nchidere", IDOK, 75, 162, 44, 15
+ PUSHBUTTON "Închidere", IDOK, 75, 162, 44, 15
ICON IDI_SM_ICON, IDC_STATIC, 10, 10, 7, 30
EDITTEXT IDC_LICENSE_EDIT, 8, 44, 174, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE
END
@@ -89,27 +91,27 @@ BEGIN
PUSHBUTTON "Suspendare", IDC_PAUSE , 130, 155, 54, 15, WS_DISABLED
PUSHBUTTON "Reluare", IDC_RESUME, 192, 155, 54, 15, WS_DISABLED
LTEXT "Nume serviciu:", IDC_STATIC, 4, 11, 53, 11
- LTEXT "Nume de afiare:", IDC_STATIC, 4, 29, 53, 11
+ LTEXT "Nume de afișare:", IDC_STATIC, 4, 29, 53, 11
LTEXT "Descriere:", IDC_STATIC, 4, 51, 53, 11
LTEXT "Cale la executabil:", IDC_STATIC, 6, 73, 82, 9
LTEXT "Tip pornire:", IDC_STATIC, 6, 108, 53, 11
LTEXT "Stare serviciu:", IDC_STATIC, 4, 138, 53, 11
LTEXT "", IDC_SERV_STATUS, 70, 138, 176, 11, WS_CHILD | WS_VISIBLE
- LTEXT "Putei specifica parametrii de pornire care se aplic la pornirea serviciului de aici.",IDC_STATIC, 6,177,240,15
+ LTEXT "Puteți specifica parametrii de pornire care se aplică la pornirea serviciului de aici.",IDC_STATIC, 6,177,240,15
LTEXT "Parametri de pornire:", IDC_STATIC, 6, 200, 58, 11
EDITTEXT IDC_START_PARAM, 68, 199, 178, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "Editare", IDC_EDIT, 192, 215, 54, 15, WS_DISABLED
END
IDD_DLG_DEPEND DIALOGEX 6,6,253,225
-CAPTION "Dependene"
+CAPTION "Dependențe"
FONT 8, "MS Shell Dlg",0,0
STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_DLGFRAME | WS_SYSMENU | WS_THICKFRAME | WS_GROUP | WS_TABSTOP
BEGIN
CONTROL "", IDC_DEPEND_TREE1, "SysTreeView32" ,0x50010007, 8, 70, 236, 68, 0x00000200
CONTROL "", IDC_DEPEND_TREE2, "SysTreeView32", 0x50010007, 8, 151, 234, 67, 0x00000200
- LTEXT "Unele servicii depind de alte servicii sau drivere de sistem i ncarc alte grupuri. Dac o component de sistem a oprit un astfel de serviciu sau dac acesta nu funcioneaz corect, serviciile care depind de el pot avea probleme.", IDC_STATIC,8, 7, 238, 26
- LTEXT "Acest serviciu depinde de urmtoarele componente:", IDC_STATIC, 8, 57, 236, 9
+ LTEXT "Unele servicii depind de alte servicii sau drivere de sistem și încarcă alte grupuri. Dacă o componentă de sistem a oprit un astfel de serviciu sau dacă acesta nu funcționează corect, serviciile care depind de el pot avea probleme.", IDC_STATIC,8, 7, 238, 26
+ LTEXT "Acest serviciu depinde de următoarele componente:", IDC_STATIC, 8, 57, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END
@@ -124,12 +126,12 @@ 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 "*Nume serviciu :", IDC_STATIC, 12, 12, 54, 9
- LTEXT "*Nume pentru afiare :", IDC_STATIC, 12, 33, 54, 9
+ LTEXT "*Nume pentru afișare :", IDC_STATIC, 12, 33, 54, 9
LTEXT "*Cale la executabil :", IDC_STATIC, 10, 51, 68, 9
LTEXT "Descriere :", IDC_STATIC, 12, 86, 44, 9
PUSHBUTTON "OK", IDOK, 126, 192, 44, 13
PUSHBUTTON "Anulare", IDCANCEL, 176, 192, 46, 13
- LTEXT "Alte opiuni (clic pe Ajutor pt. detalii)", IDC_STATIC, 10, 151, 134, 9
+ LTEXT "Alte opțiuni (clic pe Ajutor pt. detalii)", IDC_STATIC, 10, 151, 134, 9
PUSHBUTTON "Ajutor", ID_CREATE_HELP, 10, 192, 44, 13
END
@@ -139,7 +141,7 @@ FONT 8, "MS Shell Dlg",0,0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | DS_MODALFRAME
BEGIN
ICON IDI_WARNING, IDC_STATIC, 10, 8, 24, 22
- LTEXT "Sigur vrei s tergei acest serviciu? Aceast operaie nu poate fi anulat!", IDC_STATIC, 50, 6, 125, 25
+ LTEXT "Sigur vreți să ștergeți acest serviciu? Această operație nu poate fi anulată!", IDC_STATIC, 50, 6, 125, 25
LTEXT "Nume serviciu:",IDC_STATIC, 6, 40, 80, 9
LTEXT "", IDC_DEL_NAME, 15, 53, 160, 15
EDITTEXT IDC_DEL_DESC, 6, 73, 174, 48, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_EX_STATICEDGE | ES_MULTILINE | ES_READONLY
@@ -155,13 +157,13 @@ BEGIN
ICON IDI_WARNING, IDC_STATIC, 10, 8, 24, 22
LTEXT "", IDC_STOP_DEPENDS, 40, 8, 170, 25
LISTBOX IDC_STOP_DEPENDS_LB, 15, 40, 210, 70, WS_CHILD | WS_VISIBLE | WS_EX_STATICEDGE | LBS_NOSEL
- LTEXT "Vrei s oprii aceste servicii?",IDC_STATIC, 15, 110, 150, 10
+ LTEXT "Vreți să opriți aceste servicii?",IDC_STATIC, 15, 110, 150, 10
DEFPUSHBUTTON "Da", IDOK, 60, 129, 54, 14
PUSHBUTTON "Nu", IDCANCEL, 120, 129, 54, 14
END
IDD_DLG_HELP_OPTIONS DIALOGEX 6,6,200,150
-CAPTION "Opiuni"
+CAPTION "Opțiuni"
FONT 8, "MS Shell Dlg",0,0
STYLE 0x10CF0000
BEGIN
@@ -178,7 +180,7 @@ BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11
LTEXT "", IDC_SERVCON_NAME, 8, 25, 66, 11
- PUSHBUTTON "&nchidere", IDOK, 100, 70, 54, 13
+ PUSHBUTTON "&Închidere", IDOK, 100, 70, 54, 13
END
@@ -204,34 +206,34 @@ END
STRINGTABLE DISCARDABLE
BEGIN
IDS_NUM_SERVICES "Num. servicii: %d"
- IDS_STOP_DEPENDS "Dac %s se oprete aceste procese se vor opri de asemenea."
- IDS_NO_DEPENDS ""
- IDS_LICENSE "Tradus n limba romn de Petru Dimitriu.\r\nAcest program este software liber; putei redistribui sau modifica programul sub termenii licenei publice GNU aa cum este publicat de Free Software Foundation - fie versiunea 2 a licenei, sau (la alegerea dvs.) oricare versiune ulterioar.\r\n\r\nAcest program este distribuit n sperana c va fi de folos, dar FR NICIO GARANIE, nici mcar garania VANDABILITII sau a POTRIVIRII PENTRU UN SCOP ANUME. Vedei Licena GNU GPL pentru detalii.\r\n\r\nDvs. ar trebui s fi primit o copie a licenei mpreun cu acest program; dac nu, scriei la Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA."
+ IDS_STOP_DEPENDS "Dacă %s se oprește aceste procese se vor opri de asemenea."
+ IDS_NO_DEPENDS ""
+ IDS_LICENSE "Tradus în limba română de Petru Dimitriu.\r\nAcest program este software liber; puteți redistribui sau modifica programul sub termenii licenței publice GNU așa cum este publicată de Free Software Foundation - fie versiunea 2 a licenței, sau (la alegerea dvs.) oricare versiune ulterioară.\r\n\r\nAcest program este distribuit în speranța că va fi de folos, dar FĂRĂ NICIO GARANțIE, nici măcar garanția VANDABILITĂțII sau a POTRIVIRII PENTRU UN SCOP ANUME. Vedeți Licența GNU GPL pentru detalii.\r\n\r\nDvs. ar trebui să fi primit o copie a licenței împreună cu acest program; dacă nu, scrieți la Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA."
END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_TOOLTIP_PROP "Proprieti"
- IDS_TOOLTIP_REFRESH "Remprosptare"
- IDS_TOOLTIP_EXPORT "List de export"
- IDS_TOOLTIP_CREATE "Creeaz un serviciu nou"
- IDS_TOOLTIP_DELETE "Elimin un serviciu existent"
- IDS_TOOLTIP_START "Pornete serviciul"
- IDS_TOOLTIP_STOP "Oprete serviciul"
- IDS_TOOLTIP_PAUSE "Suspend serviciul"
- IDS_TOOLTIP_RESTART "Repornete serviciul"
+ IDS_TOOLTIP_PROP "Proprietăți"
+ IDS_TOOLTIP_REFRESH "Reîmprospătare"
+ IDS_TOOLTIP_EXPORT "Listă de export"
+ IDS_TOOLTIP_CREATE "Creează un serviciu nou"
+ IDS_TOOLTIP_DELETE "Elimină un serviciu existent"
+ IDS_TOOLTIP_START "Pornește serviciul"
+ IDS_TOOLTIP_STOP "Oprește serviciul"
+ IDS_TOOLTIP_PAUSE "Suspendă serviciul"
+ IDS_TOOLTIP_RESTART "Repornește serviciul"
END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_PROGRESS_INFO_START "ReactOS ncearc s porneasc urmtorul serviciu"
- IDS_PROGRESS_INFO_STOP "ReactOS ncearc s opreasc urmtorul serviciu"
- IDS_PROGRESS_INFO_PAUSE "ReactOS ncearc s suspende urmtorul serviciu"
- IDS_PROGRESS_INFO_RESUME "ReactOS ncearc s reia urmtorul serviciu"
+ IDS_PROGRESS_INFO_START "ReactOS încearcă să pornească următorul serviciu"
+ IDS_PROGRESS_INFO_STOP "ReactOS încearcă să oprească următorul serviciu"
+ IDS_PROGRESS_INFO_PAUSE "ReactOS încearcă să suspende următorul serviciu"
+ IDS_PROGRESS_INFO_RESUME "ReactOS încearcă să reia următorul serviciu"
IDS_CREATE_SUCCESS "Serviciu creat cu succes"
IDS_DELETE_SUCCESS "Serviciu eliminat cu succes"
- IDS_CREATE_REQ "Cmpurile cu\nasterisc sunt obligatorii"
- IDS_DELETE_STOP "Trebuie s oprii serviciul manual naintea eliminrii!"
+ IDS_CREATE_REQ "Câmpurile cu\nasterisc sunt obligatorii"
+ IDS_DELETE_STOP "Trebuie să opriți serviciul manual înaintea eliminării!"
END
STRINGTABLE DISCARDABLE
@@ -243,36 +245,36 @@ END
STRINGTABLE DISCARDABLE
BEGIN
IDS_HINT_BLANK " "
- IDS_HINT_EXPORT " Export lista curent ntr-un fiier."
- IDS_HINT_EXIT " Prsete programul."
+ IDS_HINT_EXPORT " Exportă lista curentă într-un fișier."
+ IDS_HINT_EXIT " Părăsește programul."
- IDS_HINT_CONNECT " Gestioneaz un alt computer."
- IDS_HINT_START " Pornete serviciul selectat."
- IDS_HINT_STOP " Oprete serviciul selectat."
- IDS_HINT_PAUSE " Suspend serviciul selectat."
+ IDS_HINT_CONNECT " Gestionează un alt computer."
+ IDS_HINT_START " Pornește serviciul selectat."
+ IDS_HINT_STOP " Oprește serviciul selectat."
+ IDS_HINT_PAUSE " Suspendă serviciul selectat."
IDS_HINT_RESUME " Reia serviciul selectat."
- IDS_HINT_RESTART " Oprete i pornete serviciul selectat."
- IDS_HINT_REFRESH " Remprospteaz lista de servicii."
- IDS_HINT_EDIT " Editeaz proprietile serviciului selectat."
- IDS_HINT_CREATE " Creeaz un nou serviciu."
- IDS_HINT_DELETE " Elimin serviciul selectat."
- IDS_HINT_PROP " Deschide fila de proprieti pentru selecia curent."
+ IDS_HINT_RESTART " Oprește și pornește serviciul selectat."
+ IDS_HINT_REFRESH " Reîmprospătează lista de servicii."
+ IDS_HINT_EDIT " Editează proprietățile serviciului selectat."
+ IDS_HINT_CREATE " Creează un nou serviciu."
+ IDS_HINT_DELETE " Elimină serviciul selectat."
+ IDS_HINT_PROP " Deschide fila de proprietăți pentru selecția curentă."
- IDS_HINT_LARGE " Afieaz elementele folosind pictograme mari."
- IDS_HINT_SMALL " Afieaz elementele folosind pictograme mici."
- IDS_HINT_LIST " Afieaz elementele n list."
- IDS_HINT_DETAILS " Afieaz informaii despre fiecare element ntr-o fereastr."
- IDS_HINT_CUST " Particularizeaz afiajul."
+ IDS_HINT_LARGE " Afișează elementele folosind pictograme mari."
+ IDS_HINT_SMALL " Afișează elementele folosind pictograme mici."
+ IDS_HINT_LIST " Afișează elementele în listă."
+ IDS_HINT_DETAILS " Afișează informații despre fiecare element într-o fereastră."
+ IDS_HINT_CUST " Particularizează afișajul."
- IDS_HINT_HELP " Afieaz fereastra de ajutor."
+ IDS_HINT_HELP " Afișează fereastra de ajutor."
IDS_HINT_ABOUT " Despre Gestionarul de servicii ReactOS."
- IDS_HINT_SYS_RESTORE " Restabilete fereastra la mrimea original."
- IDS_HINT_SYS_MOVE " Mut fereastra."
- IDS_HINT_SYS_SIZE " Redimensioneaz fereastra."
- IDS_HINT_SYS_MINIMIZE " Reduce fereastra la o pictogram."
- IDS_HINT_SYS_MAXIMIZE " Mrete fereastra astfel nct aceasta s acopere tot ecranul."
- IDS_HINT_SYS_CLOSE " nchide fereastra."
+ IDS_HINT_SYS_RESTORE " Restabilește fereastra la mărimea originală."
+ IDS_HINT_SYS_MOVE " Mută fereastra."
+ IDS_HINT_SYS_SIZE " Redimensionează fereastra."
+ IDS_HINT_SYS_MINIMIZE " Reduce fereastra la o pictogramă."
+ IDS_HINT_SYS_MAXIMIZE " Mărșete fereastra astfel încât aceasta să acopere tot ecranul."
+ IDS_HINT_SYS_CLOSE " Închide fereastra."
END
/* Application title */
@@ -280,3 +282,5 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_APPNAME "Gestionarul de servicii ReactOS"
END
+
+#pragma code_page(default)
diff --git a/reactos/base/applications/network/ipconfig/ipconfig.c b/reactos/base/applications/network/ipconfig/ipconfig.c
index 3210c39a6c0..4d7bff7d603 100644
--- a/reactos/base/applications/network/ipconfig/ipconfig.c
+++ b/reactos/base/applications/network/ipconfig/ipconfig.c
@@ -515,6 +515,7 @@ VOID Release(LPTSTR Index)
{
IP_ADAPTER_INDEX_MAP AdapterInfo;
DWORD ret;
+ DWORD i;
/* if interface is not given, query GetInterfaceInfo */
if (Index == NULL)
@@ -530,8 +531,19 @@ VOID Release(LPTSTR Index)
if (GetInterfaceInfo(pInfo, &ulOutBufLen) == NO_ERROR )
{
- CopyMemory(&AdapterInfo, &pInfo->Adapter[0], sizeof(IP_ADAPTER_INDEX_MAP));
- _tprintf(_T("name - %S\n"), pInfo->Adapter[0].Name);
+ for (i = 0; i < pInfo->NumAdapters; i++)
+ {
+ CopyMemory(&AdapterInfo, &pInfo->Adapter[i], sizeof(IP_ADAPTER_INDEX_MAP));
+ _tprintf(_T("name - %S\n"), pInfo->Adapter[i].Name);
+
+ /* Call IpReleaseAddress to release the IP address on the specified adapter. */
+ if ((ret = IpReleaseAddress(&AdapterInfo)) != NO_ERROR)
+ {
+ _tprintf(_T("\nAn error occured while releasing interface %S : \n"), AdapterInfo.Name);
+ DoFormatMessage(ret);
+ }
+ }
+
HeapFree(ProcessHeap, 0, pInfo);
}
else
@@ -556,15 +568,6 @@ VOID Release(LPTSTR Index)
* ipconfig /release *con* will release all cards with 'con' in their name
*/
}
-
-
- /* Call IpReleaseAddress to release the IP address on the specified adapter. */
- if ((ret = IpReleaseAddress(&AdapterInfo)) != NO_ERROR)
- {
- _tprintf(_T("\nAn error occured while releasing interface %S : \n"), AdapterInfo.Name);
- DoFormatMessage(ret);
- }
-
}
@@ -573,6 +576,7 @@ VOID Release(LPTSTR Index)
VOID Renew(LPTSTR Index)
{
IP_ADAPTER_INDEX_MAP AdapterInfo;
+ DWORD i;
/* if interface is not given, query GetInterfaceInfo */
if (Index == NULL)
@@ -603,8 +607,19 @@ VOID Renew(LPTSTR Index)
/* Make a second call to GetInterfaceInfo to get the actual data we want */
if (GetInterfaceInfo(pInfo, &ulOutBufLen) == NO_ERROR )
{
- CopyMemory(&AdapterInfo, &pInfo->Adapter[0], sizeof(IP_ADAPTER_INDEX_MAP));
- _tprintf(_T("name - %S\n"), pInfo->Adapter[0].Name);
+ for (i = 0; i < pInfo->NumAdapters; i++)
+ {
+ CopyMemory(&AdapterInfo, &pInfo->Adapter[i], sizeof(IP_ADAPTER_INDEX_MAP));
+ _tprintf(_T("name - %S\n"), pInfo->Adapter[i].Name);
+
+
+ /* Call IpRenewAddress to renew the IP address on the specified adapter. */
+ if (IpRenewAddress(&AdapterInfo) != NO_ERROR)
+ {
+ _tprintf(_T("\nAn error occured while renew interface %s : "), _T("*name*"));
+ DoFormatMessage(0);
+ }
+ }
}
else
{
@@ -623,14 +638,6 @@ VOID Renew(LPTSTR Index)
* ipconfig /renew *con* will renew all cards with 'con' in their name
*/
}
-
-
- /* Call IpRenewAddress to renew the IP address on the specified adapter. */
- if (IpRenewAddress(&AdapterInfo) != NO_ERROR)
- {
- _tprintf(_T("\nAn error occured while renew interface %s : "), _T("*name*"));
- DoFormatMessage(0);
- }
}
diff --git a/reactos/base/applications/notepad/lang/ro-RO.rc b/reactos/base/applications/notepad/lang/ro-RO.rc
index a6b31ae8f45..2183b071dec 100644
--- a/reactos/base/applications/notepad/lang/ro-RO.rc
+++ b/reactos/base/applications/notepad/lang/ro-RO.rc
@@ -20,6 +20,8 @@
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
ID_ACCEL ACCELERATORS
BEGIN
"^A", CMD_SELECT_ALL
@@ -40,18 +42,18 @@ END
MAIN_MENU MENU
BEGIN
- POPUP "&Fiier"
+ POPUP "&Fișier"
BEGIN
MENUITEM "&Nou\tCtrl+N", CMD_NEW
MENUITEM "&Deschidere...\tCtrl+O", CMD_OPEN
MENUITEM "&Salvare\tCtrl+S", CMD_SAVE
MENUITEM "Salvare &ca...", CMD_SAVE_AS
MENUITEM SEPARATOR
- MENUITEM "Iniializare pag&in...", CMD_PAGE_SETUP
+ MENUITEM "Inițializare pag&ină...", CMD_PAGE_SETUP
MENUITEM "&Imprimare\tCtrl+P", CMD_PRINT
- MENUITEM "Setare i&mprimant...", CMD_PRINTER_SETUP
+ MENUITEM "Setare i&mprimantă...", CMD_PRINTER_SETUP
MENUITEM SEPARATOR
- MENUITEM "I&eire", CMD_EXIT
+ MENUITEM "I&eșire", CMD_EXIT
END
POPUP "&Editare"
BEGIN
@@ -60,29 +62,29 @@ BEGIN
MENUITEM "Decupare\tCtrl+X", CMD_CUT
MENUITEM "&Copiere\tCtrl+C", CMD_COPY
MENUITEM "&Lipire\tCtrl+V", CMD_PASTE
- MENUITEM "&tergere\tDel", CMD_DELETE
+ MENUITEM "&Ștergere\tDel", CMD_DELETE
MENUITEM SEPARATOR
- MENUITEM "&Gsire...\tCtrl+F", CMD_SEARCH
- MENUITEM "Gsire &urmtorul\tF3", CMD_SEARCH_NEXT
- MENUITEM "nlocuire\tCtrl+H", CMD_REPLACE
+ MENUITEM "&Găsire...\tCtrl+F", CMD_SEARCH
+ MENUITEM "Găsire &următorul\tF3", CMD_SEARCH_NEXT
+ MENUITEM "Înlocuire\tCtrl+H", CMD_REPLACE
MENUITEM "Mergere la...\tCtrl+G", CMD_GOTO
MENUITEM SEPARATOR
- MENUITEM "Selectare &total\tCtrl+A", CMD_SELECT_ALL
- MENUITEM "&Or/dat\tF5", CMD_TIME_DATE
+ MENUITEM "Selectare &totală\tCtrl+A", CMD_SELECT_ALL
+ MENUITEM "&Oră/dată\tF5", CMD_TIME_DATE
END
POPUP "F&ormatare"
BEGIN
- MENUITEM "&mprire linii lungi", CMD_WRAP
+ MENUITEM "&Împărțire linii lungi", CMD_WRAP
MENUITEM "&Font...", CMD_FONT
END
POPUP "&Vizualizare"
BEGIN
- MENUITEM "Bar de &stare", CMD_STATUSBAR
+ MENUITEM "Bară de &stare", CMD_STATUSBAR
END
POPUP "&Ajutor"
BEGIN
- MENUITEM "&Coninut", CMD_HELP_CONTENTS
- MENUITEM "&Cutare...", CMD_HELP_SEARCH
+ MENUITEM "&Conținut", CMD_HELP_CONTENTS
+ MENUITEM "&Căutare...", CMD_HELP_SEARCH
MENUITEM "&Ajutor despre ajutor", CMD_HELP_ON_HELP
MENUITEM SEPARATOR
MENUITEM "&Despre" CMD_ABOUT
@@ -95,7 +97,7 @@ END
DIALOG_PAGESETUP DIALOGEX 0, 0, 225, 95
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
-CAPTION "Iniializare pagin"
+CAPTION "Inițializare pagină"
BEGIN
LTEXT "&Antet:", 0x140, 10, 07, 40, 15
EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP
@@ -103,7 +105,7 @@ LTEXT "&Subsol:", 0x142, 10, 24, 40, 15
EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP
GROUPBOX "&Margini:", 0x144, 10, 43,160, 45
-LTEXT "&Stnga:", 0x145, 20, 55, 30, 10, WS_CHILD
+LTEXT "&Stânga:", 0x145, 20, 55, 30, 10, WS_CHILD
EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT "&Sus:", 0x148, 20, 73, 30, 10, WS_CHILD
EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
@@ -127,7 +129,7 @@ BEGIN
COMBOBOX ID_ENCODING,54,0,156,80,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Codificare:",0x155,5,2,41,12
COMBOBOX ID_EOLN,54,18,156,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-LTEXT "Sfrit:",0x156,5,20,41,12
+LTEXT "Sfârșit:",0x156,5,20,41,12
END
/* Dialog 'Go To' */
@@ -137,21 +139,21 @@ FONT 8, "MS Shell Dlg"
CAPTION "Mergere la linie"
BEGIN
EDITTEXT ID_LINENUMBER,54,10,106,12,WS_CHILD | WS_BORDER | WS_TABSTOP
-LTEXT "Numr linie:",0x155,5,12,41,12,WS_CHILD | WS_TABSTOP | ES_NUMBER
+LTEXT "Număr linie:",0x155,5,12,41,12,WS_CHILD | WS_TABSTOP | ES_NUMBER
DEFPUSHBUTTON "OK", IDOK, 75, 30, 40, 15, WS_CHILD | WS_TABSTOP
PUSHBUTTON "Anulare", 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 "Despre Carneelul ReactOS"
+CAPTION "Despre Carnețelul ReactOS"
FONT 8, "MS Shell Dlg"
BEGIN
- CONTROL "Carneelul ReactOS v1.0\r\nDrept de autor 1997,98 Marcel Baur \r\nCopyright 2000 Mike McCormack \r\nCopyright 2002 Sylvain Petreolle \r\nCopyright 2002 Andriy Palamarchuk\r\n",
+ CONTROL "Carnețelul ReactOS v1.0\r\nDrept de autor 1997,98 Marcel Baur \r\nCopyright 2000 Mike McCormack \r\nCopyright 2002 Sylvain Petreolle \r\nCopyright 2002 Andriy Palamarchuk\r\n",
-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,46,7,232,39
CONTROL " ",
-1,"Static",0x50000000,8,48,272,11
- DEFPUSHBUTTON "nchidere",IDOK,114,149,44,15,WS_GROUP
+ DEFPUSHBUTTON "Închidere",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
@@ -159,40 +161,40 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_LICENSE, "Tradus n limba romn de Petru Dimitriu.\r\nAcest program este software liber; putei redistribui sau modifica programul sub termenii licenei publice GNU aa cum este publicat de Free Software Foundation - fie versiunea 2 a licenei, sau (la alegerea dvs.) oricare versiune ulterioar.\r\n\r\nAcest program este distribuit n sperana c va fi de folos, dar FR NICIO GARANIE, nici mcar garania VANDABILITII sau a POTRIVIRII PENTRU UN SCOP ANUME. Vedei Licena GNU GPL pentru detalii.\r\n\r\nDvs. ar trebui s fi primit o copie a licenei mpreun cu acest program; dac nu, scriei la Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA."
+ STRING_LICENSE, "Tradus în limba română de Petru Dimitriu.\r\nAcest program este software liber; puteți redistribui sau modifica programul sub termenii licenței publice GNU așa cum este publicată de Free Software Foundation - fie versiunea 2 a licenței, sau (la alegerea dvs.) oricare versiune ulterioară.\r\n\r\nAcest program este distribuit în speranța că va fi de folos, dar FĂRĂ NICIO GARANȚIE, nici măcar garanția VANDABILITĂȚII sau a POTRIVIRII PENTRU UN SCOP ANUME. Vedeți Licența GNU GPL pentru detalii.\r\n\r\nDvs. ar trebui să fi primit o copie a licenței împreună cu acest program; dacă nu, scrieți la Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA."
END
STRINGTABLE DISCARDABLE
BEGIN
STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */
-STRING_PAGESETUP_FOOTERVALUE, "Pagin &s" /* FIXME */
+STRING_PAGESETUP_FOOTERVALUE, "Pagină &s" /* FIXME */
STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */
STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */
STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */
STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */
-STRING_NOTEPAD, "Carneel"
+STRING_NOTEPAD, "Carnețel"
STRING_ERROR, "EROARE"
-STRING_WARNING, "ATENIONARE"
-STRING_INFO, "Informaie"
+STRING_WARNING, "ATENŢIONARE"
+STRING_INFO, "Informație"
STRING_UNTITLED, "(neintitulat)"
-STRING_ALL_FILES, "Toate fiierele (*.*)"
-STRING_TEXT_FILES_TXT, "Fiiere text (*.txt)"
+STRING_ALL_FILES, "Toate fișierele (*.*)"
+STRING_TEXT_FILES_TXT, "Fișiere text (*.txt)"
-STRING_TOOLARGE, "Fiierul '%s' este prea mare.\n \
-ncercai un alt editor."
-STRING_NOTEXT, "Nu ai scris nimic. \
-\nV rugm scriei ceva i ncercai din nou."
-STRING_DOESNOTEXIST, "Fiierul '%s'\nnu exist.\n\n \
-Creai un nou fiier ?"
-STRING_NOTSAVED, "Fiierul '%s'\na fost modificat\n\n \
-Salvai schimbrile efectuate?"
-STRING_NOTFOUND, "'%s' nu poate fi gsit."
-STRING_OUT_OF_MEMORY, "Nu exist suficient memorie pentru a se ncheia aceast operaie. \
-\nnchidei una sau mai multe aplicaii pentru a mri memoria liber."
-STRING_CANNOTFIND "Nu se poate gsi '%s'"
+STRING_TOOLARGE, "Fișierul '%s' este prea mare.\n \
+Încercați un alt editor."
+STRING_NOTEXT, "Nu ați scris nimic. \
+\nVă rugăm scrieți ceva și încercați din nou."
+STRING_DOESNOTEXIST, "Fișierul '%s'\nnu există.\n\n \
+Creați un nou fișier ?"
+STRING_NOTSAVED, "Fișierul '%s'\na fost modificat\n\n \
+Salvați schimbările efectuate?"
+STRING_NOTFOUND, "'%s' nu poate fi găsit."
+STRING_OUT_OF_MEMORY, "Nu există suficientă memorie pentru a se încheia această operație. \
+\nÎnchideți una sau mai multe aplicații pentru a mări memoria liberă."
+STRING_CANNOTFIND "Nu se poate găsi '%s'"
STRING_ANSI, "ANSI"
STRING_UNICODE, "Unicode"
STRING_UNICODE_BE, "Unicode (big endian)"
@@ -200,5 +202,7 @@ STRING_UTF8, "UTF-8"
STRING_CRLF, "Windows"
STRING_LF, "Unix"
STRING_CR, "Mac"
-STRING_LINE_COLUMN, "Linie %d, coloan %d"
+STRING_LINE_COLUMN, "Linie %d, coloană %d"
END
+
+#pragma code_page(default)
diff --git a/reactos/base/applications/paint/definitions.h b/reactos/base/applications/paint/definitions.h
index ca47a0345ee..22a553ce853 100644
--- a/reactos/base/applications/paint/definitions.h
+++ b/reactos/base/applications/paint/definitions.h
@@ -60,6 +60,8 @@
#define IDM_VIEWZOOM400 239
#define IDM_VIEWZOOM800 240
#define IDM_VIEWFULLSCREEN 241
+#define IDM_VIEWSHOWGRID 242
+#define IDM_VIEWSHOWMINIATURE 243
#define IDM_IMAGEROTATEMIRROR 250
#define IDM_IMAGECHANGESIZE 251
@@ -140,6 +142,7 @@
#define IDS_INFOTEXT 903
#define IDS_SAVEPROMPTTEXT 904
#define IDS_DEFAULTFILENAME 905
+#define IDS_MINIATURETITLE 906
#define IDS_TOOLTIP1 910
#define IDS_TOOLTIP2 911
#define IDS_TOOLTIP3 912
diff --git a/reactos/base/applications/paint/drawing.c b/reactos/base/applications/paint/drawing.c
index b7a787cd291..2bae28bce53 100644
--- a/reactos/base/applications/paint/drawing.c
+++ b/reactos/base/applications/paint/drawing.c
@@ -20,13 +20,13 @@ void Line(HDC hdc, short x1, short y1, short x2, short y2, int color, int thickn
DeleteObject(SelectObject(hdc, oldPen));
}
-void Rect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, BOOL filled)
+void Rect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, int style)
{
HBRUSH oldBrush;
LOGBRUSH logbrush;
HPEN oldPen = SelectObject(hdc, CreatePen(PS_SOLID, thickness, fg));
- if (filled) logbrush.lbStyle = BS_SOLID; else logbrush.lbStyle = BS_HOLLOW;
- logbrush.lbColor = bg;
+ if (style==0) logbrush.lbStyle = BS_HOLLOW; else logbrush.lbStyle = BS_SOLID;
+ if (style==2) logbrush.lbColor = fg; else logbrush.lbColor = bg;
logbrush.lbHatch = 0;
oldBrush = SelectObject(hdc, CreateBrushIndirect(&logbrush));
Rectangle(hdc, x1, y1, x2, y2);
@@ -34,13 +34,13 @@ void Rect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int t
DeleteObject(SelectObject(hdc, oldPen));
}
-void Ellp(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, BOOL filled)
+void Ellp(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, int style)
{
HBRUSH oldBrush;
LOGBRUSH logbrush;
HPEN oldPen = SelectObject(hdc, CreatePen(PS_SOLID, thickness, fg));
- if (filled) logbrush.lbStyle = BS_SOLID; else logbrush.lbStyle = BS_HOLLOW;
- logbrush.lbColor = bg;
+ if (style==0) logbrush.lbStyle = BS_HOLLOW; else logbrush.lbStyle = BS_SOLID;
+ if (style==2) logbrush.lbColor = fg; else logbrush.lbColor = bg;
logbrush.lbHatch = 0;
oldBrush = SelectObject(hdc, CreateBrushIndirect(&logbrush));
Ellipse(hdc, x1, y1, x2, y2);
@@ -48,13 +48,13 @@ void Ellp(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int t
DeleteObject(SelectObject(hdc, oldPen));
}
-void RRect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, BOOL filled)
+void RRect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, int style)
{
LOGBRUSH logbrush;
HBRUSH oldBrush;
HPEN oldPen = SelectObject(hdc, CreatePen(PS_SOLID, thickness, fg));
- if (filled) logbrush.lbStyle = BS_SOLID; else logbrush.lbStyle = BS_HOLLOW;
- logbrush.lbColor = bg;
+ if (style==0) logbrush.lbStyle = BS_HOLLOW; else logbrush.lbStyle = BS_SOLID;
+ if (style==2) logbrush.lbColor = fg; else logbrush.lbColor = bg;
logbrush.lbHatch = 0;
oldBrush = SelectObject(hdc, CreateBrushIndirect(&logbrush));
RoundRect(hdc, x1, y1, x2, y2, 16, 16);
@@ -62,6 +62,35 @@ void RRect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int
DeleteObject(SelectObject(hdc, oldPen));
}
+void Poly(HDC hdc, POINT *lpPoints, int nCount, int fg, int bg, int thickness, int style, BOOL closed)
+{
+ LOGBRUSH logbrush;
+ HBRUSH oldBrush;
+ HPEN oldPen = SelectObject(hdc, CreatePen(PS_SOLID, thickness, fg));
+ if (style==0) logbrush.lbStyle = BS_HOLLOW; else logbrush.lbStyle = BS_SOLID;
+ if (style==2) logbrush.lbColor = fg; else logbrush.lbColor = bg;
+ logbrush.lbHatch = 0;
+ oldBrush = SelectObject(hdc, CreateBrushIndirect(&logbrush));
+ if (closed)
+ Polygon(hdc, lpPoints, nCount);
+ else
+ Polyline(hdc, lpPoints, nCount);
+ DeleteObject(SelectObject(hdc, oldBrush));
+ DeleteObject(SelectObject(hdc, oldPen));
+}
+
+void Bezier(HDC hdc, POINT p1, POINT p2, POINT p3, POINT p4, int color, int thickness)
+{
+ POINT fourPoints[4];
+ fourPoints[0] = p1;
+ fourPoints[1] = p2;
+ fourPoints[2] = p3;
+ fourPoints[3] = p4;
+ HPEN oldPen = SelectObject(hdc, CreatePen(PS_SOLID, thickness, color));
+ PolyBezier(hdc, fourPoints, 4);
+ DeleteObject(SelectObject(hdc, oldPen));
+}
+
void Fill(HDC hdc, int x, int y, int color)
{
HBRUSH oldBrush = SelectObject(hdc, CreateSolidBrush(color));
@@ -81,6 +110,15 @@ void Erase(HDC hdc, short x1, short y1, short x2, short y2, int color, int radiu
DeleteObject(SelectObject(hdc, oldPen));
}
+void Replace(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int radius)
+{
+ short a, x, y;
+ for (a=0; a<=100; a++)
+ for (y=(y1*(100-a)+y2*a)/100-radius+1; y<(y1*(100-a)+y2*a)/100+radius+1; y++)
+ for (x=(x1*(100-a)+x2*a)/100-radius+1; x<(x1*(100-a)+x2*a)/100+radius+1; x++)
+ if (GetPixel(hdc, x, y)==fg) SetPixel(hdc, x, y, bg);
+}
+
void Airbrush(HDC hdc, short x, short y, int color, int r)
{
short a;
diff --git a/reactos/base/applications/paint/drawing.h b/reactos/base/applications/paint/drawing.h
index 5b3390e6eba..71671d93384 100644
--- a/reactos/base/applications/paint/drawing.h
+++ b/reactos/base/applications/paint/drawing.h
@@ -8,16 +8,22 @@
void Line(HDC hdc, short x1, short y1, short x2, short y2, int color, int thickness);
-void Rect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, BOOL filled);
+void Rect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, int style);
-void Ellp(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, BOOL filled);
+void Ellp(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, int style);
-void RRect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, BOOL filled);
+void RRect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, int style);
+
+void Poly(HDC hdc, POINT *lpPoints, int nCount, int fg, int bg, int thickness, int style, BOOL closed);
+
+void Bezier(HDC hdc, POINT p1, POINT p2, POINT p3, POINT p4, int color, int thickness);
void Fill(HDC hdc, int x, int y, int color);
void Erase(HDC hdc, short x1, short y1, short x2, short y2, int color, int radius);
+void Replace(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int radius);
+
void Airbrush(HDC hdc, short x, short y, int color, int r);
void Brush(HDC hdc, short x1, short y1, short x2, short y2, int color, int style);
diff --git a/reactos/base/applications/paint/globalvar.h b/reactos/base/applications/paint/globalvar.h
index d039db4280c..b864586a169 100644
--- a/reactos/base/applications/paint/globalvar.h
+++ b/reactos/base/applications/paint/globalvar.h
@@ -71,3 +71,22 @@ extern HINSTANCE hProgInstance;
extern TCHAR filename[256];
extern TCHAR filepathname[1000];
extern BOOL isAFile;
+
+extern BOOL showGrid;
+extern BOOL showMiniature;
+
+extern HWND hwndMiniature;
+
+extern HWND hSizeboxLeftTop;
+extern HWND hSizeboxCenterTop;
+extern HWND hSizeboxRightTop;
+extern HWND hSizeboxLeftCenter;
+extern HWND hSizeboxRightCenter;
+extern HWND hSizeboxLeftBottom;
+extern HWND hSizeboxCenterBottom;
+extern HWND hSizeboxRightBottom;
+
+/* VARIABLES declared in mouse.c *************************************/
+
+extern POINT pointStack[256];
+extern short pointSP;
diff --git a/reactos/base/applications/paint/gpl.txt b/reactos/base/applications/paint/gpl.txt
new file mode 100644
index 00000000000..94a9ed024d3
--- /dev/null
+++ b/reactos/base/applications/paint/gpl.txt
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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 3 of the License, or
+ (at your option) any later version.
+
+ This 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/reactos/base/applications/paint/history.c b/reactos/base/applications/paint/history.c
index b0eb56002c2..a0f434a4767 100644
--- a/reactos/base/applications/paint/history.c
+++ b/reactos/base/applications/paint/history.c
@@ -91,27 +91,30 @@ void insertReversible(HBITMAP hbm)
setImgXYRes(GetDIBWidth(hBms[currInd]), GetDIBHeight(hBms[currInd]));
}
-void cropReversible(int x, int y)//FIXME: This function is broken
+void cropReversible(int width, int height, int xOffset, int yOffset)
{
- HBITMAP oldBitmap;
+ HDC hdc;
HPEN oldPen;
HBRUSH oldBrush;
SelectObject(hDrawingDC, hBms[currInd]);
DeleteObject(hBms[(currInd+1)%4]);
- hBms[(currInd+1)%4] = CreateDIBWithProperties(x, y);
+ hBms[(currInd+1)%4] = CreateDIBWithProperties(width, height);
currInd = (currInd+1)%4;
if (undoSteps<3) undoSteps++;
redoSteps = 0;
- oldBitmap = SelectObject(hSelDC, hBms[currInd]);
- oldPen = SelectObject(hSelDC, CreatePen(PS_SOLID, 1, bgColor));
- oldBrush = SelectObject(hSelDC, CreateSolidBrush(bgColor));
- Rectangle(hSelDC, 0, 0, x, y);
- DeleteObject(SelectObject(hSelDC, oldBrush));
- DeleteObject(SelectObject(hSelDC, oldPen));
- BitBlt(hDrawingDC, 0, 0, imgXRes, imgYRes, hSelDC, 0, 0, SRCCOPY);
- SelectObject(hDrawingDC, SelectObject(hSelDC, oldBitmap));
+ hdc = CreateCompatibleDC(hDrawingDC);
+ SelectObject(hdc, hBms[currInd]);
- setImgXYRes(x, y);
+ oldPen = SelectObject(hdc, CreatePen(PS_SOLID, 1, bgColor));
+ oldBrush = SelectObject(hdc, CreateSolidBrush(bgColor));
+ Rectangle(hdc, 0, 0, width, height);
+ BitBlt(hdc, -xOffset, -yOffset, imgXRes, imgYRes, hDrawingDC, 0, 0, SRCCOPY);
+ DeleteObject(SelectObject(hdc, oldBrush));
+ DeleteObject(SelectObject(hdc, oldPen));
+ DeleteDC(hdc);
+ SelectObject(hDrawingDC, hBms[currInd]);
+
+ setImgXYRes(width, height);
}
diff --git a/reactos/base/applications/paint/history.h b/reactos/base/applications/paint/history.h
index 39be55ee8e0..b0733e99e8e 100644
--- a/reactos/base/applications/paint/history.h
+++ b/reactos/base/applications/paint/history.h
@@ -18,4 +18,4 @@ void clearHistory();
void insertReversible();
-void cropReversible(int x, int y);
+void cropReversible(int width, int height, int xOffset, int yOffset);
diff --git a/reactos/base/applications/paint/lang/cs-CZ.rc b/reactos/base/applications/paint/lang/cs-CZ.rc
index e2db3f5702f..370eba4b6b8 100644
--- a/reactos/base/applications/paint/lang/cs-CZ.rc
+++ b/reactos/base/applications/paint/lang/cs-CZ.rc
@@ -46,13 +46,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Lupa"
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
+ POPUP "User defined"
+ 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 "Show grid", IDM_VIEWSHOWGRID
+ MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Cel obrazovka\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -172,6 +178,7 @@ BEGIN
IDS_INFOTEXT, "ReactOS Malovn je dostupn pod licenc GNU Lesser General Public License (LGPL) verze 3 (viz. www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Chcete uloit proveden zmny v %s?"
IDS_DEFAULTFILENAME, "Bez nzvu.bmp"
+ IDS_MINIATURETITLE, "Miniature"
IDS_TOOLTIP1, "Voln vbr"
IDS_TOOLTIP2, "Vbr"
IDS_TOOLTIP3, "Guma"
diff --git a/reactos/base/applications/paint/lang/de-DE.rc b/reactos/base/applications/paint/lang/de-DE.rc
index 4a54906e35b..0cfd3523186 100644
--- a/reactos/base/applications/paint/lang/de-DE.rc
+++ b/reactos/base/applications/paint/lang/de-DE.rc
@@ -46,13 +46,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Zoom"
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
+ POPUP "Benutzerdefiniert"
+ 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 "Raster anzeigen", IDM_VIEWSHOWGRID
+ MENUITEM "Miniaturansicht anzeigen", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Gesamtbild\tStrg+G", IDM_VIEWFULLSCREEN
END
@@ -172,6 +178,7 @@ BEGIN
IDS_INFOTEXT, "Paint fr ReactOS steht unter der GNU Lesser General Public License (LGPL) Version 3. (siehe www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Mchten Sie die nderungen an %s speichern?"
IDS_DEFAULTFILENAME, "Unbenannt.bmp"
+ IDS_MINIATURETITLE, "Miniaturansicht"
IDS_TOOLTIP1, "Freie Auswahl"
IDS_TOOLTIP2, "Auswahl"
IDS_TOOLTIP3, "Radierer"
diff --git a/reactos/base/applications/paint/lang/en-GB.rc b/reactos/base/applications/paint/lang/en-GB.rc
index 2c1bce95a50..f9acae4689d 100644
--- a/reactos/base/applications/paint/lang/en-GB.rc
+++ b/reactos/base/applications/paint/lang/en-GB.rc
@@ -46,13 +46,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Zoom"
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
+ POPUP "User defined"
+ 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 "Show grid\tCtrl+G", IDM_VIEWSHOWGRID
+ MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Full screen\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -95,6 +101,7 @@ BEGIN
"^A", IDM_EDITSELECTALL
"^T", IDM_VIEWTOOLBOX
"^L", IDM_VIEWCOLORPALETTE
+ "^G", IDM_VIEWSHOWGRID
"^F", IDM_VIEWFULLSCREEN
"^R", IDM_IMAGEROTATEMIRROR
"^W", IDM_IMAGECHANGESIZE
@@ -172,6 +179,7 @@ BEGIN
IDS_INFOTEXT, "Paint for ReactOS is available under the GNU Lesser General Public License (LGPL) version 3 (see www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Do you want to save the changes to %s?"
IDS_DEFAULTFILENAME, "Unnamed.bmp"
+ IDS_MINIATURETITLE, "Miniature"
IDS_TOOLTIP1, "Free selection"
IDS_TOOLTIP2, "Selection"
IDS_TOOLTIP3, "Rubber"
diff --git a/reactos/base/applications/paint/lang/en-US.rc b/reactos/base/applications/paint/lang/en-US.rc
index ca60817f976..c042c27fdf0 100644
--- a/reactos/base/applications/paint/lang/en-US.rc
+++ b/reactos/base/applications/paint/lang/en-US.rc
@@ -46,13 +46,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Zoom"
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
+ POPUP "User defined"
+ 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 "Show grid\tCtrl+G", IDM_VIEWSHOWGRID
+ MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Full screen\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -95,6 +101,7 @@ BEGIN
"^A", IDM_EDITSELECTALL
"^T", IDM_VIEWTOOLBOX
"^L", IDM_VIEWCOLORPALETTE
+ "^G", IDM_VIEWSHOWGRID
"^F", IDM_VIEWFULLSCREEN
"^R", IDM_IMAGEROTATEMIRROR
"^W", IDM_IMAGECHANGESIZE
@@ -172,6 +179,7 @@ BEGIN
IDS_INFOTEXT, "Paint for ReactOS is available under the GNU Lesser General Public License (LGPL) version 3 (see www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Do you want to save the changes to %s?"
IDS_DEFAULTFILENAME, "Unnamed.bmp"
+ IDS_MINIATURETITLE, "Miniature"
IDS_TOOLTIP1, "Free selection"
IDS_TOOLTIP2, "Selection"
IDS_TOOLTIP3, "Rubber"
diff --git a/reactos/base/applications/paint/lang/es-ES.rc b/reactos/base/applications/paint/lang/es-ES.rc
index c9d2c3511e1..8263e448ee6 100644
--- a/reactos/base/applications/paint/lang/es-ES.rc
+++ b/reactos/base/applications/paint/lang/es-ES.rc
@@ -46,13 +46,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Zoom"
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
+ POPUP "User defined"
+ 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 "Show grid", IDM_VIEWSHOWGRID
+ MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Ver en pantalla completa\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -172,6 +178,7 @@ BEGIN
IDS_INFOTEXT, "Paint for ReactOS is available under the GNU Lesser General Public License (LGPL) version 3 (see www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Do you want to save the changes to %s?"
IDS_DEFAULTFILENAME, "Unnamed.bmp"
+ IDS_MINIATURETITLE, "Miniature"
IDS_TOOLTIP1, "Free selection"
IDS_TOOLTIP2, "Selection"
IDS_TOOLTIP3, "Rubber"
diff --git a/reactos/base/applications/paint/lang/fr-FR.rc b/reactos/base/applications/paint/lang/fr-FR.rc
index 596a1ad540b..ed31d2cb9d5 100644
--- a/reactos/base/applications/paint/lang/fr-FR.rc
+++ b/reactos/base/applications/paint/lang/fr-FR.rc
@@ -46,13 +46,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Zoom"
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
+ POPUP "User defined"
+ 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 "Show grid", IDM_VIEWSHOWGRID
+ MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Plein cran\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -172,6 +178,7 @@ BEGIN
IDS_INFOTEXT, "Paint pour ReactOS est mise disposition sous la Licence publique gnrale limite GNU (LGPL) version 3 (voir www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Voulez-vous enregistrer les modifications de %s?"
IDS_DEFAULTFILENAME, "Sans titre.bmp"
+ IDS_MINIATURETITLE, "Miniature"
IDS_TOOLTIP1, "Slection libre"
IDS_TOOLTIP2, "Slection"
IDS_TOOLTIP3, "Gomme"
diff --git a/reactos/base/applications/paint/lang/it-IT.rc b/reactos/base/applications/paint/lang/it-IT.rc
index 2e5019431c5..3d63c4af5fd 100644
--- a/reactos/base/applications/paint/lang/it-IT.rc
+++ b/reactos/base/applications/paint/lang/it-IT.rc
@@ -46,13 +46,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Zoom"
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
+ POPUP "User defined"
+ 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 "Show grid", IDM_VIEWSHOWGRID
+ MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Visualizza a schermo intero\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -172,6 +178,7 @@ BEGIN
IDS_INFOTEXT, "Paint per ReactOS is available under the GNU Lesser General Public License (LGPL) version 3 (see www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Volete salvare le modifiche a %s?"
IDS_DEFAULTFILENAME, "SenzaNome.bmp"
+ IDS_MINIATURETITLE, "Miniature"
IDS_TOOLTIP1, "Selezione libera"
IDS_TOOLTIP2, "Selezione"
IDS_TOOLTIP3, "Gomma"
diff --git a/reactos/base/applications/paint/lang/nl-NL.rc b/reactos/base/applications/paint/lang/nl-NL.rc
index 190b49051cf..ad11347bfbb 100644
--- a/reactos/base/applications/paint/lang/nl-NL.rc
+++ b/reactos/base/applications/paint/lang/nl-NL.rc
@@ -46,13 +46,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "In-/uitzoomen"
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
+ POPUP "User defined"
+ 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 "Show grid", IDM_VIEWSHOWGRID
+ MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Volledig scherm\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -172,6 +178,7 @@ BEGIN
IDS_INFOTEXT, "Paint for ReactOS is available under the GNU Lesser General Public License (LGPL) version 3 (see www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Wilt u de wijzigingen die zijn aangebracht in %s opslaan?"
IDS_DEFAULTFILENAME, "Naamloos.bmp"
+ IDS_MINIATURETITLE, "Miniature"
IDS_TOOLTIP1, "Vrij selecteren"
IDS_TOOLTIP2, "Selecteren"
IDS_TOOLTIP3, "Gum"
diff --git a/reactos/base/applications/paint/lang/no-NO.rc b/reactos/base/applications/paint/lang/no-NO.rc
index 602f49e313d..7847f9a01ef 100644
--- a/reactos/base/applications/paint/lang/no-NO.rc
+++ b/reactos/base/applications/paint/lang/no-NO.rc
@@ -46,13 +46,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Forstrre"
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
+ POPUP "Egendefinert"
+ 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 "Vis rutenett", IDM_VIEWSHOWGRID
+ MENUITEM "Vis miniatyr", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Full skjerm\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -172,6 +178,7 @@ BEGIN
IDS_INFOTEXT, "Paint for ReactOS er n tilgjengelig under GNU Lesser General Public License (LGPL) versjon 3 (se http://www.gnu.org/home.nb.html)"
IDS_SAVEPROMPTTEXT, "Vil du lagre endringene til %s?"
IDS_DEFAULTFILENAME, "Utennavn.bmp"
+ IDS_MINIATURETITLE, "Miniature"
IDS_TOOLTIP1, "Frihndmerking"
IDS_TOOLTIP2, "Merk"
IDS_TOOLTIP3, "Viskelr"
diff --git a/reactos/base/applications/paint/lang/pl-PL.rc b/reactos/base/applications/paint/lang/pl-PL.rc
index 7c5317c2ed1..01e7dd093c3 100644
--- a/reactos/base/applications/paint/lang/pl-PL.rc
+++ b/reactos/base/applications/paint/lang/pl-PL.rc
@@ -46,13 +46,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Powikszenie"
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
+ POPUP "User defined"
+ 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 "Show grid", IDM_VIEWSHOWGRID
+ MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Peny ekran\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -172,6 +178,7 @@ BEGIN
IDS_INFOTEXT, "Paint dla ReactOS jest dostpny na licencji GNU Lesser General Public License (LGPL) wersja 3 (www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Czy chcesz zapisa zmiany do %s?"
IDS_DEFAULTFILENAME, "Nienazwany.bmp"
+ IDS_MINIATURETITLE, "Miniature"
IDS_TOOLTIP1, "Zaznaczenie dowolne"
IDS_TOOLTIP2, "Zaznaczenie"
IDS_TOOLTIP3, "Gumka"
diff --git a/reactos/base/applications/paint/lang/pt-BR.rc b/reactos/base/applications/paint/lang/pt-BR.rc
index b33b213e0a4..63b882c777f 100644
--- a/reactos/base/applications/paint/lang/pt-BR.rc
+++ b/reactos/base/applications/paint/lang/pt-BR.rc
@@ -46,13 +46,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "&Zoom"
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
+ POPUP "User defined"
+ 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 "Show grid", IDM_VIEWSHOWGRID
+ MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
END
MENUITEM "E&xibir bitmap\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -172,6 +178,7 @@ BEGIN
IDS_INFOTEXT, "Paint para ReactOS est disponvel sob a licena GNU Lesser General Public License (LGPL) verso 3 (visite www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Salvar as alteraes em %s?"
IDS_DEFAULTFILENAME, "Imagem.bmp"
+ IDS_MINIATURETITLE, "Miniature"
IDS_TOOLTIP1, "Selecionar forma livre"
IDS_TOOLTIP2, "Selecionar"
IDS_TOOLTIP3, "Apagador/Apagador de cor"
diff --git a/reactos/base/applications/paint/lang/pt-PT.rc b/reactos/base/applications/paint/lang/pt-PT.rc
index 3ebd277c5dd..e7caa6f8720 100644
--- a/reactos/base/applications/paint/lang/pt-PT.rc
+++ b/reactos/base/applications/paint/lang/pt-PT.rc
@@ -46,13 +46,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "&Zoom"
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
+ POPUP "User defined"
+ 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 "Show grid", IDM_VIEWSHOWGRID
+ MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
END
MENUITEM "&Ver mapa de bits\tCtrl+B", IDM_VIEWFULLSCREEN
END
@@ -172,6 +178,7 @@ BEGIN
IDS_INFOTEXT, "Paint para ReactOS est disponvel sob a licena GNU Lesser General Public License (LGPL) verso 3 (visite www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Pretende guardar as alteraes a %s?"
IDS_DEFAULTFILENAME, "Imagem.bmp"
+ IDS_MINIATURETITLE, "Miniature"
IDS_TOOLTIP1, "Selecionar forma livre"
IDS_TOOLTIP2, "Selecionar"
IDS_TOOLTIP3, "Borracha/Apagar cor"
diff --git a/reactos/base/applications/paint/lang/ro-RO.rc b/reactos/base/applications/paint/lang/ro-RO.rc
index 36b9f43aaad..3f1479c2c21 100644
--- a/reactos/base/applications/paint/lang/ro-RO.rc
+++ b/reactos/base/applications/paint/lang/ro-RO.rc
@@ -5,20 +5,22 @@
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
ID_MENU MENU
BEGIN
- POPUP "&Fiier"
+ POPUP "&Fișier"
BEGIN
MENUITEM "Nou\tCtrl+N", IDM_FILENEW
MENUITEM "Deschidere...\tCtrl+O", IDM_FILEOPEN
MENUITEM "Salvare\tCtrl+S", IDM_FILESAVE
MENUITEM "Salvare ca...", IDM_FILESAVEAS
MENUITEM SEPARATOR
- MENUITEM "Setare ca fundal (n carou)", IDM_FILEASWALLPAPERPLANE
+ MENUITEM "Setare ca fundal (în carou)", IDM_FILEASWALLPAPERPLANE
MENUITEM "Setare ca fundal (centrat)", IDM_FILEASWALLPAPERCENTERED
- MENUITEM "Setare ca fundal (ntins)", IDM_FILEASWALLPAPERSTRETCHED
+ MENUITEM "Setare ca fundal (întins)", IDM_FILEASWALLPAPERSTRETCHED
MENUITEM SEPARATOR
- MENUITEM "Ieire\tAlt+F4", IDM_FILEEXIT
+ MENUITEM "Ieșire\tAlt+F4", IDM_FILEEXIT
END
POPUP "&Editare"
@@ -29,30 +31,36 @@ BEGIN
MENUITEM "Decupare\tCtrl+X", IDM_EDITCUT
MENUITEM "Copiere\tCtrl+C", IDM_EDITCOPY
MENUITEM "Lipire\tCtrl+V", IDM_EDITPASTE
- MENUITEM "tergere selecie\tDel", IDM_EDITDELETESELECTION
- MENUITEM "Inversare selecie", IDM_EDITINVERTSELECTION
- MENUITEM "Selectare total\tCtrl+A", IDM_EDITSELECTALL
+ MENUITEM "Ștergere selecție\tDel", IDM_EDITDELETESELECTION
+ MENUITEM "Inversare selecție", IDM_EDITINVERTSELECTION
+ MENUITEM "Selectare totală\tCtrl+A", IDM_EDITSELECTALL
MENUITEM SEPARATOR
- MENUITEM "Copiere n...", IDM_EDITCOPYTO
+ MENUITEM "Copiere în...", IDM_EDITCOPYTO
MENUITEM "Lipire din...", IDM_EDITPASTEFROM
END
POPUP "&Vizualizare"
BEGIN
MENUITEM "Instrumente\tCtrl+T", IDM_VIEWTOOLBOX, CHECKED
- MENUITEM "Palet de culori\tCtrl+L", IDM_VIEWCOLORPALETTE, CHECKED
- MENUITEM "Bar de stare", IDM_VIEWSTATUSBAR, CHECKED
- MENUITEM "Bar de instrumente text", IDM_FORMATICONBAR, CHECKED, GRAYED
+ MENUITEM "Paletă de culori\tCtrl+L", IDM_VIEWCOLORPALETTE, CHECKED
+ MENUITEM "Bară de stare", IDM_VIEWSTATUSBAR, CHECKED
+ MENUITEM "Bară de instrumente text", IDM_FORMATICONBAR, CHECKED, GRAYED
MENUITEM SEPARATOR
POPUP "Panoramare"
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
+ POPUP "Definită de utilizator"
+ 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 "Afișare grilă", IDM_VIEWSHOWGRID
+ MENUITEM "Afișare miniatură", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Pe tot ecranul\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -61,16 +69,16 @@ BEGIN
BEGIN
MENUITEM "Rotire/Oglindire...\tCtrl+R", IDM_IMAGEROTATEMIRROR
MENUITEM "Redimensionare...\tCtrl+W", IDM_IMAGECHANGESIZE
- MENUITEM "Tiere", IDM_IMAGECROP
+ MENUITEM "Tăiere", IDM_IMAGECROP
MENUITEM "Inversare culori\tCtrl+I", IDM_IMAGEINVERTCOLORS
MENUITEM "Atribute...\tCtrl+E", IDM_IMAGEATTRIBUTES
- MENUITEM "tergere imagine", IDM_IMAGEDELETEIMAGE
- MENUITEM "Desenare opac", IDM_IMAGEDRAWOPAQUE
+ MENUITEM "Ștergere imagine", IDM_IMAGEDELETEIMAGE
+ MENUITEM "Desenare opacă", IDM_IMAGEDRAWOPAQUE
END
POPUP "&Culori"
BEGIN
- MENUITEM "Editare palet...", IDM_COLORSEDITPALETTE
+ MENUITEM "Editare paletă...", IDM_COLORSEDITPALETTE
END
POPUP "&Ajutor"
@@ -95,6 +103,7 @@ BEGIN
"^A", IDM_EDITSELECTALL
"^T", IDM_VIEWTOOLBOX
"^L", IDM_VIEWCOLORPALETTE
+ "^G", IDM_VIEWSHOWGRID
"^F", IDM_VIEWFULLSCREEN
"^R", IDM_IMAGEROTATEMIRROR
"^W", IDM_IMAGECHANGESIZE
@@ -106,15 +115,15 @@ 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 "Rotire i oglindire imagine"
+CAPTION "Rotire și oglindire imagine"
BEGIN
GROUPBOX "Rotire sau oglindire", IDD_MIRRORROTATEGROUP, 6, 6, 112, 86
- AUTORADIOBUTTON "Oglindire orizontal", IDD_MIRRORROTATERB1, 12, 18, 100, 10, WS_GROUP
- AUTORADIOBUTTON "Oglindire vertical", IDD_MIRRORROTATERB2, 12, 30, 100, 10
+ AUTORADIOBUTTON "Oglindire orizontală", IDD_MIRRORROTATERB1, 12, 18, 100, 10, WS_GROUP
+ AUTORADIOBUTTON "Oglindire verticală", IDD_MIRRORROTATERB2, 12, 30, 100, 10
AUTORADIOBUTTON "Rotire la un unghi de:", 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
+ 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 "OK", IDOK, 125, 8, 48, 14
PUSHBUTTON "Anulare", IDCANCEL, 125, 24, 48, 14
END
@@ -126,20 +135,20 @@ CAPTION "Atribute"
BEGIN
EDITTEXT IDD_ATTRIBUTESEDIT1, 40, 40, 35, 12
EDITTEXT IDD_ATTRIBUTESEDIT2, 110, 40, 35, 12
- LTEXT "Lime:", IDD_ATTRIBUTESTEXT1, 10, 40, 30, 10
- LTEXT "nlime:", IDD_ATTRIBUTESTEXT2, 80, 40, 30, 10
- LTEXT "Dat:", IDD_ATTRIBUTESTEXT3, 10, 5, 60, 10
- LTEXT "Mrime:", IDD_ATTRIBUTESTEXT4, 10, 15, 60, 10
- LTEXT "Rezoluie:", IDD_ATTRIBUTESTEXT5, 10, 25, 60, 10
+ LTEXT "Lățime:", IDD_ATTRIBUTESTEXT1, 10, 40, 30, 10
+ LTEXT "Înălțime:", IDD_ATTRIBUTESTEXT2, 80, 40, 30, 10
+ LTEXT "Dată:", IDD_ATTRIBUTESTEXT3, 10, 5, 60, 10
+ LTEXT "Mărime:", IDD_ATTRIBUTESTEXT4, 10, 15, 60, 10
+ LTEXT "Rezoluție:", IDD_ATTRIBUTESTEXT5, 10, 25, 60, 10
LTEXT "Indisponibil", IDD_ATTRIBUTESTEXT6, 70, 5, 60, 10
LTEXT "Indisponibil", IDD_ATTRIBUTESTEXT7, 70, 15, 60, 10
LTEXT "Indisponibil", IDD_ATTRIBUTESTEXT8, 70, 25, 60, 10
GROUPBOX "Unitate", IDD_ATTRIBUTESGROUP1, 6, 57, 139, 27
- AUTORADIOBUTTON "oli", IDD_ATTRIBUTESRB1, 12, 69, 35, 10, WS_GROUP
+ AUTORADIOBUTTON "țoli", IDD_ATTRIBUTESRB1, 12, 69, 35, 10, WS_GROUP
AUTORADIOBUTTON "cm", IDD_ATTRIBUTESRB2, 52, 69, 35, 10
AUTORADIOBUTTON "Pixeli", IDD_ATTRIBUTESRB3, 92, 69, 35, 10
GROUPBOX "Culori", IDD_ATTRIBUTESGROUP2, 6, 88, 139, 27
- AUTORADIOBUTTON "Alb i negru", IDD_ATTRIBUTESRB4, 12, 100, 70, 10, WS_GROUP
+ AUTORADIOBUTTON "Alb și negru", IDD_ATTRIBUTESRB4, 12, 100, 70, 10, WS_GROUP
AUTORADIOBUTTON "Color", IDD_ATTRIBUTESRB5, 92, 100, 35, 10
DEFPUSHBUTTON "OK", IDOK, 155, 8, 48, 14
PUSHBUTTON "Anulare", IDCANCEL, 155, 24, 48, 14
@@ -169,25 +178,28 @@ BEGIN
IDS_PROGRAMNAME, "Paint"
IDS_WINDOWTITLE, "%s - Paint"
IDS_INFOTITLE, "Paint pentru ReactOS"
- IDS_INFOTEXT, "Paint pentru ReactOS este disponibil sub licena GNU Lesser General Public versiunea 3 (vedei www.gnu.org)"
- IDS_SAVEPROMPTTEXT, "Vrei s salvai schimbrile la %s?"
- IDS_DEFAULTFILENAME, "FrNume.bmp"
- IDS_TOOLTIP1, "Golire selecie"
- IDS_TOOLTIP2, "Selecie"
- IDS_TOOLTIP3, "Radier"
+ IDS_INFOTEXT, "Paint pentru ReactOS este disponibil sub licența GNU Lesser General Public versiunea 3 (vedeți www.gnu.org)"
+ IDS_SAVEPROMPTTEXT, "Vreți să salvați schimbările la %s?"
+ IDS_DEFAULTFILENAME, "FărăNume.bmp"
+ IDS_MINIATURETITLE, "Miniature"
+ IDS_TOOLTIP1, "Golire selecție"
+ IDS_TOOLTIP2, "Selecție"
+ IDS_TOOLTIP3, "Radieră"
IDS_TOOLTIP4, "Umplere cu culoare"
IDS_TOOLTIP5, "Selectare culoare"
IDS_TOOLTIP6, "Panoramare"
IDS_TOOLTIP7, "Creion"
- IDS_TOOLTIP8, "Pensul"
+ IDS_TOOLTIP8, "Pensulă"
IDS_TOOLTIP9, "Pulverizator"
IDS_TOOLTIP10, "Text"
IDS_TOOLTIP11, "Linie"
- IDS_TOOLTIP12, "Curb bezier"
+ IDS_TOOLTIP12, "Curbă bezier"
IDS_TOOLTIP13, "Dreptunghi"
IDS_TOOLTIP14, "Poligon"
IDS_TOOLTIP15, "Oval"
IDS_TOOLTIP16, "Dreptunghi rotunjit"
- IDS_OPENFILTER, "Fiiere bitmap (*.bmp;*.dib)\1*.bmp;*.dib\1All files (*.*)\1*.*\1"
- IDS_SAVEFILTER, "Bitmap pe 24 bii (*.bmp;*.dib)\1*.bmp;*.dib\1"
+ IDS_OPENFILTER, "Fișiere bitmap (*.bmp;*.dib)\1*.bmp;*.dib\1All files (*.*)\1*.*\1"
+ IDS_SAVEFILTER, "Bitmap pe 24 biți (*.bmp;*.dib)\1*.bmp;*.dib\1"
END
+
+#pragma code_page(default)
diff --git a/reactos/base/applications/paint/lang/ru-RU.rc b/reactos/base/applications/paint/lang/ru-RU.rc
index bdc87fc9de2..b35e490b1ae 100644
--- a/reactos/base/applications/paint/lang/ru-RU.rc
+++ b/reactos/base/applications/paint/lang/ru-RU.rc
@@ -41,13 +41,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "&"
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
+ POPUP ""
+ 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 " ", IDM_VIEWSHOWGRID
+ MENUITEM " ", IDM_VIEWSHOWMINIATURE
END
MENUITEM " \tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -167,6 +173,7 @@ BEGIN
IDS_INFOTEXT, "Paint ReactOS GNU Lesser General Public License (LGPL) 3 (see www.gnu.org)"
IDS_SAVEPROMPTTEXT, " %s?"
IDS_DEFAULTFILENAME, "_.bmp"
+ IDS_MINIATURETITLE, ""
IDS_TOOLTIP1, " "
IDS_TOOLTIP2, ""
IDS_TOOLTIP3, ""
diff --git a/reactos/base/applications/paint/lang/sk-SK.rc b/reactos/base/applications/paint/lang/sk-SK.rc
index db77f8625e2..83806d95526 100644
--- a/reactos/base/applications/paint/lang/sk-SK.rc
+++ b/reactos/base/applications/paint/lang/sk-SK.rc
@@ -1,7 +1,7 @@
/*
* Slovak Language resource file
- * Translated by: Mrio Kamr /Mario Kacmar/ aka Kario
- * Last changed: 27-05-2009
+ * Translated by: Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
+ * Last changed: 02-07-2009
*/
LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
@@ -47,13 +47,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Lupa" //Zoom
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
+ POPUP "Vlastn zvenie" //Pouvateom definovan
+ 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 "Zobrazi mrieku\tCtrl+G", IDM_VIEWSHOWGRID
+ MENUITEM "Zobrazi miniatru", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Cel obrazovka\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -96,6 +102,7 @@ BEGIN
"^A", IDM_EDITSELECTALL
"^T", IDM_VIEWTOOLBOX
"^L", IDM_VIEWCOLORPALETTE
+ "^G", IDM_VIEWSHOWGRID
"^F", IDM_VIEWFULLSCREEN
"^R", IDM_IMAGEROTATEMIRROR
"^W", IDM_IMAGECHANGESIZE
@@ -173,6 +180,7 @@ BEGIN
IDS_INFOTEXT, "Skicr systmu ReactOS je dostupn za podmienok GNU Lesser General Public License (LGPL) verzia 3 (vi www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Chcete uloi vykonan zmeny do %s?"
IDS_DEFAULTFILENAME, "Bez nzvu.bmp"
+ IDS_MINIATURETITLE, "Miniature"
IDS_TOOLTIP1, "Von vber"
IDS_TOOLTIP2, "Vber"
IDS_TOOLTIP3, "Guma"
diff --git a/reactos/base/applications/paint/lang/uk-UA.rc b/reactos/base/applications/paint/lang/uk-UA.rc
index 6b2991e2720..959c87cf72e 100644
--- a/reactos/base/applications/paint/lang/uk-UA.rc
+++ b/reactos/base/applications/paint/lang/uk-UA.rc
@@ -47,13 +47,19 @@ BEGIN
MENUITEM SEPARATOR
POPUP ""
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
+ POPUP "User defined"
+ 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 "Show grid", IDM_VIEWSHOWGRID
+ MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
END
MENUITEM " \tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -173,6 +179,7 @@ BEGIN
IDS_INFOTEXT, "Paint for ReactOS is available under the GNU Lesser General Public License (LGPL) version 3 (see www.gnu.org)"
IDS_SAVEPROMPTTEXT, " %s?"
IDS_DEFAULTFILENAME, "_.bmp"
+ IDS_MINIATURETITLE, "Miniature"
IDS_TOOLTIP1, " "
IDS_TOOLTIP2, ""
IDS_TOOLTIP3, ""
diff --git a/reactos/base/applications/paint/lgpl.txt b/reactos/base/applications/paint/lgpl.txt
index fc8a5de7edf..65c5ca88a67 100644
--- a/reactos/base/applications/paint/lgpl.txt
+++ b/reactos/base/applications/paint/lgpl.txt
@@ -1,4 +1,4 @@
- GNU LESSER GENERAL PUBLIC LICENSE
+ GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc.
@@ -10,7 +10,7 @@
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
- 0. Additional Definitions.
+ 0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
@@ -111,7 +111,7 @@ the following:
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
- Version.
+ Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
diff --git a/reactos/base/applications/paint/main.c b/reactos/base/applications/paint/main.c
index 20bf58b6b18..d9fa7b39457 100644
--- a/reactos/base/applications/paint/main.c
+++ b/reactos/base/applications/paint/main.c
@@ -26,6 +26,7 @@
#include "palette.h"
#include "toolsettings.h"
#include "selection.h"
+#include "sizebox.h"
/* FUNCTIONS ********************************************************/
@@ -102,6 +103,20 @@ TCHAR filename[256];
TCHAR filepathname[1000];
BOOL isAFile = FALSE;
+BOOL showGrid = FALSE;
+BOOL showMiniature = FALSE;
+
+HWND hwndMiniature;
+
+HWND hSizeboxLeftTop;
+HWND hSizeboxCenterTop;
+HWND hSizeboxRightTop;
+HWND hSizeboxLeftCenter;
+HWND hSizeboxRightCenter;
+HWND hSizeboxLeftBottom;
+HWND hSizeboxCenterBottom;
+HWND hSizeboxRightBottom;
+
int WINAPI _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument, int nFunsterStil)
{
HWND hwnd; /* This is the handle for our window */
@@ -127,6 +142,7 @@ int WINAPI _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR l
TCHAR ofnFilename[1000];
TCHAR ofnFiletitle[256];
TCHAR ofnFilter[1000];
+ TCHAR miniaturetitle[100];
int custColors[16] =
{0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff};
@@ -211,15 +227,31 @@ int WINAPI _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR l
wclSelection.hbrBackground = NULL;//GetSysColorBrush(COLOR_BTNFACE);
RegisterClassEx (&wclSelection);
+ /* initializing and registering the window class for the size boxes */
+ wclSettings.hInstance = hThisInstance;
+ wclSettings.lpszClassName = _T("Sizebox");
+ wclSettings.lpfnWndProc = SizeboxWinProc;
+ wclSettings.style = CS_DBLCLKS;
+ wclSettings.cbSize = sizeof (WNDCLASSEX);
+ wclSettings.hIcon = NULL;
+ wclSettings.hIconSm = NULL;
+ wclSettings.hCursor = LoadCursor (NULL, IDC_ARROW);
+ wclSettings.lpszMenuName = NULL;
+ wclSettings.cbClsExtra = 0;
+ wclSettings.cbWndExtra = 0;
+ wclSettings.hbrBackground = GetSysColorBrush(COLOR_HIGHLIGHT);
+ RegisterClassEx (&wclSettings);
+
LoadString(hThisInstance, IDS_DEFAULTFILENAME, filename, SIZEOF(filename));
LoadString(hThisInstance, IDS_WINDOWTITLE, resstr, SIZEOF(resstr));
_stprintf(progtitle, resstr, filename);
-
+ LoadString(hThisInstance, IDS_MINIATURETITLE, miniaturetitle, SIZEOF(miniaturetitle));
/* create main window */
hwnd = CreateWindowEx (0, _T("WindowsApp"), progtitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL);
hMainWnd = hwnd;
+ hwndMiniature = CreateWindowEx(WS_EX_PALETTEWINDOW, _T("WindowsApp"), miniaturetitle, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME, 180, 200, 120, 100, hwnd, NULL, hThisInstance, NULL);
/* loading and setting the window menu from resource */
menu = LoadMenu(hThisInstance, MAKEINTRESOURCE(ID_MENU));
@@ -341,6 +373,15 @@ int WINAPI _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR l
sfn.nMaxFileTitle = SIZEOF(sfnFiletitle);
sfn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
+ hSizeboxLeftTop = CreateWindowEx(0, _T("Sizebox"), _T(""), WS_CHILD | WS_VISIBLE, 0, 0, 3, 3, hScrlClient, NULL, hThisInstance, NULL);
+ hSizeboxCenterTop = CreateWindowEx(0, _T("Sizebox"), _T(""), WS_CHILD | WS_VISIBLE, 0, 0, 3, 3, hScrlClient, NULL, hThisInstance, NULL);
+ hSizeboxRightTop = CreateWindowEx(0, _T("Sizebox"), _T(""), WS_CHILD | WS_VISIBLE, 0, 0, 3, 3, hScrlClient, NULL, hThisInstance, NULL);
+ hSizeboxLeftCenter = CreateWindowEx(0, _T("Sizebox"), _T(""), WS_CHILD | WS_VISIBLE, 0, 0, 3, 3, hScrlClient, NULL, hThisInstance, NULL);
+ hSizeboxRightCenter = CreateWindowEx(0, _T("Sizebox"), _T(""), WS_CHILD | WS_VISIBLE, 0, 0, 3, 3, hScrlClient, NULL, hThisInstance, NULL);
+ hSizeboxLeftBottom = CreateWindowEx(0, _T("Sizebox"), _T(""), WS_CHILD | WS_VISIBLE, 0, 0, 3, 3, hScrlClient, NULL, hThisInstance, NULL);
+ hSizeboxCenterBottom= CreateWindowEx(0, _T("Sizebox"), _T(""), WS_CHILD | WS_VISIBLE, 0, 0, 3, 3, hScrlClient, NULL, hThisInstance, NULL);
+ hSizeboxRightBottom = CreateWindowEx(0, _T("Sizebox"), _T(""), WS_CHILD | WS_VISIBLE, 0, 0, 3, 3, hScrlClient, NULL, hThisInstance, NULL);
+ SendMessage(hImageArea, WM_SIZE, 0, 0);
/* by moving the window, the things in WM_SIZE are done */
MoveWindow(hwnd, 100, 100, 600, 450, TRUE);
diff --git a/reactos/base/applications/paint/mouse.c b/reactos/base/applications/paint/mouse.c
index 61aef297fb6..5328c796525 100644
--- a/reactos/base/applications/paint/mouse.c
+++ b/reactos/base/applications/paint/mouse.c
@@ -23,37 +23,70 @@ void placeSelWin()
//SendMessage(hSelection, WM_PAINT, 0, 0);
}
-void startPainting(HDC hdc, short x, short y, int fg, int bg)
+POINT pointStack[256];
+short pointSP;
+
+void startPaintingL(HDC hdc, short x, short y, int fg, int bg)
{
startX = x;
startY = y;
lastX = x;
lastY = y;
- if ((activeTool!=5)&&(activeTool!=6)) newReversible();
switch (activeTool)
{
+ case 1:
+ case 10:
+ case 11:
+ case 15:
+ case 16:
+ newReversible();
case 2:
+ newReversible();
ShowWindow(hSelection, SW_HIDE);
break;
case 3:
+ newReversible();
Erase(hdc, x, y, x, y, bg, rubberRadius);
break;
case 4:
+ newReversible();
Fill(hdc, x, y, fg);
break;
case 7:
+ newReversible();
SetPixel(hdc, x, y, fg);
break;
case 8:
+ newReversible();
Brush(hdc, x, y, x, y, fg, brushStyle);
break;
case 9:
+ newReversible();
Airbrush(hdc, x, y, fg, airBrushWidth);
break;
+ case 12:
+ pointStack[pointSP].x = x;
+ pointStack[pointSP].y = y;
+ if (pointSP==0)
+ {
+ newReversible();
+ pointSP++;
+ }
+ break;
+ case 14:
+ pointStack[pointSP].x = x;
+ pointStack[pointSP].y = y;
+ if (pointSP+1>=2) Poly(hdc, pointStack, pointSP+1, fg, bg, lineWidth, shapeStyle, FALSE);
+ if (pointSP==0)
+ {
+ newReversible();
+ pointSP++;
+ }
+ break;
}
}
-void whilePainting(HDC hdc, short x, short y, int fg, int bg)
+void whilePaintingL(HDC hdc, short x, short y, int fg, int bg)
{
switch (activeTool)
{
@@ -87,50 +120,34 @@ void whilePainting(HDC hdc, short x, short y, int fg, int bg)
resetToU1();
Line(hdc, startX, startY, x, y, fg, lineWidth);
break;
+ case 12:
+ resetToU1();
+ pointStack[pointSP].x = x;
+ pointStack[pointSP].y = y;
+ switch (pointSP)
+ {
+ case 1: Line(hdc, pointStack[0].x, pointStack[0].y, pointStack[1].x, pointStack[1].y, fg, lineWidth); break;
+ case 2: Bezier(hdc, pointStack[0], pointStack[2], pointStack[2], pointStack[1], fg, lineWidth); break;
+ case 3: Bezier(hdc, pointStack[0], pointStack[2], pointStack[3], pointStack[1], fg, lineWidth); break;
+ }
+ break;
case 13:
resetToU1();
- switch (shapeStyle)
- {
- case 0:
- Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, FALSE);
- break;
- case 1:
- Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, TRUE);
- break;
- case 2:
- Rect(hdc, startX, startY, x, y, fg, fg, lineWidth, TRUE);
- break;
- }
+ Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
+ break;
+ case 14:
+ resetToU1();
+ pointStack[pointSP].x = x;
+ pointStack[pointSP].y = y;
+ if (pointSP+1>=2) Poly(hdc, pointStack, pointSP+1, fg, bg, lineWidth, shapeStyle, FALSE);
break;
case 15:
resetToU1();
- switch (shapeStyle)
- {
- case 0:
- Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, FALSE);
- break;
- case 1:
- Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, TRUE);
- break;
- case 2:
- Ellp(hdc, startX, startY, x, y, fg, fg, lineWidth, TRUE);
- break;
- }
+ Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
break;
case 16:
resetToU1();
- switch (shapeStyle)
- {
- case 0:
- RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, FALSE);
- break;
- case 1:
- RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, TRUE);
- break;
- case 2:
- RRect(hdc, startX, startY, x, y, fg, fg, lineWidth, TRUE);
- break;
- }
+ RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
break;
}
@@ -138,7 +155,7 @@ void whilePainting(HDC hdc, short x, short y, int fg, int bg)
lastY = y;
}
-void endPainting(HDC hdc, short x, short y, int fg, int bg)
+void endPaintingL(HDC hdc, short x, short y, int fg, int bg)
{
switch (activeTool)
{
@@ -163,50 +180,204 @@ void endPainting(HDC hdc, short x, short y, int fg, int bg)
resetToU1();
Line(hdc, startX, startY, x, y, fg, lineWidth);
break;
+ case 12:
+ pointSP++;
+ if (pointSP==4) pointSP = 0;
+ break;
case 13:
resetToU1();
- switch (shapeStyle)
+ Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
+ break;
+ case 14:
+ resetToU1();
+ pointStack[pointSP].x = x;
+ pointStack[pointSP].y = y;
+ pointSP++;
+ if (pointSP>=2)
{
- case 0:
- Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, FALSE);
- break;
- case 1:
- Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, TRUE);
- break;
- case 2:
- Rect(hdc, startX, startY, x, y, fg, fg, lineWidth, TRUE);
- break;
+ if ( (pointStack[0].x-x)*(pointStack[0].x-x) + (pointStack[0].y-y)*(pointStack[0].y-y) <= lineWidth*lineWidth+1)
+ {
+ Poly(hdc, pointStack, pointSP, fg, bg, lineWidth, shapeStyle, TRUE);
+ pointSP = 0;
+ }
+ else
+ {
+ Poly(hdc, pointStack, pointSP, fg, bg, lineWidth, shapeStyle, FALSE);
+ }
}
+ if (pointSP==255) pointSP--;
break;
case 15:
resetToU1();
- switch (shapeStyle)
- {
- case 0:
- Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, FALSE);
- break;
- case 1:
- Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, TRUE);
- break;
- case 2:
- Ellp(hdc, startX, startY, x, y, fg, fg, lineWidth, TRUE);
- break;
- }
+ Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
break;
case 16:
resetToU1();
- switch (shapeStyle)
+ RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
+ break;
+ }
+}
+
+void startPaintingR(HDC hdc, short x, short y, int fg, int bg)
+{
+ startX = x;
+ startY = y;
+ lastX = x;
+ lastY = y;
+ switch (activeTool)
+ {
+ case 1:
+ case 10:
+ case 11:
+ case 15:
+ case 16:
+ newReversible();
+ case 3:
+ newReversible();
+ Replace(hdc, x, y, x, y, fg, bg, rubberRadius);
+ break;
+ case 4:
+ newReversible();
+ Fill(hdc, x, y, bg);
+ break;
+ case 7:
+ newReversible();
+ SetPixel(hdc, x, y, bg);
+ break;
+ case 8:
+ newReversible();
+ Brush(hdc, x, y, x, y, bg, brushStyle);
+ break;
+ case 9:
+ newReversible();
+ Airbrush(hdc, x, y, bg, airBrushWidth);
+ break;
+ case 12:
+ pointStack[pointSP].x = x;
+ pointStack[pointSP].y = y;
+ if (pointSP==0)
{
- case 0:
- RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, FALSE);
- break;
- case 1:
- RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, TRUE);
- break;
- case 2:
- RRect(hdc, startX, startY, x, y, fg, fg, lineWidth, TRUE);
- break;
+ newReversible();
+ pointSP++;
+ }
+ break;
+ case 14:
+ pointStack[pointSP].x = x;
+ pointStack[pointSP].y = y;
+ if (pointSP+1>=2) Poly(hdc, pointStack, pointSP+1, bg, fg, lineWidth, shapeStyle, FALSE);
+ if (pointSP==0)
+ {
+ newReversible();
+ pointSP++;
}
break;
}
}
+
+void whilePaintingR(HDC hdc, short x, short y, int fg, int bg)
+{
+ switch (activeTool)
+ {
+ case 3:
+ Replace(hdc, lastX, lastY, x, y, fg, bg, rubberRadius);
+ break;
+ case 7:
+ Line(hdc, lastX, lastY, x, y, bg, 1);
+ break;
+ case 8:
+ Brush(hdc, lastX, lastY, x, y, bg, brushStyle);
+ break;
+ case 9:
+ Airbrush(hdc, x, y, bg, airBrushWidth);
+ break;
+ case 11:
+ resetToU1();
+ Line(hdc, startX, startY, x, y, bg, lineWidth);
+ break;
+ case 12:
+ resetToU1();
+ pointStack[pointSP].x = x;
+ pointStack[pointSP].y = y;
+ switch (pointSP)
+ {
+ case 1: Line(hdc, pointStack[0].x, pointStack[0].y, pointStack[1].x, pointStack[1].y, bg, lineWidth); break;
+ case 2: Bezier(hdc, pointStack[0], pointStack[2], pointStack[2], pointStack[1], bg, lineWidth); break;
+ case 3: Bezier(hdc, pointStack[0], pointStack[2], pointStack[3], pointStack[1], bg, lineWidth); break;
+ }
+ break;
+ case 13:
+ resetToU1();
+ Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
+ break;
+ case 14:
+ resetToU1();
+ pointStack[pointSP].x = x;
+ pointStack[pointSP].y = y;
+ if (pointSP+1>=2) Poly(hdc, pointStack, pointSP+1, bg, fg, lineWidth, shapeStyle, FALSE);
+ break;
+ case 15:
+ resetToU1();
+ Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
+ break;
+ case 16:
+ resetToU1();
+ RRect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
+ break;
+ }
+
+ lastX = x;
+ lastY = y;
+}
+
+void endPaintingR(HDC hdc, short x, short y, int fg, int bg)
+{
+ switch (activeTool)
+ {
+ case 3:
+ Replace(hdc, lastX, lastY, x, y, fg, bg, rubberRadius);
+ break;
+ case 7:
+ Line(hdc, lastX, lastY, x, y, bg, 1);
+ SetPixel(hdc, x, y, bg);
+ break;
+ case 11:
+ resetToU1();
+ Line(hdc, startX, startY, x, y, bg, lineWidth);
+ break;
+ case 12:
+ pointSP++;
+ if (pointSP==4) pointSP = 0;
+ break;
+ case 13:
+ resetToU1();
+ Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
+ break;
+ case 14:
+ resetToU1();
+ pointStack[pointSP].x = x;
+ pointStack[pointSP].y = y;
+ pointSP++;
+ if (pointSP>=2)
+ {
+ if ( (pointStack[0].x-x)*(pointStack[0].x-x) + (pointStack[0].y-y)*(pointStack[0].y-y) <= lineWidth*lineWidth+1)
+ {
+ Poly(hdc, pointStack, pointSP, bg, fg, lineWidth, shapeStyle, TRUE);
+ pointSP = 0;
+ }
+ else
+ {
+ Poly(hdc, pointStack, pointSP, bg, fg, lineWidth, shapeStyle, FALSE);
+ }
+ }
+ if (pointSP==255) pointSP--;
+ break;
+ case 15:
+ resetToU1();
+ Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
+ break;
+ case 16:
+ resetToU1();
+ RRect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
+ break;
+ }
+}
diff --git a/reactos/base/applications/paint/mouse.h b/reactos/base/applications/paint/mouse.h
index c7223e2228a..878715efa21 100644
--- a/reactos/base/applications/paint/mouse.h
+++ b/reactos/base/applications/paint/mouse.h
@@ -8,8 +8,14 @@
void placeSelWin();
-void startPainting(HDC hdc, short x, short y, int fg, int bg);
+void startPaintingL(HDC hdc, short x, short y, int fg, int bg);
-void whilePainting(HDC hdc, short x, short y, int fg, int bg);
+void whilePaintingL(HDC hdc, short x, short y, int fg, int bg);
-void endPainting(HDC hdc, short x, short y, int fg, int bg);
+void endPaintingL(HDC hdc, short x, short y, int fg, int bg);
+
+void startPaintingR(HDC hdc, short x, short y, int fg, int bg);
+
+void whilePaintingR(HDC hdc, short x, short y, int fg, int bg);
+
+void endPaintingR(HDC hdc, short x, short y, int fg, int bg);
diff --git a/reactos/base/applications/paint/paint.rbuild b/reactos/base/applications/paint/paint.rbuild
index 3c48bf8e73b..3087df43d49 100644
--- a/reactos/base/applications/paint/paint.rbuild
+++ b/reactos/base/applications/paint/paint.rbuild
@@ -18,6 +18,7 @@
palette.c
registry.c
selection.c
+ sizebox.c
toolsettings.c
winproc.c
rsrc.rc
diff --git a/reactos/base/applications/paint/palette.c b/reactos/base/applications/paint/palette.c
index c8e07f19de1..8e873041327 100644
--- a/reactos/base/applications/paint/palette.c
+++ b/reactos/base/applications/paint/palette.c
@@ -57,7 +57,7 @@ LRESULT CALLBACK PalWinProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lPar
DrawEdge(hDC, &rc, BDR_SUNKENOUTER, BF_RECT);
oldPen = SelectObject(hDC, CreatePen(PS_NULL, 0, 0));
oldBrush = SelectObject(hDC, CreateSolidBrush(palColors[i]));
- Rectangle(hDC, rc.left + 2,rc.top + 2,rc.right + 1, rc.bottom - 1);
+ Rectangle(hDC, rc.left + 2,rc.top + 2,rc.right - 1, rc.bottom - 1);
DeleteObject(SelectObject(hDC, oldBrush));
DeleteObject(SelectObject(hDC, oldPen));
}
diff --git a/reactos/base/applications/paint/rsrc.rc b/reactos/base/applications/paint/rsrc.rc
index 512be8c0830..7b2e17170ef 100644
--- a/reactos/base/applications/paint/rsrc.rc
+++ b/reactos/base/applications/paint/rsrc.rc
@@ -33,7 +33,6 @@
#include "lang/ru-RU.rc"
#include "lang/uk-UA.rc"
-
//
// SUPPORT FOR WINDOWS XP THEMES:
// THIS WILL MAKE THE PROGRAM USE THE COMMON CONTROLS
diff --git a/reactos/base/applications/paint/sizebox.c b/reactos/base/applications/paint/sizebox.c
new file mode 100644
index 00000000000..60d0a033189
--- /dev/null
+++ b/reactos/base/applications/paint/sizebox.c
@@ -0,0 +1,106 @@
+/*
+ * PROJECT: PAINT for ReactOS
+ * LICENSE: LGPL
+ * FILE: sizebox.c
+ * PURPOSE: Window procedure of the size boxes
+ * PROGRAMMERS: Benedikt Freisen
+ */
+
+/* INCLUDES *********************************************************/
+
+#include
+#include
+#include
+#include "globalvar.h"
+#include "history.h"
+
+/* FUNCTIONS ********************************************************/
+
+BOOL resizing = FALSE;
+short xOrig;
+short yOrig;
+
+LRESULT CALLBACK SizeboxWinProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch (message)
+ {
+ case WM_SETCURSOR:
+ {
+ if ((hwnd==hSizeboxLeftTop)||(hwnd==hSizeboxRightBottom))
+ SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
+ if ((hwnd==hSizeboxLeftBottom)||(hwnd==hSizeboxRightTop))
+ SetCursor(LoadCursor(NULL, IDC_SIZENESW));
+ if ((hwnd==hSizeboxLeftCenter)||(hwnd==hSizeboxRightCenter))
+ SetCursor(LoadCursor(NULL, IDC_SIZEWE));
+ if ((hwnd==hSizeboxCenterTop)||(hwnd==hSizeboxCenterBottom))
+ SetCursor(LoadCursor(NULL, IDC_SIZENS));
+ }
+ break;
+ case WM_LBUTTONDOWN:
+ resizing = TRUE;
+ xOrig = LOWORD(lParam);
+ yOrig = HIWORD(lParam);
+ SetCapture(hwnd);
+ break;
+ case WM_MOUSEMOVE:
+ if (resizing)
+ {
+ TCHAR sizeStr[100];
+ short xRel;
+ short yRel;
+ xRel = ((short)LOWORD(lParam)-xOrig)*1000/zoom;
+ yRel = ((short)HIWORD(lParam)-yOrig)*1000/zoom;
+ if (hwnd==hSizeboxLeftTop)
+ _stprintf(sizeStr, _T("%d x %d"), imgXRes-xRel, imgYRes-yRel);
+ if (hwnd==hSizeboxCenterTop)
+ _stprintf(sizeStr, _T("%d x %d"), imgXRes, imgYRes-yRel);
+ if (hwnd==hSizeboxRightTop)
+ _stprintf(sizeStr, _T("%d x %d"), imgXRes+xRel, imgYRes-yRel);
+ if (hwnd==hSizeboxLeftCenter)
+ _stprintf(sizeStr, _T("%d x %d"), imgXRes-xRel, imgYRes);
+ if (hwnd==hSizeboxRightCenter)
+ _stprintf(sizeStr, _T("%d x %d"), imgXRes+xRel, imgYRes);
+ if (hwnd==hSizeboxLeftBottom)
+ _stprintf(sizeStr, _T("%d x %d"), imgXRes-xRel, imgYRes+yRel);
+ if (hwnd==hSizeboxCenterBottom)
+ _stprintf(sizeStr, _T("%d x %d"), imgXRes, imgYRes+yRel);
+ if (hwnd==hSizeboxRightBottom)
+ _stprintf(sizeStr, _T("%d x %d"), imgXRes+xRel, imgYRes+yRel);
+ SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM)sizeStr);
+ }
+ break;
+ case WM_LBUTTONUP:
+ if (resizing)
+ {
+ short xRel;
+ short yRel;
+ ReleaseCapture();
+ resizing = FALSE;
+ xRel = ((short)LOWORD(lParam)-xOrig)*1000/zoom;
+ yRel = ((short)HIWORD(lParam)-yOrig)*1000/zoom;
+ if (hwnd==hSizeboxLeftTop)
+ cropReversible(imgXRes-xRel, imgYRes-yRel, xRel, yRel);
+ if (hwnd==hSizeboxCenterTop)
+ cropReversible(imgXRes, imgYRes-yRel, 0, yRel);
+ if (hwnd==hSizeboxRightTop)
+ cropReversible(imgXRes+xRel, imgYRes-yRel, 0, yRel);
+ if (hwnd==hSizeboxLeftCenter)
+ cropReversible(imgXRes-xRel, imgYRes, xRel, 0);
+ if (hwnd==hSizeboxRightCenter)
+ cropReversible(imgXRes+xRel, imgYRes, 0, 0);
+ if (hwnd==hSizeboxLeftBottom)
+ cropReversible(imgXRes-xRel, imgYRes+yRel, xRel, 0);
+ if (hwnd==hSizeboxCenterBottom)
+ cropReversible(imgXRes, imgYRes+yRel, 0, 0);
+ if (hwnd==hSizeboxRightBottom)
+ cropReversible(imgXRes+xRel, imgYRes+yRel, 0, 0);
+ SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM)_T(""));
+ }
+ break;
+
+ default:
+ return DefWindowProc (hwnd, message, wParam, lParam);
+ }
+
+ return 0;
+}
diff --git a/reactos/base/applications/paint/sizebox.h b/reactos/base/applications/paint/sizebox.h
new file mode 100644
index 00000000000..6329484221f
--- /dev/null
+++ b/reactos/base/applications/paint/sizebox.h
@@ -0,0 +1,9 @@
+/*
+ * PROJECT: PAINT for ReactOS
+ * LICENSE: LGPL
+ * FILE: sizebox.h
+ * PURPOSE: Window procedure of the size boxes
+ * PROGRAMMERS: Benedikt Freisen
+ */
+
+LRESULT CALLBACK SizeboxWinProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
diff --git a/reactos/base/applications/paint/toolsettings.c b/reactos/base/applications/paint/toolsettings.c
index b5141eb7c64..8f7de9eb1d3 100644
--- a/reactos/base/applications/paint/toolsettings.c
+++ b/reactos/base/applications/paint/toolsettings.c
@@ -148,14 +148,14 @@ LRESULT CALLBACK SettingsWinProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
}
}
if (shapeStyle==0)
- Rect(hdc, 5, 6, 37, 16, GetSysColor(COLOR_HIGHLIGHTTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, FALSE);
+ Rect(hdc, 5, 6, 37, 16, GetSysColor(COLOR_HIGHLIGHTTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, 0);
else
- Rect(hdc, 5, 6, 37, 16, GetSysColor(COLOR_WINDOWTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, FALSE);
+ Rect(hdc, 5, 6, 37, 16, GetSysColor(COLOR_WINDOWTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, 0);
if (shapeStyle==1)
- Rect(hdc, 5, 26, 37, 36, GetSysColor(COLOR_HIGHLIGHTTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, TRUE);
+ Rect(hdc, 5, 26, 37, 36, GetSysColor(COLOR_HIGHLIGHTTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, 1);
else
- Rect(hdc, 5, 26, 37, 36, GetSysColor(COLOR_WINDOWTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, TRUE);
- Rect(hdc, 5, 46, 37, 56, GetSysColor(COLOR_APPWORKSPACE), GetSysColor(COLOR_APPWORKSPACE), 1, TRUE);
+ Rect(hdc, 5, 26, 37, 36, GetSysColor(COLOR_WINDOWTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, 1);
+ Rect(hdc, 5, 46, 37, 56, GetSysColor(COLOR_APPWORKSPACE), GetSysColor(COLOR_APPWORKSPACE), 1, 1);
for (i=0; i<5; i++)
{
if (lineWidth==i+1)
diff --git a/reactos/base/applications/paint/winproc.c b/reactos/base/applications/paint/winproc.c
index 290bdd73365..4e72294a99b 100644
--- a/reactos/base/applications/paint/winproc.c
+++ b/reactos/base/applications/paint/winproc.c
@@ -29,6 +29,7 @@ void selectTool(int tool)
{
ShowWindow(hSelection, SW_HIDE);
activeTool = tool;
+ pointSP = 0; // resets the point-buffer of the polygon and bezier functions
SendMessage(hToolSettings, WM_PAINT, 0, 0);
}
@@ -60,6 +61,12 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
case WM_CLOSE:
+ if (hwnd==hwndMiniature)
+ {
+ ShowWindow(hwndMiniature, SW_HIDE);
+ showMiniature = FALSE;
+ break;
+ }
if (undoSteps>0)
{
TCHAR programname[20];
@@ -144,6 +151,44 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
CheckMenuItem(GetMenu(hMainWnd), IDM_IMAGEDRAWOPAQUE, MF_UNCHECKED | MF_BYCOMMAND);
break;
}
+ if (showGrid)
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWSHOWGRID, MF_CHECKED | MF_BYCOMMAND);
+ else
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWSHOWGRID, MF_UNCHECKED | MF_BYCOMMAND);
+ if (showMiniature)
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWSHOWMINIATURE, MF_CHECKED | MF_BYCOMMAND);
+ else
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWSHOWMINIATURE, MF_UNCHECKED | MF_BYCOMMAND);
+
+ if (zoom==125)
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM125, MF_CHECKED | MF_BYCOMMAND);
+ else
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM125, MF_UNCHECKED | MF_BYCOMMAND);
+ if (zoom==250)
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM25, MF_CHECKED | MF_BYCOMMAND);
+ else
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM25, MF_UNCHECKED | MF_BYCOMMAND);
+ if (zoom==500)
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM50, MF_CHECKED | MF_BYCOMMAND);
+ else
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM50, MF_UNCHECKED | MF_BYCOMMAND);
+ if (zoom==1000)
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM100, MF_CHECKED | MF_BYCOMMAND);
+ else
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM100, MF_UNCHECKED | MF_BYCOMMAND);
+ if (zoom==2000)
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM200, MF_CHECKED | MF_BYCOMMAND);
+ else
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM200, MF_UNCHECKED | MF_BYCOMMAND);
+ if (zoom==4000)
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM400, MF_CHECKED | MF_BYCOMMAND);
+ else
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM400, MF_UNCHECKED | MF_BYCOMMAND);
+ if (zoom==8000)
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM800, MF_CHECKED | MF_BYCOMMAND);
+ else
+ CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM800, MF_UNCHECKED | MF_BYCOMMAND);
+
break;
case WM_SIZE:
if (hwnd==hMainWnd)
@@ -154,6 +199,33 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
MoveWindow(hScrollbox, 56, 49,LOWORD(lParam)-56, HIWORD(lParam)-72, TRUE);
//InvalidateRect(hwnd, NULL, TRUE);
}
+ if (hwnd==hImageArea)
+ {
+ MoveWindow(hSizeboxLeftTop,
+ 0,
+ 0, 3, 3, TRUE);
+ MoveWindow(hSizeboxCenterTop,
+ imgXRes*zoom/2000+3*3/4,
+ 0, 3, 3, TRUE);
+ MoveWindow(hSizeboxRightTop,
+ imgXRes*zoom/1000+3,
+ 0, 3, 3, TRUE);
+ MoveWindow(hSizeboxLeftCenter,
+ 0,
+ imgYRes*zoom/2000+3*3/4, 3, 3, TRUE);
+ MoveWindow(hSizeboxRightCenter,
+ imgXRes*zoom/1000+3,
+ imgYRes*zoom/2000+3*3/4, 3, 3, TRUE);
+ MoveWindow(hSizeboxLeftBottom,
+ 0,
+ imgYRes*zoom/1000+3, 3, 3, TRUE);
+ MoveWindow(hSizeboxCenterBottom,
+ imgXRes*zoom/2000+3*3/4,
+ imgYRes*zoom/1000+3, 3, 3, TRUE);
+ MoveWindow(hSizeboxRightBottom,
+ imgXRes*zoom/1000+3,
+ imgYRes*zoom/1000+3, 3, 3, TRUE);
+ }
if ((hwnd==hImageArea)||(hwnd==hScrollbox))
{
long clientRectScrollbox[4];
@@ -218,8 +290,34 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
{
HDC hdc = GetDC(hImageArea);
StretchBlt(hdc, 0, 0, imgXRes*zoom/1000, imgYRes*zoom/1000, hDrawingDC, 0, 0, imgXRes, imgYRes, SRCCOPY);
+ if (showGrid && (zoom>=4000))
+ {
+ HPEN oldPen = SelectObject(hdc, CreatePen(PS_SOLID, 1, 0x00a0a0a0));
+ int counter;
+ for (counter = 0; counter <= imgYRes; counter++)
+ {
+ MoveToEx(hdc, 0, counter*zoom/1000, NULL);
+ LineTo(hdc, imgXRes*zoom/1000, counter*zoom/1000);
+ }
+ for (counter = 0; counter <= imgXRes; counter++)
+ {
+ MoveToEx(hdc, counter*zoom/1000, 0, NULL);
+ LineTo(hdc, counter*zoom/1000, imgYRes*zoom/1000);
+ }
+ DeleteObject(SelectObject(hdc, oldPen));
+ }
ReleaseDC(hImageArea, hdc);
SendMessage(hSelection, WM_PAINT, 0, 0);
+ SendMessage(hwndMiniature, WM_PAINT, 0, 0);
+ }else
+ if (hwnd==hwndMiniature)
+ {
+ long mclient[4];
+ GetClientRect(hwndMiniature, (LPRECT)&mclient);
+ HDC hdc = GetDC(hwndMiniature);
+ BitBlt(hdc, -min(imgXRes*GetScrollPos(hScrollbox, SB_HORZ)/10000, imgXRes-mclient[2]),
+ -min(imgYRes*GetScrollPos(hScrollbox, SB_VERT)/10000, imgYRes-mclient[3]), imgXRes, imgYRes, hDrawingDC, 0, 0, SRCCOPY);
+ ReleaseDC(hwndMiniature, hdc);
}
break;
@@ -257,7 +355,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
{
SetCapture(hImageArea);
drawing = TRUE;
- startPainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor);
+ startPaintingL(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor);
}else
{
SendMessage(hwnd, WM_LBUTTONUP, wParam, lParam);
@@ -274,7 +372,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
{
SetCapture(hImageArea);
drawing = TRUE;
- startPainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, bgColor, fgColor);
+ startPaintingR(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor);
}else
{
SendMessage(hwnd, WM_RBUTTONUP, wParam, lParam);
@@ -289,7 +387,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
{
ReleaseCapture();
drawing = FALSE;
- endPainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor);
+ endPaintingL(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor);
SendMessage(hImageArea, WM_PAINT, 0, 0);
if (activeTool==5)
{
@@ -305,7 +403,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
{
ReleaseCapture();
drawing = FALSE;
- endPainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, bgColor, fgColor);
+ endPaintingR(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor);
SendMessage(hImageArea, WM_PAINT, 0, 0);
if (activeTool==5)
{
@@ -329,7 +427,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
{
if ((wParam&MK_LBUTTON)!=0)
{
- whilePainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor);
+ whilePaintingL(hDrawingDC, (short)LOWORD(lParam)*1000/zoom, (short)HIWORD(lParam)*1000/zoom, fgColor, bgColor);
SendMessage(hImageArea, WM_PAINT, 0, 0);
if ((activeTool>=10)||(activeTool==2))
{
@@ -340,7 +438,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
}
if ((wParam&MK_RBUTTON)!=0)
{
- whilePainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, bgColor, fgColor);
+ whilePaintingR(hDrawingDC, (short)LOWORD(lParam)*1000/zoom, (short)HIWORD(lParam)*1000/zoom, fgColor, bgColor);
SendMessage(hImageArea, WM_PAINT, 0, 0);
if (activeTool>=10)
{
@@ -467,9 +565,9 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
case IDM_EDITSELECTALL:
if (activeTool==2)
{
- startPainting(hDrawingDC, 0, 0, fgColor, bgColor);
- whilePainting(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
- endPainting(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
+ startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor);
+ whilePaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
+ endPaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
}
break;
case IDM_EDITCOPYTO:
@@ -521,9 +619,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
int retVal = attributesDlg();
if ((LOWORD(retVal)!=0)&&(HIWORD(retVal)!=0))
{
- // cropReversible broken, dirty hack:
- // insertReversible(CopyImage(hBms[currInd], IMAGE_BITMAP, LOWORD(retVal), HIWORD(retVal), 0));
- cropReversible(LOWORD(retVal), HIWORD(retVal));
+ cropReversible(LOWORD(retVal), HIWORD(retVal), 0, 0);
updateCanvasAndScrollbars();
}
}
@@ -546,6 +642,17 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
insertReversible(CopyImage(hSelBm, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG));
updateCanvasAndScrollbars();
break;
+
+ case IDM_VIEWSHOWGRID:
+ showGrid = !showGrid;
+ break;
+ case IDM_VIEWSHOWMINIATURE:
+ showMiniature = !showMiniature;
+ if (showMiniature)
+ ShowWindow(hwndMiniature, SW_SHOW);
+ else
+ ShowWindow(hwndMiniature, SW_HIDE);
+ break;
case IDM_VIEWZOOM125:
ZoomTo(125);
diff --git a/reactos/base/applications/screensavers/logon/lang/ro-RO.rc b/reactos/base/applications/screensavers/logon/lang/ro-RO.rc
index fd3b19a9dec..cda49c3bfe6 100644
--- a/reactos/base/applications/screensavers/logon/lang/ro-RO.rc
+++ b/reactos/base/applications/screensavers/logon/lang/ro-RO.rc
@@ -1,7 +1,11 @@
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
STRINGTABLE DISCARDABLE
BEGIN
- IDS_DESCRIPTION "Economizor Sigl"
- IDS_TEXT "Acest economizor nu are opiuni."
+ IDS_DESCRIPTION "Ecran de veghe Siglă"
+ IDS_TEXT "Acest ecran de veghe nu are opțiuni."
END
+
+#pragma code_page(default)
diff --git a/reactos/base/applications/taskmgr/affinity.c b/reactos/base/applications/taskmgr/affinity.c
index 0b96bef70d7..58a225075c4 100644
--- a/reactos/base/applications/taskmgr/affinity.c
+++ b/reactos/base/applications/taskmgr/affinity.c
@@ -40,24 +40,15 @@ static INT_PTR CALLBACK AffinityDialogWndProc(HWND hDlg, UINT message, WPARAM wP
void ProcessPage_OnSetAffinity(void)
{
- LV_ITEM lvitem;
- ULONG Index;
DWORD dwProcessId;
WCHAR strErrorText[260];
WCHAR szTitle[256];
- for (Index=0; Index<(ULONG)ListView_GetItemCount(hProcessPageListCtrl); Index++) {
- memset(&lvitem, 0, sizeof(LV_ITEM));
- lvitem.mask = LVIF_STATE;
- lvitem.stateMask = LVIS_SELECTED;
- lvitem.iItem = Index;
- (void)ListView_GetItem(hProcessPageListCtrl, &lvitem);
- if (lvitem.state & LVIS_SELECTED)
- break;
- }
- dwProcessId = PerfDataGetProcessId(Index);
- if ((ListView_GetSelectedCount(hProcessPageListCtrl) != 1) || (dwProcessId == 0))
+ dwProcessId = GetSelectedProcessId();
+
+ if (dwProcessId == 0)
return;
+
hProcessAffinityHandle = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_SET_INFORMATION, FALSE, dwProcessId);
if (!hProcessAffinityHandle) {
GetLastErrorText(strErrorText, sizeof(strErrorText) / sizeof(WCHAR));
diff --git a/reactos/base/applications/taskmgr/dbgchnl.c b/reactos/base/applications/taskmgr/dbgchnl.c
index b1f34d35a0c..b39774c5a01 100644
--- a/reactos/base/applications/taskmgr/dbgchnl.c
+++ b/reactos/base/applications/taskmgr/dbgchnl.c
@@ -42,33 +42,6 @@ BOOL DebugChannelsAreSupported(void)
return FALSE;
}
-static DWORD get_selected_pid(void)
-{
- LVITEM lvitem;
- ULONG Index;
- DWORD dwProcessId;
-
- for (Index=0; Index<(ULONG)ListView_GetItemCount(hProcessPageListCtrl); Index++)
- {
- memset(&lvitem, 0, sizeof(LVITEM));
-
- lvitem.mask = LVIF_STATE;
- lvitem.stateMask = LVIS_SELECTED;
- lvitem.iItem = Index;
-
- (void)ListView_GetItem(hProcessPageListCtrl, &lvitem);
-
- if (lvitem.state & LVIS_SELECTED)
- break;
- }
-
- dwProcessId = PerfDataGetProcessId(Index);
-
- if ((ListView_GetSelectedCount(hProcessPageListCtrl) != 1) || (dwProcessId == 0))
- return 0;
- return dwProcessId;
-}
-
static int list_channel_CB(HANDLE hProcess, void* addr, WCHAR* buffer, void* user)
{
int j;
@@ -290,7 +263,7 @@ static void DebugChannels_FillList(HWND hChannelLV)
(void)ListView_DeleteAllItems(hChannelLV);
- hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, FALSE, get_selected_pid());
+ hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, FALSE, GetSelectedProcessId());
if (!hProcess) return; /* FIXME messagebox */
SendMessageW(hChannelLV, WM_SETREDRAW, FALSE, 0);
enum_channel(hProcess, list_channel_CB, (void*)hChannelLV, TRUE);
@@ -350,7 +323,7 @@ static void DebugChannels_OnNotify(HWND hDlg, LPARAM lParam)
HANDLE hProcess;
NMITEMACTIVATE* nmia = (NMITEMACTIVATE*)lParam;
- hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, get_selected_pid());
+ hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, GetSelectedProcessId());
if (!hProcess) return; /* FIXME message box */
lhti.pt = nmia->ptAction;
hChannelLV = GetDlgItem(hDlg, IDC_DEBUG_CHANNELS_LIST);
diff --git a/reactos/base/applications/taskmgr/debug.c b/reactos/base/applications/taskmgr/debug.c
index 9c1f8708a48..20d588e3d27 100644
--- a/reactos/base/applications/taskmgr/debug.c
+++ b/reactos/base/applications/taskmgr/debug.c
@@ -25,8 +25,6 @@
void ProcessPage_OnDebug(void)
{
- LVITEM lvitem;
- ULONG Index;
DWORD dwProcessId;
WCHAR strErrorText[260];
HKEY hKey;
@@ -39,24 +37,9 @@ void ProcessPage_OnDebug(void)
WCHAR szTemp[256];
WCHAR szTempA[256];
+ dwProcessId = GetSelectedProcessId();
- for (Index=0; Index<(ULONG)ListView_GetItemCount(hProcessPageListCtrl); Index++)
- {
- memset(&lvitem, 0, sizeof(LVITEM));
-
- lvitem.mask = LVIF_STATE;
- lvitem.stateMask = LVIS_SELECTED;
- lvitem.iItem = Index;
-
- (void)ListView_GetItem(hProcessPageListCtrl, &lvitem);
-
- if (lvitem.state & LVIS_SELECTED)
- break;
- }
-
- dwProcessId = PerfDataGetProcessId(Index);
-
- if ((ListView_GetSelectedCount(hProcessPageListCtrl) != 1) || (dwProcessId == 0))
+ if (dwProcessId == 0)
return;
LoadStringW(hInst, IDS_MSG_WARNINGDEBUG, szTemp, 256);
diff --git a/reactos/base/applications/taskmgr/endproc.c b/reactos/base/applications/taskmgr/endproc.c
index 33f297cf02b..ef617967136 100644
--- a/reactos/base/applications/taskmgr/endproc.c
+++ b/reactos/base/applications/taskmgr/endproc.c
@@ -25,30 +25,14 @@
void ProcessPage_OnEndProcess(void)
{
- LVITEM lvitem;
- ULONG Index;
DWORD dwProcessId;
HANDLE hProcess;
WCHAR szTitle[256];
WCHAR strErrorText[260];
- for (Index=0; Index<(ULONG)ListView_GetItemCount(hProcessPageListCtrl); Index++)
- {
- memset(&lvitem, 0, sizeof(LVITEM));
+ dwProcessId = GetSelectedProcessId();
- lvitem.mask = LVIF_STATE;
- lvitem.stateMask = LVIS_SELECTED;
- lvitem.iItem = Index;
-
- (void)ListView_GetItem(hProcessPageListCtrl, &lvitem);
-
- if (lvitem.state & LVIS_SELECTED)
- break;
- }
-
- dwProcessId = PerfDataGetProcessId(Index);
-
- if ((ListView_GetSelectedCount(hProcessPageListCtrl) != 1) || (dwProcessId == 0))
+ if (dwProcessId == 0)
return;
LoadStringW(hInst, IDS_MSG_WARNINGTERMINATING, strErrorText, 256);
@@ -78,30 +62,14 @@ void ProcessPage_OnEndProcess(void)
void ProcessPage_OnEndProcessTree(void)
{
- LVITEM lvitem;
- ULONG Index;
DWORD dwProcessId;
HANDLE hProcess;
WCHAR szTitle[256];
WCHAR strErrorText[260];
- for (Index=0; Index<(ULONG)ListView_GetItemCount(hProcessPageListCtrl); Index++)
- {
- memset(&lvitem, 0, sizeof(LVITEM));
+ dwProcessId = GetSelectedProcessId();
- lvitem.mask = LVIF_STATE;
- lvitem.stateMask = LVIS_SELECTED;
- lvitem.iItem = Index;
-
- (void)ListView_GetItem(hProcessPageListCtrl, &lvitem);
-
- if (lvitem.state & LVIS_SELECTED)
- break;
- }
-
- dwProcessId = PerfDataGetProcessId(Index);
-
- if ((ListView_GetSelectedCount(hProcessPageListCtrl) != 1) || (dwProcessId == 0))
+ if (dwProcessId == 0)
return;
LoadStringW(hInst, IDS_MSG_WARNINGTERMINATING, strErrorText, 256);
diff --git a/reactos/base/applications/taskmgr/lang/bg-BG.rc b/reactos/base/applications/taskmgr/lang/bg-BG.rc
index f57bbe67170..0b2dc424d83 100644
--- a/reactos/base/applications/taskmgr/lang/bg-BG.rc
+++ b/reactos/base/applications/taskmgr/lang/bg-BG.rc
@@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "& ",IDC_ENDPROCESS,144,203,100,14
CONTROL "& ",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/cs-CZ.rc b/reactos/base/applications/taskmgr/lang/cs-CZ.rc
index df4f5f98f53..287fee830b7 100644
--- a/reactos/base/applications/taskmgr/lang/cs-CZ.rc
+++ b/reactos/base/applications/taskmgr/lang/cs-CZ.rc
@@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Ukonit proces",IDC_ENDPROCESS,171,189,69,14
CONTROL "&Zobrazit procesy vech uivatel",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/da-DK.rc b/reactos/base/applications/taskmgr/lang/da-DK.rc
index 80bb2242bbe..07d2c7bade2 100644
--- a/reactos/base/applications/taskmgr/lang/da-DK.rc
+++ b/reactos/base/applications/taskmgr/lang/da-DK.rc
@@ -187,7 +187,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Afslut Proces",IDC_ENDPROCESS,171,189,69,14
CONTROL "&Vis Processor fra alle brugere",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/de-DE.rc b/reactos/base/applications/taskmgr/lang/de-DE.rc
index d78db115e58..97a3f79e0b3 100644
--- a/reactos/base/applications/taskmgr/lang/de-DE.rc
+++ b/reactos/base/applications/taskmgr/lang/de-DE.rc
@@ -190,7 +190,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Prozess beenden",IDC_ENDPROCESS,171,189,69,14
CONTROL "Prozesse aller &Benutzer anzeigen",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/el-GR.rc b/reactos/base/applications/taskmgr/lang/el-GR.rc
index f24fdefe9f3..e206ffbcbee 100644
--- a/reactos/base/applications/taskmgr/lang/el-GR.rc
+++ b/reactos/base/applications/taskmgr/lang/el-GR.rc
@@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&End Process",IDC_ENDPROCESS,171,189,69,14
CONTROL "&Show processes from all users",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/en-US.rc b/reactos/base/applications/taskmgr/lang/en-US.rc
index 822092597e7..75e6727f32a 100644
--- a/reactos/base/applications/taskmgr/lang/en-US.rc
+++ b/reactos/base/applications/taskmgr/lang/en-US.rc
@@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&End Process",IDC_ENDPROCESS,171,189,69,14
CONTROL "&Show processes from all users",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/es-ES.rc b/reactos/base/applications/taskmgr/lang/es-ES.rc
index 6472bdb5360..636a9b6a1c0 100644
--- a/reactos/base/applications/taskmgr/lang/es-ES.rc
+++ b/reactos/base/applications/taskmgr/lang/es-ES.rc
@@ -208,7 +208,7 @@ FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT
|
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Finalizar Proceso",IDC_ENDPROCESS,171,189,69,14
CONTROL "&Mostrar Procesos de todos los usuario",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/fr-FR.rc b/reactos/base/applications/taskmgr/lang/fr-FR.rc
index 4df130bac77..41a95c6136f 100644
--- a/reactos/base/applications/taskmgr/lang/fr-FR.rc
+++ b/reactos/base/applications/taskmgr/lang/fr-FR.rc
@@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Terminer le processus",IDC_ENDPROCESS,171,189,71,14
CONTROL "Aff&icher les processus de tous les utilisateurs",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/hu-HU.rc b/reactos/base/applications/taskmgr/lang/hu-HU.rc
index 60f18e16c7f..440a9e5b435 100644
--- a/reactos/base/applications/taskmgr/lang/hu-HU.rc
+++ b/reactos/base/applications/taskmgr/lang/hu-HU.rc
@@ -189,7 +189,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Folyamat befejezse",IDC_ENDPROCESS,171,189,69,14
CONTROL "Minden felhasznl folya&matait jelentse meg",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/id-ID.rc b/reactos/base/applications/taskmgr/lang/id-ID.rc
index 863cab2f51e..64abb279986 100644
--- a/reactos/base/applications/taskmgr/lang/id-ID.rc
+++ b/reactos/base/applications/taskmgr/lang/id-ID.rc
@@ -187,7 +187,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&End Process",IDC_ENDPROCESS,171,189,69,14
CONTROL "&Show processes from all users",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/it-IT.rc b/reactos/base/applications/taskmgr/lang/it-IT.rc
index fc648b074bb..4c25f9e1db5 100644
--- a/reactos/base/applications/taskmgr/lang/it-IT.rc
+++ b/reactos/base/applications/taskmgr/lang/it-IT.rc
@@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Termina Processo",IDC_ENDPROCESS,171,189,69,14
CONTROL "&Mostra i processi di tutti gli utenti",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/ja-JP.rc b/reactos/base/applications/taskmgr/lang/ja-JP.rc
index 89f7fbffcb4..3804a59c569 100644
--- a/reactos/base/applications/taskmgr/lang/ja-JP.rc
+++ b/reactos/base/applications/taskmgr/lang/ja-JP.rc
@@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 9, "MS UI Gothic"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "vZX̏I(&E)",IDC_ENDPROCESS,171,189,69,14
CONTROL "S[U[̃vZX\\(&S)",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/ko-KR.rc b/reactos/base/applications/taskmgr/lang/ko-KR.rc
index 9b84520dab0..6f25adc8f5d 100644
--- a/reactos/base/applications/taskmgr/lang/ko-KR.rc
+++ b/reactos/base/applications/taskmgr/lang/ko-KR.rc
@@ -190,7 +190,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "۾ (&E)",IDC_ENDPROCESS,171,189,69,14
CONTROL " μ ̱(&S)",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/nl-NL.rc b/reactos/base/applications/taskmgr/lang/nl-NL.rc
index d9dbb0c608d..d7b769daf03 100644
--- a/reactos/base/applications/taskmgr/lang/nl-NL.rc
+++ b/reactos/base/applications/taskmgr/lang/nl-NL.rc
@@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Proces beindigen",IDC_ENDPROCESS,171,189,69,14
CONTROL "Processen van &alle gebruikers weergeven",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/no-NO.rc b/reactos/base/applications/taskmgr/lang/no-NO.rc
index c198f517f7a..3344dfc0370 100644
--- a/reactos/base/applications/taskmgr/lang/no-NO.rc
+++ b/reactos/base/applications/taskmgr/lang/no-NO.rc
@@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "Liste2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Avslutt prosess",IDC_ENDPROCESS,171,189,69,14
CONTROL "&Vis prosesser fra alle brukere",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/pl-PL.rc b/reactos/base/applications/taskmgr/lang/pl-PL.rc
index 5580b34b427..92b16c412e7 100644
--- a/reactos/base/applications/taskmgr/lang/pl-PL.rc
+++ b/reactos/base/applications/taskmgr/lang/pl-PL.rc
@@ -193,7 +193,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Zakocz proces",IDC_ENDPROCESS,171,189,69,14
CONTROL "Po&ka procesy wszystkich uytkownikw",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/pt-BR.rc b/reactos/base/applications/taskmgr/lang/pt-BR.rc
index db883b7c2b5..78fc16c17f6 100644
--- a/reactos/base/applications/taskmgr/lang/pt-BR.rc
+++ b/reactos/base/applications/taskmgr/lang/pt-BR.rc
@@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Finalizar processo",IDC_ENDPROCESS,171,189,69,14
CONTROL "&Mostrar processos de todos os usurios",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/ro-RO.rc b/reactos/base/applications/taskmgr/lang/ro-RO.rc
index cfa98a78518..788e987b91f 100644
--- a/reactos/base/applications/taskmgr/lang/ro-RO.rc
+++ b/reactos/base/applications/taskmgr/lang/ro-RO.rc
@@ -4,7 +4,7 @@
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
-#pragma code_page(1250)
+#pragma code_page(65001)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
@@ -14,33 +14,33 @@ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
IDR_TASKMANAGER MENU DISCARDABLE
BEGIN
- POPUP "&Fiier"
+ POPUP "&Fișier"
BEGIN
MENUITEM "&Program nou (Executare...)", ID_FILE_NEW
MENUITEM SEPARATOR
- MENUITEM "I&eire", ID_FILE_EXIT
+ MENUITEM "I&eșire", ID_FILE_EXIT
END
- POPUP "&Opiuni"
+ POPUP "&Opțiuni"
BEGIN
MENUITEM "&Mereu deasupra", ID_OPTIONS_ALWAYSONTOP
, CHECKED
- MENUITEM "&Minimizare cnd se face Salt", ID_OPTIONS_MINIMIZEONUSE
+ MENUITEM "&Minimizare când se face Salt", ID_OPTIONS_MINIMIZEONUSE
, CHECKED
MENUITEM "&Ascundere la minimizare", ID_OPTIONS_HIDEWHENMINIMIZED
, CHECKED
- MENUITEM "&Afiare programe pe 16 bii", ID_OPTIONS_SHOW16BITTASKS
+ MENUITEM "&Afișare programe pe 16 biți", ID_OPTIONS_SHOW16BITTASKS
, CHECKED
END
POPUP "&Vizualizare"
BEGIN
- MENUITEM "&Remprosptare", ID_VIEW_REFRESH
- POPUP "&Vitez de remprosptare"
+ MENUITEM "&Reîmprospătare", ID_VIEW_REFRESH
+ POPUP "&Viteză de reîmprospătare"
BEGIN
- MENUITEM "&Ridicat", ID_VIEW_UPDATESPEED_HIGH
- MENUITEM "&Normal", ID_VIEW_UPDATESPEED_NORMAL
+ MENUITEM "&Ridicată", ID_VIEW_UPDATESPEED_HIGH
+ MENUITEM "&Normală", ID_VIEW_UPDATESPEED_NORMAL
, CHECKED
- MENUITEM "&Mic", ID_VIEW_UPDATESPEED_LOW
- MENUITEM "&Stagnant", ID_VIEW_UPDATESPEED_PAUSED
+ MENUITEM "&Mică", ID_VIEW_UPDATESPEED_LOW
+ MENUITEM "&Stagnantă", ID_VIEW_UPDATESPEED_PAUSED
END
MENUITEM SEPARATOR
@@ -52,36 +52,36 @@ BEGIN
BEGIN
MENUITEM "&Un grafic pentru toate procesoarele", ID_VIEW_CPUHISTORY_ONEGRAPHALL
- MENUITEM "Cte un grafic pentru fiecare procesor", ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU
+ MENUITEM "Câte un grafic pentru fiecare procesor", ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU
, CHECKED
END
- MENUITEM "&Afiare timpi kernel", ID_VIEW_SHOWKERNELTIMES
+ MENUITEM "&Afișare timpi kernel", ID_VIEW_SHOWKERNELTIMES
END
POPUP "&Ferestre"
BEGIN
- MENUITEM "Aranjare orizontal", ID_WINDOWS_TILEHORIZONTALLY
- MENUITEM "Aranjare vertical", ID_WINDOWS_TILEVERTICALLY
+ MENUITEM "Aranjare orizontală", ID_WINDOWS_TILEHORIZONTALLY
+ MENUITEM "Aranjare verticală", ID_WINDOWS_TILEVERTICALLY
MENUITEM "&Minimizare", ID_WINDOWS_MINIMIZE
MENUITEM "Ma&ximizare", ID_WINDOWS_MAXIMIZE
- MENUITEM "&n cascad", ID_WINDOWS_CASCADE
- MENUITEM "&Aducere n prim plan", ID_WINDOWS_BRINGTOFRONT
+ MENUITEM "&În cascadă", ID_WINDOWS_CASCADE
+ MENUITEM "&Aducere în prim plan", ID_WINDOWS_BRINGTOFRONT
END
POPUP "&Ajutor"
BEGIN
MENUITEM "Topici de ajutor", ID_HELP_TOPICS
MENUITEM SEPARATOR
- MENUITEM "&Despre Gestionarul de Activiti", ID_HELP_ABOUT
+ MENUITEM "&Despre Gestionarul de Activități", ID_HELP_ABOUT
END
END
IDR_WINDOWSMENU MENU DISCARDABLE
BEGIN
- MENUITEM "Aranjare orizontal", ID_WINDOWS_TILEHORIZONTALLY
- MENUITEM "Aranjare vertical", ID_WINDOWS_TILEVERTICALLY
+ MENUITEM "Aranjare orizontală", ID_WINDOWS_TILEHORIZONTALLY
+ MENUITEM "Aranjare verticală", ID_WINDOWS_TILEVERTICALLY
MENUITEM "&Minimizare", ID_WINDOWS_MINIMIZE
MENUITEM "Ma&ximizare", ID_WINDOWS_MAXIMIZE
- MENUITEM "&n cascad", ID_WINDOWS_CASCADE
- MENUITEM "&Aducere n prim plan", ID_WINDOWS_BRINGTOFRONT
+ MENUITEM "&În cascadă", ID_WINDOWS_CASCADE
+ MENUITEM "&Aducere în prim plan", ID_WINDOWS_BRINGTOFRONT
END
IDR_APPLICATION_PAGE_CONTEXT1 MENU DISCARDABLE
@@ -101,13 +101,13 @@ BEGIN
POPUP "DUMMY"
BEGIN
MENUITEM "&Salt la", ID_APPLICATION_PAGE_SWITCHTO
- MENUITEM "&Aducere n prin plan", ID_WINDOWS_BRINGTOFRONT
+ MENUITEM "&Aducere în prin plan", ID_WINDOWS_BRINGTOFRONT
MENUITEM SEPARATOR
- MENUITEM "Aranjare orizontal", ID_WINDOWS_TILEHORIZONTALLY
- MENUITEM "Aranjare vertical", ID_WINDOWS_TILEVERTICALLY
+ MENUITEM "Aranjare orizontală", ID_WINDOWS_TILEHORIZONTALLY
+ MENUITEM "Aranjare verticală", ID_WINDOWS_TILEVERTICALLY
MENUITEM "&Minimizare", ID_WINDOWS_MINIMIZE
MENUITEM "Ma&ximizare", ID_WINDOWS_MAXIMIZE
- MENUITEM "&n cascad", ID_WINDOWS_CASCADE
+ MENUITEM "&În cascadă", ID_WINDOWS_CASCADE
MENUITEM SEPARATOR
MENUITEM "&Oprire program", ID_APPLICATION_PAGE_ENDTASK
MENUITEM "&Indicare proces", ID_APPLICATION_PAGE_GOTOPROCESS
@@ -120,7 +120,7 @@ BEGIN
POPUP "DUMMY"
BEGIN
MENUITEM "&Restabilire", ID_RESTORE
- MENUITEM "&nchidere", ID_FILE_EXIT
+ MENUITEM "&Închidere", ID_FILE_EXIT
MENUITEM SEPARATOR
MENUITEM "&Mereu deasupra", ID_OPTIONS_ALWAYSONTOP
END
@@ -141,13 +141,13 @@ BEGIN
MENUITEM "&Mare", ID_PROCESS_PAGE_SETPRIORITY_HIGH
- MENUITEM "&NormalSpreMare", ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL
+ MENUITEM "&NormalăSpreMare", ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL
- MENUITEM "&Normal", ID_PROCESS_PAGE_SETPRIORITY_NORMAL
+ MENUITEM "&Normală", ID_PROCESS_PAGE_SETPRIORITY_NORMAL
- MENUITEM "&NormalSpreMic", ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL
+ MENUITEM "&NormalăSpreMică", ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL
- MENUITEM "&Mic", ID_PROCESS_PAGE_SETPRIORITY_LOW
+ MENUITEM "&Mică", ID_PROCESS_PAGE_SETPRIORITY_LOW
END
MENUITEM "Setare &afinitate", ID_PROCESS_PAGE_SETAFFINITY
@@ -165,7 +165,7 @@ IDD_TASKMGR_DIALOG DIALOGEX DISCARDABLE 0, 0, 264, 246
STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP |
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
WS_THICKFRAME
-CAPTION "Gestionarul de activiti ReactOS"
+CAPTION "Gestionarul de activități ReactOS"
MENU IDR_TASKMANAGER
FONT 8, "MS Shell Dlg"
BEGIN
@@ -180,7 +180,7 @@ BEGIN
LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Program nou",IDC_NEWTASK,187,189,53,14
PUSHBUTTON "&Salt la",IDC_SWITCHTO,131,189,53,14,WS_DISABLED
- PUSHBUTTON "&ncheiere execuie",IDC_ENDTASK,75,189,53,14,WS_DISABLED
+ PUSHBUTTON "&Încheiere execuție",IDC_ENDTASK,75,189,53,14,WS_DISABLED
END
IDD_PROCESS_PAGE DIALOGEX DISCARDABLE 0, 0, 247, 210
@@ -188,10 +188,10 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Oprire proces",IDC_ENDPROCESS,171,189,69,14
- CONTROL "&Afiare procese de la toi utilizatorii",IDC_SHOWALLPROCESSES,
+ CONTROL "&Afișare procese de la toți utilizatorii",IDC_SHOWALLPROCESSES,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,191,111,10
END
@@ -201,10 +201,10 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Uz proc.",IDC_CPU_USAGE_FRAME,5,5,60,54,0,WS_EX_TRANSPARENT
- GROUPBOX "Uz mem.",IDC_MEM_USAGE_FRAME,5,63,60,54,BS_LEFTTEXT, WS_EX_TRANSPARENT
+ GROUPBOX "Uz mem.",IDC_MEM_USAGE_FRAME,5,63,60,54,BS_LEFTTEXT,WS_EX_TRANSPARENT
GROUPBOX "Total",IDC_TOTALS_FRAME,5,122,111,39,0,WS_EX_TRANSPARENT
GROUPBOX "Lucru (K)",IDC_COMMIT_CHARGE_FRAME,5,166,111,39,0,WS_EX_TRANSPARENT
- GROUPBOX "Memorie fizic(K)",IDC_PHYSICAL_MEMORY_FRAME,131,122,111,39,0,WS_EX_TRANSPARENT
+ GROUPBOX "Memorie fizică(K)",IDC_PHYSICAL_MEMORY_FRAME,131,122,111,39,0,WS_EX_TRANSPARENT
GROUPBOX "Memorie kernel (K)",IDC_KERNEL_MEMORY_FRAME,131,166,111,39,0,WS_EX_TRANSPARENT
LTEXT "Handles",IDS_TOTALS_HANDLE_COUNT,12,131,27,8
LTEXT "Threads",IDS_TOTALS_THREAD_COUNT,12,140,27,8
@@ -216,8 +216,8 @@ BEGIN
EDITTEXT IDC_TOTALS_PROCESS_COUNT,65,149,45,8,ES_RIGHT |
ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
LTEXT "Total",IDS_COMMIT_CHARGE_TOTAL,12,175,27,8
- LTEXT "Limit",IDS_COMMIT_CHARGE_LIMIT,12,184,15,8,NOT WS_BORDER
- LTEXT "Vrf",IDS_COMMIT_CHARGE_PEAK,12,193,34,8
+ LTEXT "Limită",IDS_COMMIT_CHARGE_LIMIT,12,184,15,8,NOT WS_BORDER
+ LTEXT "Vârf",IDS_COMMIT_CHARGE_PEAK,12,193,34,8
EDITTEXT IDC_COMMIT_CHARGE_TOTAL,65,174,45,8,ES_RIGHT |
ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
EDITTEXT IDC_COMMIT_CHARGE_LIMIT,65,184,45,8,ES_RIGHT |
@@ -233,7 +233,7 @@ BEGIN
ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
EDITTEXT IDC_PHYSICAL_MEMORY_SYSTEM_CACHE,185,149,48,8,ES_RIGHT |
ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
- LTEXT "Total",IDS_KERNEL_MEMORY_TOTAL,137,174,27,8
+ LTEXT "Totală",IDS_KERNEL_MEMORY_TOTAL,137,174,27,8
LTEXT "Paged",IDS_KERNEL_MEMORY_PAGED,137,184,21,8
LTEXT "Nonpaged",IDS_KERNEL_MEMORY_NONPAGED,137,193,34,8
EDITTEXT IDC_KERNEL_MEMORY_TOTAL,185,174,48,8,ES_RIGHT |
@@ -244,10 +244,8 @@ BEGIN
ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Istoric uz procesor",IDC_CPU_USAGE_HISTORY_FRAME,74,5,168,54,0,WS_EX_TRANSPARENT
GROUPBOX "Istoric uz memorie",IDC_MEMORY_USAGE_HISTORY_FRAME,74,63,168,54,0,WS_EX_TRANSPARENT
- PUSHBUTTON "Afiaj uz procesor",IDC_CPU_USAGE_GRAPH,12,17,47,37,NOT WS_TABSTOP,
- WS_EX_CLIENTEDGE
- PUSHBUTTON "Afiaj uz memorie",IDC_MEM_USAGE_GRAPH,12,75,47,37,NOT WS_TABSTOP,
- WS_EX_CLIENTEDGE
+ PUSHBUTTON "Afișaj uz procesor",IDC_CPU_USAGE_GRAPH,12,17,47,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE
+ PUSHBUTTON "Afișaj uz memorie",IDC_MEM_USAGE_GRAPH,12,75,47,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE
PUSHBUTTON "Istoric uz procesor",IDC_CPU_USAGE_HISTORY_GRAPH,81,17,
153,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE
PUSHBUTTON "Istoric uz memorie",IDC_MEM_USAGE_HISTORY_GRAPH,81,75,
@@ -262,7 +260,7 @@ BEGIN
CONTROL "List2",IDC_DEBUG_CHANNELS_LIST,"SysListView32",LVS_REPORT |
LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP |
LVS_SORTASCENDING,7,7,233,177
- PUSHBUTTON "nchidere",IDOK,171,189,69,14
+ PUSHBUTTON "Închidere",IDOK,171,189,69,14
END
IDD_AFFINITY_DIALOG DIALOGEX DISCARDABLE 0, 0, 231, 154
@@ -272,7 +270,7 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "OK",IDOK,120,133,50,14
PUSHBUTTON "Anulare",IDCANCEL,174,133,50,14
- LTEXT "Aceast setare controleaz repartiia calculelor efectuate de fiecare procesor n parte.",
+ LTEXT "Această setare controlează repartiția calculelor efectuate de fiecare procesor în parte.",
IDC_STATIC,5,5,220,16
CONTROL "CPU 0",IDC_CPU0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
11,28,37,10
@@ -342,62 +340,62 @@ END
IDD_COLUMNS_DIALOG DIALOGEX DISCARDABLE 0, 0, 195, 199
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Alegei coloanele"
+CAPTION "Alegeți coloanele"
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "OK",IDOK,84,178,50,14
PUSHBUTTON "Anulare",IDCANCEL,138,178,50,14
- LTEXT "Alegei coloanele care vor aprea n fila Procese din Gestionarul de activiti.",
+ LTEXT "Alegeți coloanele care vor apărea în fila Procese din Gestionarul de activități.",
IDC_STATIC,7,7,181,17
CONTROL "&Nume imagine",IDC_IMAGENAME,"Button",BS_AUTOCHECKBOX |
WS_DISABLED | WS_TABSTOP,7,28,56,10
CONTROL "&PID (Identificator proces)",IDC_PID,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,7,39,88,10
- CONTROL "&Uz procesor",IDC_CPUUSAGE,"Button",BS_AUTOCHECKBOX |
+ CONTROL "&Utilizare CPU",IDC_CPUUSAGE,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,50,53,10
- CONTROL "T&imp procesor",IDC_CPUTIME,"Button",BS_AUTOCHECKBOX |
+ CONTROL "T&imp CPU",IDC_CPUTIME,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,61,48,10
- CONTROL "&Uz memorie",IDC_MEMORYUSAGE,"Button",BS_AUTOCHECKBOX |
+ CONTROL "&Utilizare memorie",IDC_MEMORYUSAGE,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,72,63,10
- CONTROL "&Delta uz memorie",IDC_MEMORYUSAGEDELTA,"Button",
+ CONTROL "&Delta utilizare memorie",IDC_MEMORYUSAGEDELTA,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,7,83,82,10
- CONTROL "V&rf uz memorie",IDC_PEAKMEMORYUSAGE,"Button",
+ CONTROL "V&ârf utilizare memorie",IDC_PEAKMEMORYUSAGE,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,7,94,82,10
- CONTROL "&Greeli paginare",IDC_PAGEFAULTS,"Button",BS_AUTOCHECKBOX |
+ CONTROL "&Erori pagină",IDC_PAGEFAULTS,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,105,53,10
- CONTROL "&Obiecte USER",IDC_USEROBJECTS,"Button",BS_AUTOCHECKBOX |
+ CONTROL "&Obiecte utilizator",IDC_USEROBJECTS,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,116,62,10
CONTROL "Citiri I/O",IDC_IOREADS,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,127,49,10
- CONTROL "Octei citiri I/O",IDC_IOREADBYTES,"Button",
+ CONTROL "Octeți citire I/O",IDC_IOREADBYTES,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,7,138,65,10
CONTROL "&ID sesiune",IDC_SESSIONID,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,149,50,10
CONTROL "Nume utilizator",IDC_USERNAME,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,160,51,10
- CONTROL "Delta g&reeli paginare",IDC_PAGEFAULTSDELTA,"Button",
+ CONTROL "Delta erori pagină",IDC_PAGEFAULTSDELTA,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,107,28,72,10
- CONTROL "&Mrime memorie virtual",IDC_VIRTUALMEMORYSIZE,"Button",
+ CONTROL "&Mărime memorie virtuală",IDC_VIRTUALMEMORYSIZE,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,107,39,77,10
- CONTROL "Pool paginat",IDC_PAGEDPOOL,"Button",BS_AUTOCHECKBOX |
+ CONTROL "Rezervă paginată",IDC_PAGEDPOOL,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,107,50,53,10
- CONTROL "Pool nepaginat",IDC_NONPAGEDPOOL,"Button",
+ CONTROL "Rezervă nepaginată",IDC_NONPAGEDPOOL,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,107,61,67,10
- CONTROL "Prioritate de baz",IDC_BASEPRIORITY,"Button",
+ CONTROL "Prioritate de bază",IDC_BASEPRIORITY,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,107,72,55,10
- CONTROL "&Numr handle-uri",IDC_HANDLECOUNT,"Button",BS_AUTOCHECKBOX |
+ CONTROL "&Număr identificatori",IDC_HANDLECOUNT,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,107,83,59,10
- CONTROL "&Numr subprocese",IDC_THREADCOUNT,"Button",BS_AUTOCHECKBOX |
+ CONTROL "&Număr subprocese",IDC_THREADCOUNT,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,107,94,59,10
CONTROL "Obiecte GDI",IDC_GDIOBJECTS,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,107,105,55,10
CONTROL "Scrieri I/O",IDC_IOWRITES,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,107,116,49,10
- CONTROL "Octei scrieri I/O",IDC_IOWRITEBYTES,"Button",
+ CONTROL "Octeți scriere I/O",IDC_IOWRITEBYTES,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,107,127,65,10
- CONTROL "Altele I/O",IDC_IOOTHER,"Button",BS_AUTOCHECKBOX |
+ CONTROL "Alte I/O",IDC_IOOTHER,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,107,138,46,10
- CONTROL "Octei alte I/O",IDC_IOOTHERBYTES,"Button",
+ CONTROL "Octeți alte I/O",IDC_IOOTHERBYTES,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,107,149,65,10
END
@@ -522,109 +520,109 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_APP_TITLE "Gestionar de activiti"
- IDC_TASKMGR "Gestoinar de activiti"
+ IDS_APP_TITLE "Gestionar de activități"
+ IDC_TASKMGR "Gestoinar de activități"
IDS_IDLE_PROCESS "Proces sistem inactiv"
END
STRINGTABLE DISCARDABLE
BEGIN
- ID_FILE_NEW "Pornete un nou program"
- ID_OPTIONS_ALWAYSONTOP "Gestionarul rmne deasupra celorlaltor ferestre pn cnd e minimizat."
+ ID_FILE_NEW "Pornește un nou program"
+ ID_OPTIONS_ALWAYSONTOP "Gestionarul rămâne deasupra celorlaltor ferestre până când e minimizat."
ID_OPTIONS_MINIMIZEONUSE
- "Gestionarul se minimizeaz automat cnd se face un salt la o aplicaie."
- ID_OPTIONS_HIDEWHENMINIMIZED "Ascunde permanent Gestionarul cnd acesta se minimizeaz."
- ID_VIEW_REFRESH "Foreaz Gestionarul s se actualizeze acum, indiferent de setrile de vitez."
- ID_VIEW_LARGE "Afieaz aplicaii folosind pictograme mari"
- ID_VIEW_SMALL "Afieaz aplicaii folosind pictograme mici"
- ID_VIEW_DETAILS "Afieaz informaii despre fiecare aplicaie"
- ID_VIEW_UPDATESPEED_HIGH "Actualizeaz fereastra de dou ori pe secund"
- ID_VIEW_UPDATESPEED_NORMAL "Actualizeaz fereastra o dat la dou secunde"
- ID_VIEW_UPDATESPEED_LOW "Actualizeaz fereastra o dat la patru secunde"
+ "Gestionarul se minimizează automat când se face un salt la o aplicație."
+ ID_OPTIONS_HIDEWHENMINIMIZED "Ascunde permanent Gestionarul când acesta se minimizează."
+ ID_VIEW_REFRESH "Forțează Gestionarul să se actualizeze acum, indiferent de setările de viteză."
+ ID_VIEW_LARGE "Afișează aplicații folosind pictograme mari"
+ ID_VIEW_SMALL "Afișează aplicații folosind pictograme mici"
+ ID_VIEW_DETAILS "Afișează informații despre fiecare aplicație"
+ ID_VIEW_UPDATESPEED_HIGH "Actualizează fereastra de două ori pe secundă"
+ ID_VIEW_UPDATESPEED_NORMAL "Actualizează fereastra o dată la două secunde"
+ ID_VIEW_UPDATESPEED_LOW "Actualizează fereastra o dată la patru secunde"
END
STRINGTABLE DISCARDABLE
BEGIN
- ID_VIEW_UPDATESPEED_PAUSED "Nu actualizeaz automat"
+ ID_VIEW_UPDATESPEED_PAUSED "Nu actualizează automat"
ID_WINDOWS_TILEHORIZONTALLY
- "Aranjeaz ferestrele orizontal pe ecran"
- ID_WINDOWS_TILEVERTICALLY "Aranjeaz ferestrele vertical pe ecran"
- ID_WINDOWS_MINIMIZE "Minimizaz ferestrele"
- ID_WINDOWS_MAXIMIZE "Maximizeaz ferestrele"
- ID_WINDOWS_CASCADE "Aranjeaz ferestrele astfel nct barele de titlu sunt n cascad"
- ID_WINDOWS_BRINGTOFRONT "Aduce fereastra n prin plan, fr a o activa"
- ID_HELP_TOPICS "Afieaz topicile de ajutor ale Gestionarului"
- ID_HELP_ABOUT "Afieaz informaii despre program, versiune i drepturi de autor."
- ID_FILE_EXIT "nchide Gestionarul de aplicaii"
+ "Aranjează ferestrele orizontal pe ecran"
+ ID_WINDOWS_TILEVERTICALLY "Aranjează ferestrele vertical pe ecran"
+ ID_WINDOWS_MINIMIZE "Minimizază ferestrele"
+ ID_WINDOWS_MAXIMIZE "Maximizează ferestrele"
+ ID_WINDOWS_CASCADE "Aranjează ferestrele astfel încât barele de titlu sunt în cascadă"
+ ID_WINDOWS_BRINGTOFRONT "Aduce fereastra în prin plan, fără a o activa"
+ ID_HELP_TOPICS "Afișează topicile de ajutor ale Gestionarului"
+ ID_HELP_ABOUT "Afișează informații despre program, versiune și drepturi de autor."
+ ID_FILE_EXIT "Închide Gestionarul de aplicații"
ID_OPTIONS_SHOW16BITTASKS
- "Afieaz aplicaiile pe 16 bii care ruleaz sub mediul ntvdm.exe"
- ID_VIEW_SELECTCOLUMNS "V permite s selectai coloanele ce vor fi afiate n fila Procese"
- ID_VIEW_SHOWKERNELTIMES "Afieaz timpi kernel n graficele de performan"
+ "Afișează aplicațiile pe 16 biți care rulează sub mediul ntvdm.exe"
+ ID_VIEW_SELECTCOLUMNS "Vă permite să selectați coloanele ce vor fi afișate în fila Procese"
+ ID_VIEW_SHOWKERNELTIMES "Afișează timpi kernel în graficele de performanță"
ID_VIEW_CPUHISTORY_ONEGRAPHALL
- "Folosete un singur grafic pentru toate procesoarele"
- ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU "Folosete cte un grafic pentru fiecare procesor"
+ "Folosește un singur grafic pentru toate procesoarele"
+ ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU "Folosește câte un grafic pentru fiecare procesor"
ID_APPLICATION_PAGE_SWITCHTO
- "Aduce o fereastra unei aplicaii n prin plan, activnd-o."
+ "Aduce o fereastra unei aplicații în prin plan, activând-o."
END
STRINGTABLE DISCARDABLE
BEGIN
- ID_ENDTASK "Anun aplicaia s s se nchid."
- ID_GOTOPROCESS "Arat procesul aplicaiei selectate."
- ID_RESTORE "Restabilete Gestionarul din starea ascuns."
- ID_PROCESS_PAGE_ENDPROCESS "Elimin procesul din sistem."
+ ID_ENDTASK "Anunță aplicația să să se închidă."
+ ID_GOTOPROCESS "Arată procesul aplicației selectate."
+ ID_RESTORE "Restabilește Gestionarul din starea ascunsă."
+ ID_PROCESS_PAGE_ENDPROCESS "Elimină procesul din sistem."
ID_PROCESS_PAGE_ENDPROCESSTREE
- "Elimin procesul i toate procesele pornite de acesta."
- ID_PROCESS_PAGE_DEBUG "Ataeaz aplicaia de deparare de acest proces."
+ "Elimină procesul și toate procesele pornite de acesta."
+ ID_PROCESS_PAGE_DEBUG "Atașează aplicația de deparare de acest proces."
ID_PROCESS_PAGE_SETAFFINITY
- "Controleaz pe ce procesoare va putea rula acest proces."
+ "Controlează pe ce procesoare va putea rula acest proces."
ID_PROCESS_PAGE_SETPRIORITY_REALTIME
- "Seteaz prioritatea"
- ID_PROCESS_PAGE_SETPRIORITY_HIGH "Seteaz prioritatea"
+ "Setează prioritatea"
+ ID_PROCESS_PAGE_SETPRIORITY_HIGH "Setează prioritatea"
ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL
- "Seteaz prioritatea"
+ "Setează prioritatea"
ID_PROCESS_PAGE_SETPRIORITY_NORMAL
- "Seteaz prioritatea"
+ "Setează prioritatea"
ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL
- "Seteaz prioritatea"
- ID_PROCESS_PAGE_SETPRIORITY_LOW "Seteaz prioritatea"
+ "Setează prioritatea"
+ ID_PROCESS_PAGE_SETPRIORITY_LOW "Setează prioritatea"
END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_TAB_APPS "Aplicaii"
+ IDS_TAB_APPS "Aplicații"
IDS_TAB_PROCESSES "Procese"
- IDS_TAB_PERFORMANCE "Performan"
- IDS_TAB_TASK "Aplicaie"
- IDS_TAB_STATUS "Staare"
+ IDS_TAB_PERFORMANCE "Performanță"
+ IDS_TAB_TASK "Aplicație"
+ IDS_TAB_STATUS "Stare"
IDS_TAB_IMAGENAME "Nume imagine"
IDS_TAB_PID "PID"
IDS_TAB_USERNAME "Nume utilizator"
IDS_TAB_SESSIONID "ID sesiune"
IDS_TAB_CPU "CPU"
IDS_TAB_CPUTIME "Timp CPU"
- IDS_TAB_MEMUSAGE "Uz mem"
- IDS_TAB_PEAKMEMUSAGE "Vrf uz mem"
- IDS_TAB_MEMDELTA "Delta mem"
- IDS_TAB_PAGEFAULT "PF"
- IDS_TAB_PFDELTA "Delta PF"
- IDS_TAB_VMSIZE "Mrime VM"
- IDS_TAB_PAGEDPOOL "Pool paginat"
- IDS_TAB_NPPOOL "Pool nepaginat"
+ IDS_TAB_MEMUSAGE "Utilizare memorie"
+ IDS_TAB_PEAKMEMUSAGE "Vârf utilizare memorie"
+ IDS_TAB_MEMDELTA "Delta memorie"
+ IDS_TAB_PAGEFAULT "FP"
+ IDS_TAB_PFDELTA "Delta FP"
+ IDS_TAB_VMSIZE "Mărime VM"
+ IDS_TAB_PAGEDPOOL "Rezervă paginată"
+ IDS_TAB_NPPOOL "Rezervă nepaginată"
IDS_TAB_BASEPRI "Prioritate"
- IDS_TAB_HANDLES "Handles"
- IDS_TAB_THREADS "Threads"
- IDS_TAB_USERPBJECTS "Obiecte USER"
- IDS_TAB_GDIOBJECTS "Obiect GDI"
+ IDS_TAB_HANDLES "Identificatoare"
+ IDS_TAB_THREADS "Subprocese"
+ IDS_TAB_USERPBJECTS "Obiecte utilizator"
+ IDS_TAB_GDIOBJECTS "Obiecte GDI"
IDS_TAB_IOREADS "Citiri I/O"
IDS_TAB_IOWRITES "Scrieri I/O"
IDS_TAB_IOOTHER "Alte I/O"
- IDS_TAB_IOREADBYTES "Octei I/O citii"
- IDS_TAB_IOWRITESBYTES "Octei I/O scrii"
- IDS_TAB_IOOTHERBYTES "Octei I/O (altele)"
+ IDS_TAB_IOREADBYTES "Octeți I/O citiți"
+ IDS_TAB_IOWRITESBYTES "Octeți I/O scriși"
+ IDS_TAB_IOOTHERBYTES "Octeți I/O (altele)"
IDS_MENU_SELECTCOLUMNS "&Alegere coloane..."
- IDS_MENU_16BITTASK "&Afiare aplicaii 16-bii"
+ IDS_MENU_16BITTASK "&Afișare aplicații 16-biți"
IDS_MENU_WINDOWS "&Ferestre"
IDS_MENU_LARGEICONS "Pictograme mari"
IDS_MENU_SMALLICONS "Pictograme mici"
@@ -632,25 +630,25 @@ BEGIN
IDS_MENU_ONEGRAPHALLCPUS "&Un grafic pt toate procesoarele"
IDS_MENU_ONEGRAPHPERCPU "Un grafic pe procesor"
IDS_MENU_CPUHISTORY "&Istoric CPU"
- IDS_MENU_SHOWKERNELTIMES "&Afiare timpi kernel"
- IDS_CREATENEWTASK "Creare activitate nou"
- IDS_CREATENEWTASK_DESC "Scriei numele unui program, dosar, document sau pagin de web iar Gestionarul o va deschide imediat."
+ IDS_MENU_SHOWKERNELTIMES "&Afișare timpi kernel"
+ IDS_CREATENEWTASK "Creare activitate nouă"
+ IDS_CREATENEWTASK_DESC "Scrieți numele unui program, dosar, document sau pagină de web iar Gestionarul o va deschide imediat."
IDS_MSG_ACCESSPROCESSAFF "Nu se poate seta sau accesa afinitatea."
- IDS_MSG_PROCESSONEPRO "Procesul trebuie s aib o afinitate de cel puin un procesor."
- IDS_MSG_INVALIDOPTION "Opiune invalid"
+ IDS_MSG_PROCESSONEPRO "Procesul trebuie să aibă o afinitate de cel puțin un procesor."
+ IDS_MSG_INVALIDOPTION "Opțiune invalidă"
IDS_MSG_UNABLEDEBUGPROCESS "Nu se poate depana procesul"
- IDS_MSG_WARNINGDEBUG "AVERTISMENT: Procesul de depanare poate duce la pierderi de date.\nSigur vrei s ataai aplicaia de depanare?"
- IDS_MSG_TASKMGRWARNING "Avertisemnt Gestionar de Activiti"
- IDS_MSG_WARNINGTERMINATING "AVERTISMENT: Oprirea forat a unui proces poate duce la pierderi\nde date sau la instabilitatea sistemului. \nProcesului nu i va fi permis s i salveze starea\nsau datele nainte s fie oprit. Sigur vrei s \ndistrugei procesul?"
+ IDS_MSG_WARNINGDEBUG "AVERTISMENT: Procesul de depanare poate duce la pierderi de date.\nSigur vreți să atașați aplicația de depanare?"
+ IDS_MSG_TASKMGRWARNING "Avertisemnt Gestionar de Activități"
+ IDS_MSG_WARNINGTERMINATING "AVERTISMENT: Oprirea forțată a unui proces poate duce la pierderi\nde date sau la instabilitatea sistemului. \nProcesului nu îi va fi permis să își salveze starea\nsau datele înainte să fie oprit. Sigur vreți să \ndistrugeți procesul?"
IDS_MSG_UNABLETERMINATEPRO "Nu se poate opri procesul"
IDS_MSG_UNABLECHANGEPRIORITY "Nu se poate schimba prioritatea"
- IDS_MSG_WARNINGCHANGEPRIORITY "AVERTISMENT: Schimbarea prioritii poate duce la efecte precum\ninstabilitatea sistemului. Sigur\n vrei s schimbai prioritatea procesului?"
- IDS_MSG_TRAYICONCPUUSAGE "Uz procesor: %d%%"
- IDS_STATUS_MEMUSAGE "Uz mem: %dK / %dK"
- IDS_STATUS_CPUUSAGE "Uz CPU: %3d%%"
+ IDS_MSG_WARNINGCHANGEPRIORITY "AVERTISMENT: Schimbarea priorității poate duce la efecte precum\ninstabilitatea sistemului. Sigur\n vreți să schimbați prioritatea procesului?"
+ IDS_MSG_TRAYICONCPUUSAGE "Utilizare procesor: %d%%"
+ IDS_STATUS_MEMUSAGE "Utilizare memorie: %dK / %dK"
+ IDS_STATUS_CPUUSAGE "Utilizare CPU: %3d%%"
IDS_STATUS_PROCESSES "Procese: %d"
- IDS_Not_Responding "Nu Rspunde"
- IDS_Running "Ruleaz"
+ IDS_Not_Responding "Nu Răspunde"
+ IDS_Running "Rulează"
END
diff --git a/reactos/base/applications/taskmgr/lang/ru-RU.rc b/reactos/base/applications/taskmgr/lang/ru-RU.rc
index d32bc3ae851..7023ff51e76 100644
--- a/reactos/base/applications/taskmgr/lang/ru-RU.rc
+++ b/reactos/base/applications/taskmgr/lang/ru-RU.rc
@@ -187,7 +187,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "& ",IDC_ENDPROCESS,162,189,79,14
CONTROL "& ",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/sk-SK.rc b/reactos/base/applications/taskmgr/lang/sk-SK.rc
index bed80a47059..3d3b4fc3775 100644
--- a/reactos/base/applications/taskmgr/lang/sk-SK.rc
+++ b/reactos/base/applications/taskmgr/lang/sk-SK.rc
@@ -187,7 +187,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Ukoni proces",IDC_ENDPROCESS,171,189,69,14
CONTROL "&Zobrazi procesy vetkch pouvateov",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/sv-SE.rc b/reactos/base/applications/taskmgr/lang/sv-SE.rc
index 3e1d87d3916..d51db891649 100644
--- a/reactos/base/applications/taskmgr/lang/sv-SE.rc
+++ b/reactos/base/applications/taskmgr/lang/sv-SE.rc
@@ -205,7 +205,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "&Avsluta process",IDC_ENDPROCESS,171,189,69,14
CONTROL "&Visa processer frn alla anvndare",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/uk-UA.rc b/reactos/base/applications/taskmgr/lang/uk-UA.rc
index 3e1a84bed50..41737ad8ab8 100644
--- a/reactos/base/applications/taskmgr/lang/uk-UA.rc
+++ b/reactos/base/applications/taskmgr/lang/uk-UA.rc
@@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "& ",IDC_ENDPROCESS,171,189,69,14
CONTROL "&³ ",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/lang/zh-CN.rc b/reactos/base/applications/taskmgr/lang/zh-CN.rc
index 7068ffbb14a..bb62579df77 100644
--- a/reactos/base/applications/taskmgr/lang/zh-CN.rc
+++ b/reactos/base/applications/taskmgr/lang/zh-CN.rc
@@ -196,7 +196,7 @@ STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_BORDER | WS_TABSTOP,7,7,233,177
PUSHBUTTON "(&E)",IDC_ENDPROCESS,171,189,69,14
CONTROL "ʾûĽ(&S)",IDC_SHOWALLPROCESSES,
diff --git a/reactos/base/applications/taskmgr/perfdata.c b/reactos/base/applications/taskmgr/perfdata.c
index c8176a4ee5c..f9f52bf966f 100644
--- a/reactos/base/applications/taskmgr/perfdata.c
+++ b/reactos/base/applications/taskmgr/perfdata.c
@@ -901,3 +901,18 @@ ULONG PerfDataGetTotalThreadCount(void)
return ThreadCount;
}
+
+BOOL PerfDataGet(ULONG Index, PPERFDATA *lppData)
+{
+ BOOL bSuccessful = FALSE;
+
+ EnterCriticalSection(&PerfDataCriticalSection);
+ if (Index < ProcessCount)
+ {
+ *lppData = pPerfData + Index;
+ bSuccessful = TRUE;
+ }
+ LeaveCriticalSection(&PerfDataCriticalSection);
+ return bSuccessful;
+}
+
diff --git a/reactos/base/applications/taskmgr/perfdata.h b/reactos/base/applications/taskmgr/perfdata.h
index de26d6acf4f..6b31394a36d 100644
--- a/reactos/base/applications/taskmgr/perfdata.h
+++ b/reactos/base/applications/taskmgr/perfdata.h
@@ -60,6 +60,7 @@ BOOL PerfDataInitialize(void);
void PerfDataUninitialize(void);
void PerfDataRefresh(void);
+BOOL PerfDataGet(ULONG Index, PPERFDATA *lppData);
ULONG PerfDataGetProcessCount(void);
ULONG PerfDataGetProcessorUsage(void);
ULONG PerfDataGetProcessorSystemUsage(void);
diff --git a/reactos/base/applications/taskmgr/priority.c b/reactos/base/applications/taskmgr/priority.c
index 243dd511040..cd1860078f2 100644
--- a/reactos/base/applications/taskmgr/priority.c
+++ b/reactos/base/applications/taskmgr/priority.c
@@ -25,30 +25,14 @@
void DoSetPriority(DWORD priority)
{
- LVITEM lvitem;
- ULONG Index;
DWORD dwProcessId;
HANDLE hProcess;
WCHAR szText[260];
WCHAR szTitle[256];
- for (Index=0; Index<(ULONG)ListView_GetItemCount(hProcessPageListCtrl); Index++)
- {
- ZeroMemory(&lvitem, sizeof(LVITEM));
+ dwProcessId = GetSelectedProcessId();
- lvitem.mask = LVIF_STATE;
- lvitem.stateMask = LVIS_SELECTED;
- lvitem.iItem = Index;
-
- (void)ListView_GetItem(hProcessPageListCtrl, &lvitem);
-
- if (lvitem.state & LVIS_SELECTED)
- break;
- }
-
- dwProcessId = PerfDataGetProcessId(Index);
-
- if ((ListView_GetSelectedCount(hProcessPageListCtrl) != 1) || (dwProcessId == 0))
+ if (dwProcessId == 0)
return;
LoadStringW(hInst, IDS_MSG_TASKMGRWARNING, szTitle, 256);
diff --git a/reactos/base/applications/taskmgr/procpage.c b/reactos/base/applications/taskmgr/procpage.c
index bf1ec452923..d2f59fea9b8 100644
--- a/reactos/base/applications/taskmgr/procpage.c
+++ b/reactos/base/applications/taskmgr/procpage.c
@@ -4,6 +4,7 @@
* procpage.c
*
* Copyright (C) 1999 - 2001 Brian Palmer
+ * Copyright (C) 2009 Maxime Vernier
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,6 +23,14 @@
#include
+#define CMP(x1, x2)\
+ (x1 < x2 ? -1 : (x1 > x2 ? 1 : 0))
+
+typedef struct
+{
+ ULONG Index;
+} PROCESS_PAGE_LIST_ITEM, *LPPROCESS_PAGE_LIST_ITEM;
+
HWND hProcessPage; /* Process List Property Page */
HWND hProcessPageListCtrl; /* Process ListCtrl Window */
@@ -31,14 +40,41 @@ HWND hProcessPageShowAllProcessesButton;/* Process Show All Processes checkbox *
static int nProcessPageWidth;
static int nProcessPageHeight;
-
static HANDLE hProcessPageEvent = NULL; /* When this event becomes signaled then we refresh the process list */
+int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
+void AddProcess(ULONG Index);
+void UpdateProcesses();
+void gethmsfromlargeint(LARGE_INTEGER largeint, DWORD *dwHours, DWORD *dwMinutes, DWORD *dwSeconds);
void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam);
void CommaSeparateNumberString(LPWSTR strNumber, int nMaxCount);
void ProcessPageShowContextMenu(DWORD dwProcessId);
+BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCount);
DWORD WINAPI ProcessPageRefreshThread(void *lpParameter);
+DWORD GetSelectedProcessId(void)
+{
+ int Index;
+ LVITEM lvitem;
+
+ if(ListView_GetSelectedCount(hProcessPageListCtrl) == 1)
+ {
+ Index = ListView_GetSelectionMark(hProcessPageListCtrl);
+
+ memset(&lvitem, 0, sizeof(LVITEM));
+
+ lvitem.mask = LVIF_PARAM;
+ lvitem.iItem = Index;
+
+ (void)ListView_GetItem(hProcessPageListCtrl, &lvitem);
+
+ if (lvitem.lParam)
+ return PerfDataGetProcessId(((LPPROCESS_PAGE_LIST_ITEM)lvitem.lParam)->Index);
+ }
+
+ return 0;
+}
+
INT_PTR CALLBACK
ProcessPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
@@ -155,11 +191,9 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam)
LPNMLISTVIEW pnmv;
NMLVDISPINFO* pnmdi;
LPNMHEADER pnmhdr;
- LVITEM lvitem;
ULONG Index;
ULONG ColumnIndex;
- IO_COUNTERS iocounters;
- LARGE_INTEGER time;
+ LPPROCESS_PAGE_LIST_ITEM pData;
idctrl = (int) wParam;
pnmh = (LPNMHDR) lParam;
@@ -182,172 +216,17 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam)
if (!(pnmdi->item.mask & LVIF_TEXT))
break;
+ pData = (LPPROCESS_PAGE_LIST_ITEM)pnmdi->item.lParam;
+ Index = pData->Index;
ColumnIndex = pnmdi->item.iSubItem;
- Index = pnmdi->item.iItem;
- if (ColumnDataHints[ColumnIndex] == COLUMN_IMAGENAME)
- PerfDataGetImageName(Index, pnmdi->item.pszText, pnmdi->item.cchTextMax);
- if (ColumnDataHints[ColumnIndex] == COLUMN_PID)
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetProcessId(Index));
- if (ColumnDataHints[ColumnIndex] == COLUMN_USERNAME)
- PerfDataGetUserName(Index, pnmdi->item.pszText, pnmdi->item.cchTextMax);
- if (ColumnDataHints[ColumnIndex] == COLUMN_SESSIONID)
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetSessionId(Index));
- if (ColumnDataHints[ColumnIndex] == COLUMN_CPUUSAGE)
- wsprintfW(pnmdi->item.pszText, L"%02d", PerfDataGetCPUUsage(Index));
- if (ColumnDataHints[ColumnIndex] == COLUMN_CPUTIME)
- {
- DWORD dwHours;
- DWORD dwMinutes;
- DWORD dwSeconds;
-
- time = PerfDataGetCPUTime(Index);
-#ifdef _MSC_VER
- dwHours = (DWORD)(time.QuadPart / 36000000000L);
- dwMinutes = (DWORD)((time.QuadPart % 36000000000L) / 600000000L);
- dwSeconds = (DWORD)(((time.QuadPart % 36000000000L) % 600000000L) / 10000000L);
-#else
- dwHours = (DWORD)(time.QuadPart / 36000000000LL);
- dwMinutes = (DWORD)((time.QuadPart % 36000000000LL) / 600000000LL);
- dwSeconds = (DWORD)(((time.QuadPart % 36000000000LL) % 600000000LL) / 10000000LL);
-#endif
- wsprintfW(pnmdi->item.pszText, L"%d:%02d:%02d", dwHours, dwMinutes, dwSeconds);
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGE)
- {
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetWorkingSetSizeBytes(Index) / 1024);
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- wcscat(pnmdi->item.pszText, L" K");
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_PEAKMEMORYUSAGE)
- {
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetPeakWorkingSetSizeBytes(Index) / 1024);
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- wcscat(pnmdi->item.pszText, L" K");
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGEDELTA)
- {
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetWorkingSetSizeDelta(Index) / 1024);
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- wcscat(pnmdi->item.pszText, L" K");
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTS)
- {
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetPageFaultCount(Index));
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTSDELTA)
- {
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetPageFaultCountDelta(Index));
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_VIRTUALMEMORYSIZE)
- {
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetVirtualMemorySizeBytes(Index) / 1024);
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- wcscat(pnmdi->item.pszText, L" K");
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEDPOOL)
- {
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetPagedPoolUsagePages(Index) / 1024);
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- wcscat(pnmdi->item.pszText, L" K");
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_NONPAGEDPOOL)
- {
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetNonPagedPoolUsagePages(Index) / 1024);
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- wcscat(pnmdi->item.pszText, L" K");
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_BASEPRIORITY)
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetBasePriority(Index));
- if (ColumnDataHints[ColumnIndex] == COLUMN_HANDLECOUNT)
- {
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetHandleCount(Index));
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_THREADCOUNT)
- {
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetThreadCount(Index));
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_USEROBJECTS)
- {
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetUSERObjectCount(Index));
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_GDIOBJECTS)
- {
- wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetGDIObjectCount(Index));
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADS)
- {
- PerfDataGetIOCounters(Index, &iocounters);
- /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.ReadOperationCount); */
- _ui64tow(iocounters.ReadOperationCount, pnmdi->item.pszText, 10);
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITES)
- {
- PerfDataGetIOCounters(Index, &iocounters);
- /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.WriteOperationCount); */
- _ui64tow(iocounters.WriteOperationCount, pnmdi->item.pszText, 10);
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHER)
- {
- PerfDataGetIOCounters(Index, &iocounters);
- /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.OtherOperationCount); */
- _ui64tow(iocounters.OtherOperationCount, pnmdi->item.pszText, 10);
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADBYTES)
- {
- PerfDataGetIOCounters(Index, &iocounters);
- /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.ReadTransferCount); */
- _ui64tow(iocounters.ReadTransferCount, pnmdi->item.pszText, 10);
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITEBYTES)
- {
- PerfDataGetIOCounters(Index, &iocounters);
- /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.WriteTransferCount); */
- _ui64tow(iocounters.WriteTransferCount, pnmdi->item.pszText, 10);
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- }
- if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHERBYTES)
- {
- PerfDataGetIOCounters(Index, &iocounters);
- /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.OtherTransferCount); */
- _ui64tow(iocounters.OtherTransferCount, pnmdi->item.pszText, 10);
- CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax);
- }
+ PerfDataGetText(Index, ColumnIndex, pnmdi->item.pszText, pnmdi->item.cchTextMax);
break;
case NM_RCLICK:
- for (Index=0; Index<(ULONG)ListView_GetItemCount(hProcessPageListCtrl); Index++)
- {
- memset(&lvitem, 0, sizeof(LVITEM));
-
- lvitem.mask = LVIF_STATE;
- lvitem.stateMask = LVIS_SELECTED;
- lvitem.iItem = Index;
-
- (void)ListView_GetItem(hProcessPageListCtrl, &lvitem);
-
- if (lvitem.state & LVIS_SELECTED)
- break;
- }
-
- if ((ListView_GetSelectedCount(hProcessPageListCtrl) == 1) &&
- (PerfDataGetProcessId(Index) != 0))
- {
- ProcessPageShowContextMenu(PerfDataGetProcessId(Index));
- }
-
+ ProcessPageShowContextMenu(GetSelectedProcessId());
break;
}
@@ -358,12 +237,9 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam)
{
case HDN_ITEMCLICK:
- /*
- * FIXME: Fix the column sorting
- *
- *ListView_SortItems(hApplicationPageListCtrl, ApplicationPageCompareFunc, NULL);
- *bSortAscending = !bSortAscending;
- */
+ TaskManagerSettings.SortColumn = ColumnDataHints[pnmhdr->iItem];
+ TaskManagerSettings.SortAscending = !TaskManagerSettings.SortAscending;
+ (void)ListView_SortItems(hProcessPageListCtrl, ProcessPageCompareFunc, NULL);
break;
@@ -381,7 +257,6 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam)
}
}
-
}
void CommaSeparateNumberString(LPWSTR strNumber, int nMaxCount)
@@ -513,8 +388,7 @@ DWORD WINAPI ProcessPageRefreshThread(void *lpParameter)
/* Reset our event */
ResetEvent(hProcessPageEvent);
- if ((ULONG)SendMessageW(hProcessPageListCtrl, LVM_GETITEMCOUNT, 0, 0) != PerfDataGetProcessCount())
- SendMessageW(hProcessPageListCtrl, LVM_SETITEMCOUNT, PerfDataGetProcessCount(), /*LVSICF_NOINVALIDATEALL|*/LVSICF_NOSCROLL);
+ UpdateProcesses();
if (IsWindowVisible(hProcessPage))
InvalidateRect(hProcessPageListCtrl, NULL, FALSE);
@@ -533,3 +407,452 @@ DWORD WINAPI ProcessPageRefreshThread(void *lpParameter)
}
return 0;
}
+
+void UpdateProcesses()
+{
+ int i;
+ BOOL found = FALSE;
+ ULONG l;
+ ULONG pid;
+ LV_ITEM item;
+ LPPROCESS_PAGE_LIST_ITEM pData;
+ PPERFDATA pPerfData;
+
+ /* Remove old processes */
+ for (i = 0; i < ListView_GetItemCount(hProcessPageListCtrl); i++)
+ {
+ memset(&item, 0, sizeof (LV_ITEM));
+ item.mask = LVIF_PARAM;
+ item.iItem = i;
+ (void)ListView_GetItem(hProcessPageListCtrl, &item);
+ pData = (LPPROCESS_PAGE_LIST_ITEM)item.lParam;
+ (void)PerfDataGet(pData->Index, &pPerfData);
+ pid = PerfDataGetProcessId(pData->Index);
+ for (l = 0; l < PerfDataGetProcessCount(); l++)
+ {
+ if (PerfDataGetProcessId(l) == pid)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found)
+ {
+ (void)ListView_DeleteItem(hApplicationPageListCtrl, i);
+ HeapFree(GetProcessHeap(), 0, pData);
+ }
+ }
+ for (l = 0; l < PerfDataGetProcessCount(); l++)
+ {
+ AddProcess(l);
+ }
+ if (TaskManagerSettings.SortColumn != -1)
+ {
+ (void)ListView_SortItems(hProcessPageListCtrl, ProcessPageCompareFunc, NULL);
+ }
+}
+
+void AddProcess(ULONG Index)
+{
+ LPPROCESS_PAGE_LIST_ITEM pData;
+ int i;
+ LV_ITEM item;
+ BOOL bAlreadyInList = FALSE;
+ ULONG pid;
+
+ pid = PerfDataGetProcessId(Index);
+
+ /* Check to see if it's already in our list */
+ for (i=0; iIndex) == pid)
+ {
+ bAlreadyInList = TRUE;
+ break;
+ }
+ }
+ if (!bAlreadyInList) /* Add */
+ {
+ pData = (LPPROCESS_PAGE_LIST_ITEM)HeapAlloc(GetProcessHeap(), 0, sizeof(PROCESS_PAGE_LIST_ITEM));
+ pData->Index = Index;
+
+ /* Add the item to the list */
+ memset(&item, 0, sizeof(LV_ITEM));
+ item.mask = LVIF_TEXT|LVIF_PARAM;
+ item.pszText = LPSTR_TEXTCALLBACK;
+ item.iItem = ListView_GetItemCount(hProcessPageListCtrl);
+ item.lParam = (LPARAM)pData;
+ (void)ListView_InsertItem(hProcessPageListCtrl, &item);
+ }
+}
+
+BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCount)
+{
+ IO_COUNTERS iocounters;
+ LARGE_INTEGER time;
+
+ if (ColumnDataHints[ColumnIndex] == COLUMN_IMAGENAME)
+ PerfDataGetImageName(Index, lpText, nMaxCount);
+ if (ColumnDataHints[ColumnIndex] == COLUMN_PID)
+ wsprintfW(lpText, L"%d", PerfDataGetProcessId(Index));
+ if (ColumnDataHints[ColumnIndex] == COLUMN_USERNAME)
+ PerfDataGetUserName(Index, lpText, nMaxCount);
+ if (ColumnDataHints[ColumnIndex] == COLUMN_SESSIONID)
+ wsprintfW(lpText, L"%d", PerfDataGetSessionId(Index));
+ if (ColumnDataHints[ColumnIndex] == COLUMN_CPUUSAGE)
+ wsprintfW(lpText, L"%02d", PerfDataGetCPUUsage(Index));
+ if (ColumnDataHints[ColumnIndex] == COLUMN_CPUTIME)
+ {
+ DWORD dwHours;
+ DWORD dwMinutes;
+ DWORD dwSeconds;
+
+ time = PerfDataGetCPUTime(Index);
+ gethmsfromlargeint(time, &dwHours, &dwMinutes, &dwSeconds);
+ wsprintfW(lpText, L"%d:%02d:%02d", dwHours, dwMinutes, dwSeconds);
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGE)
+ {
+ wsprintfW(lpText, L"%d", PerfDataGetWorkingSetSizeBytes(Index) / 1024);
+ CommaSeparateNumberString(lpText, nMaxCount);
+ wcscat(lpText, L" K");
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_PEAKMEMORYUSAGE)
+ {
+ wsprintfW(lpText, L"%d", PerfDataGetPeakWorkingSetSizeBytes(Index) / 1024);
+ CommaSeparateNumberString(lpText, nMaxCount);
+ wcscat(lpText, L" K");
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGEDELTA)
+ {
+ wsprintfW(lpText, L"%d", PerfDataGetWorkingSetSizeDelta(Index) / 1024);
+ CommaSeparateNumberString(lpText, nMaxCount);
+ wcscat(lpText, L" K");
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTS)
+ {
+ wsprintfW(lpText, L"%d", PerfDataGetPageFaultCount(Index));
+ CommaSeparateNumberString(lpText, nMaxCount);
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTSDELTA)
+ {
+ wsprintfW(lpText, L"%d", PerfDataGetPageFaultCountDelta(Index));
+ CommaSeparateNumberString(lpText, nMaxCount);
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_VIRTUALMEMORYSIZE)
+ {
+ wsprintfW(lpText, L"%d", PerfDataGetVirtualMemorySizeBytes(Index) / 1024);
+ CommaSeparateNumberString(lpText, nMaxCount);
+ wcscat(lpText, L" K");
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEDPOOL)
+ {
+ wsprintfW(lpText, L"%d", PerfDataGetPagedPoolUsagePages(Index) / 1024);
+ CommaSeparateNumberString(lpText, nMaxCount);
+ wcscat(lpText, L" K");
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_NONPAGEDPOOL)
+ {
+ wsprintfW(lpText, L"%d", PerfDataGetNonPagedPoolUsagePages(Index) / 1024);
+ CommaSeparateNumberString(lpText, nMaxCount);
+ wcscat(lpText, L" K");
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_BASEPRIORITY)
+ wsprintfW(lpText, L"%d", PerfDataGetBasePriority(Index));
+ if (ColumnDataHints[ColumnIndex] == COLUMN_HANDLECOUNT)
+ {
+ wsprintfW(lpText, L"%d", PerfDataGetHandleCount(Index));
+ CommaSeparateNumberString(lpText, nMaxCount);
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_THREADCOUNT)
+ {
+ wsprintfW(lpText, L"%d", PerfDataGetThreadCount(Index));
+ CommaSeparateNumberString(lpText, nMaxCount);
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_USEROBJECTS)
+ {
+ wsprintfW(lpText, L"%d", PerfDataGetUSERObjectCount(Index));
+ CommaSeparateNumberString(lpText, nMaxCount);
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_GDIOBJECTS)
+ {
+ wsprintfW(lpText, L"%d", PerfDataGetGDIObjectCount(Index));
+ CommaSeparateNumberString(lpText, nMaxCount);
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADS)
+ {
+ PerfDataGetIOCounters(Index, &iocounters);
+ /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.ReadOperationCount); */
+ _ui64tow(iocounters.ReadOperationCount, lpText, 10);
+ CommaSeparateNumberString(lpText, nMaxCount);
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITES)
+ {
+ PerfDataGetIOCounters(Index, &iocounters);
+ /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.WriteOperationCount); */
+ _ui64tow(iocounters.WriteOperationCount, lpText, 10);
+ CommaSeparateNumberString(lpText, nMaxCount);
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHER)
+ {
+ PerfDataGetIOCounters(Index, &iocounters);
+ /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.OtherOperationCount); */
+ _ui64tow(iocounters.OtherOperationCount, lpText, 10);
+ CommaSeparateNumberString(lpText, nMaxCount);
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADBYTES)
+ {
+ PerfDataGetIOCounters(Index, &iocounters);
+ /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.ReadTransferCount); */
+ _ui64tow(iocounters.ReadTransferCount, lpText, 10);
+ CommaSeparateNumberString(lpText, nMaxCount);
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITEBYTES)
+ {
+ PerfDataGetIOCounters(Index, &iocounters);
+ /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.WriteTransferCount); */
+ _ui64tow(iocounters.WriteTransferCount, lpText, 10);
+ CommaSeparateNumberString(lpText, nMaxCount);
+ }
+ if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHERBYTES)
+ {
+ PerfDataGetIOCounters(Index, &iocounters);
+ /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.OtherTransferCount); */
+ _ui64tow(iocounters.OtherTransferCount, lpText, 10);
+ CommaSeparateNumberString(lpText, nMaxCount);
+ }
+
+ return FALSE;
+}
+
+
+void gethmsfromlargeint(LARGE_INTEGER largeint, DWORD *dwHours, DWORD *dwMinutes, DWORD *dwSeconds)
+{
+#ifdef _MSC_VER
+ *dwHours = (DWORD)(largeint.QuadPart / 36000000000L);
+ *dwMinutes = (DWORD)((largeint.QuadPart % 36000000000L) / 600000000L);
+ *dwSeconds = (DWORD)(((largeint.QuadPart % 36000000000L) % 600000000L) / 10000000L);
+#else
+ *dwHours = (DWORD)(largeint.QuadPart / 36000000000LL);
+ *dwMinutes = (DWORD)((largeint.QuadPart % 36000000000LL) / 600000000LL);
+ *dwSeconds = (DWORD)(((largeint.QuadPart % 36000000000LL) % 600000000LL) / 10000000LL);
+#endif
+}
+
+int largeintcmp(LARGE_INTEGER l1, LARGE_INTEGER l2)
+{
+ int ret = 0;
+ DWORD dwHours1;
+ DWORD dwMinutes1;
+ DWORD dwSeconds1;
+ DWORD dwHours2;
+ DWORD dwMinutes2;
+ DWORD dwSeconds2;
+
+ gethmsfromlargeint(l1, &dwHours1, &dwMinutes1, &dwSeconds1);
+ gethmsfromlargeint(l2, &dwHours2, &dwMinutes2, &dwSeconds2);
+ ret = CMP(dwHours1, dwHours2);
+ if (ret == 0)
+ {
+ ret = CMP(dwMinutes1, dwMinutes2);
+ if (ret == 0)
+ {
+ ret = CMP(dwSeconds1, dwSeconds2);
+ }
+ }
+ return ret;
+}
+
+int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
+{
+ int ret = 0;
+ LPPROCESS_PAGE_LIST_ITEM Param1;
+ LPPROCESS_PAGE_LIST_ITEM Param2;
+ WCHAR text1[260];
+ WCHAR text2[260];
+ ULONG l1;
+ ULONG l2;
+ LARGE_INTEGER time1;
+ LARGE_INTEGER time2;
+ IO_COUNTERS iocounters1;
+ IO_COUNTERS iocounters2;
+ ULONGLONG ull1;
+ ULONGLONG ull2;
+
+ if (TaskManagerSettings.SortAscending) {
+ Param1 = (LPPROCESS_PAGE_LIST_ITEM)lParam1;
+ Param2 = (LPPROCESS_PAGE_LIST_ITEM)lParam2;
+ } else {
+ Param1 = (LPPROCESS_PAGE_LIST_ITEM)lParam2;
+ Param2 = (LPPROCESS_PAGE_LIST_ITEM)lParam1;
+ }
+
+ if (TaskManagerSettings.SortColumn == COLUMN_IMAGENAME)
+ {
+ PerfDataGetImageName(Param1->Index, text1, sizeof (text1) / sizeof (*text1));
+ PerfDataGetImageName(Param2->Index, text2, sizeof (text2) / sizeof (*text2));
+ ret = _wcsicmp(text1, text2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_PID)
+ {
+ l1 = PerfDataGetProcessId(Param1->Index);
+ l2 = PerfDataGetProcessId(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_USERNAME)
+ {
+ PerfDataGetUserName(Param1->Index, text1, sizeof (text1) / sizeof (*text1));
+ PerfDataGetUserName(Param2->Index, text2, sizeof (text2) / sizeof (*text2));
+ ret = _wcsicmp(text1, text2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_SESSIONID)
+ {
+ l1 = PerfDataGetSessionId(Param1->Index);
+ l2 = PerfDataGetSessionId(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_CPUUSAGE)
+ {
+ l1 = PerfDataGetCPUUsage(Param1->Index);
+ l2 = PerfDataGetCPUUsage(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_CPUTIME)
+ {
+ time1 = PerfDataGetCPUTime(Param1->Index);
+ time2 = PerfDataGetCPUTime(Param2->Index);
+ ret = largeintcmp(time1, time2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_MEMORYUSAGE)
+ {
+ l1 = PerfDataGetWorkingSetSizeBytes(Param1->Index);
+ l2 = PerfDataGetWorkingSetSizeBytes(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_PEAKMEMORYUSAGE)
+ {
+ l1 = PerfDataGetPeakWorkingSetSizeBytes(Param1->Index);
+ l2 = PerfDataGetPeakWorkingSetSizeBytes(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_MEMORYUSAGEDELTA)
+ {
+ l1 = PerfDataGetWorkingSetSizeDelta(Param1->Index);
+ l2 = PerfDataGetWorkingSetSizeDelta(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_PAGEFAULTS)
+ {
+ l1 = PerfDataGetPageFaultCount(Param1->Index);
+ l2 = PerfDataGetPageFaultCount(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_PAGEFAULTSDELTA)
+ {
+ l1 = PerfDataGetPageFaultCountDelta(Param1->Index);
+ l2 = PerfDataGetPageFaultCountDelta(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_VIRTUALMEMORYSIZE)
+ {
+ l1 = PerfDataGetVirtualMemorySizeBytes(Param1->Index);
+ l2 = PerfDataGetVirtualMemorySizeBytes(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_PAGEDPOOL)
+ {
+ l1 = PerfDataGetPagedPoolUsagePages(Param1->Index);
+ l2 = PerfDataGetPagedPoolUsagePages(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_NONPAGEDPOOL)
+ {
+ l1 = PerfDataGetNonPagedPoolUsagePages(Param1->Index);
+ l2 = PerfDataGetNonPagedPoolUsagePages(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_BASEPRIORITY)
+ {
+ l1 = PerfDataGetBasePriority(Param1->Index);
+ l2 = PerfDataGetBasePriority(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_HANDLECOUNT)
+ {
+ l1 = PerfDataGetHandleCount(Param1->Index);
+ l2 = PerfDataGetHandleCount(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_THREADCOUNT)
+ {
+ l1 = PerfDataGetThreadCount(Param1->Index);
+ l2 = PerfDataGetThreadCount(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_USEROBJECTS)
+ {
+ l1 = PerfDataGetUSERObjectCount(Param1->Index);
+ l2 = PerfDataGetUSERObjectCount(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_GDIOBJECTS)
+ {
+ l1 = PerfDataGetGDIObjectCount(Param1->Index);
+ l2 = PerfDataGetGDIObjectCount(Param2->Index);
+ ret = CMP(l1, l2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_IOREADS)
+ {
+ PerfDataGetIOCounters(Param1->Index, &iocounters1);
+ PerfDataGetIOCounters(Param2->Index, &iocounters2);
+ ull1 = iocounters1.ReadOperationCount;
+ ull2 = iocounters2.ReadOperationCount;
+ ret = CMP(ull1, ull2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_IOWRITES)
+ {
+ PerfDataGetIOCounters(Param1->Index, &iocounters1);
+ PerfDataGetIOCounters(Param2->Index, &iocounters2);
+ ull1 = iocounters1.WriteOperationCount;
+ ull2 = iocounters2.WriteOperationCount;
+ ret = CMP(ull1, ull2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_IOOTHER)
+ {
+ PerfDataGetIOCounters(Param1->Index, &iocounters1);
+ PerfDataGetIOCounters(Param2->Index, &iocounters2);
+ ull1 = iocounters1.OtherOperationCount;
+ ull2 = iocounters2.OtherOperationCount;
+ ret = CMP(ull1, ull2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_IOREADBYTES)
+ {
+ PerfDataGetIOCounters(Param1->Index, &iocounters1);
+ PerfDataGetIOCounters(Param2->Index, &iocounters2);
+ ull1 = iocounters1.ReadTransferCount;
+ ull2 = iocounters2.ReadTransferCount;
+ ret = CMP(ull1, ull2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_IOWRITEBYTES)
+ {
+ PerfDataGetIOCounters(Param1->Index, &iocounters1);
+ PerfDataGetIOCounters(Param2->Index, &iocounters2);
+ ull1 = iocounters1.WriteTransferCount;
+ ull2 = iocounters2.WriteTransferCount;
+ ret = CMP(ull1, ull2);
+ }
+ else if (TaskManagerSettings.SortColumn == COLUMN_IOOTHERBYTES)
+ {
+ PerfDataGetIOCounters(Param1->Index, &iocounters1);
+ PerfDataGetIOCounters(Param2->Index, &iocounters2);
+ ull1 = iocounters1.OtherTransferCount;
+ ull2 = iocounters2.OtherTransferCount;
+ ret = CMP(ull1, ull2);
+ }
+ return ret;
+}
diff --git a/reactos/base/applications/taskmgr/procpage.h b/reactos/base/applications/taskmgr/procpage.h
index 439e2a9d6d0..8cfb7eb3602 100644
--- a/reactos/base/applications/taskmgr/procpage.h
+++ b/reactos/base/applications/taskmgr/procpage.h
@@ -31,5 +31,6 @@ extern HWND hProcessPageShowAllProcessesButton; /* Process Show All Processes c
INT_PTR CALLBACK ProcessPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
void RefreshProcessPage(void);
+DWORD GetSelectedProcessId(void);
#endif /* __PROCESSPAGE_H */
diff --git a/reactos/base/applications/taskmgr/taskmgr.c b/reactos/base/applications/taskmgr/taskmgr.c
index c12aea5d577..5f0cfb445dd 100644
--- a/reactos/base/applications/taskmgr/taskmgr.c
+++ b/reactos/base/applications/taskmgr/taskmgr.c
@@ -459,9 +459,9 @@ BOOL OnCreate(HWND hWnd)
return FALSE;
/* Create the status bar panes */
- nParts[0] = 100;
- nParts[1] = 210;
- nParts[2] = 400;
+ nParts[0] = STATUS_SIZE1;
+ nParts[1] = STATUS_SIZE2;
+ nParts[2] = STATUS_SIZE3;
SendMessageW(hStatusWnd, SB_SETPARTS, 3, (LPARAM) (LPINT) nParts);
/* Create tab pages */
@@ -638,8 +638,8 @@ void OnSize( WPARAM nType, int cx, int cy )
SendMessageW(hStatusWnd, WM_SIZE, nType, MAKELPARAM(cx,rc.bottom - rc.top));
/* Update the status bar pane sizes */
- nParts[0] = bInMenuLoop ? -1 : 100;
- nParts[1] = 210;
+ nParts[0] = bInMenuLoop ? -1 : STATUS_SIZE1;
+ nParts[1] = STATUS_SIZE2;
nParts[2] = cx;
SendMessageW(hStatusWnd, SB_SETPARTS, bInMenuLoop ? 1 : 3, (LPARAM) (LPINT) nParts);
@@ -706,7 +706,7 @@ void LoadSettings(void)
TaskManagerSettings.ColumnSizeArray[i] = ColumnPresets[i].size;
}
- TaskManagerSettings.SortColumn = 1;
+ TaskManagerSettings.SortColumn = COLUMN_IMAGENAME;
TaskManagerSettings.SortAscending = TRUE;
/* Performance page settings */
@@ -792,8 +792,8 @@ void TaskManager_OnExitMenuLoop(HWND hWnd)
bInMenuLoop = FALSE;
/* Update the status bar pane sizes */
GetClientRect(hWnd, &rc);
- nParts[0] = 100;
- nParts[1] = 210;
+ nParts[0] = STATUS_SIZE1;
+ nParts[1] = STATUS_SIZE2;
nParts[2] = rc.right;
SendMessageW(hStatusWnd, SB_SETPARTS, 3, (LPARAM) (LPINT) nParts);
SendMessageW(hStatusWnd, SB_SETTEXT, 0, (LPARAM)L"");
diff --git a/reactos/base/applications/taskmgr/taskmgr.h b/reactos/base/applications/taskmgr/taskmgr.h
index 45950fab202..8fea726ca3f 100644
--- a/reactos/base/applications/taskmgr/taskmgr.h
+++ b/reactos/base/applications/taskmgr/taskmgr.h
@@ -47,6 +47,9 @@ typedef struct _IO_COUNTERS {
#define RUN_PERF_PAGE
#define STATUS_WINDOW 2001
+#define STATUS_SIZE1 80
+#define STATUS_SIZE2 210
+#define STATUS_SIZE3 400
typedef struct
{
diff --git a/reactos/base/applications/winhlp32/lang/bg-BG.rc b/reactos/base/applications/winhlp32/Bg.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/bg-BG.rc
rename to reactos/base/applications/winhlp32/Bg.rc
index c59d4e24625..e6d3143db24 100644
--- a/reactos/base/applications/winhlp32/lang/bg-BG.rc
+++ b/reactos/base/applications/winhlp32/Bg.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/winhlp32/lang/cs-CZ.rc b/reactos/base/applications/winhlp32/Cs.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/cs-CZ.rc
rename to reactos/base/applications/winhlp32/Cs.rc
index 15cbf02693d..a8f8db31a26 100644
--- a/reactos/base/applications/winhlp32/lang/cs-CZ.rc
+++ b/reactos/base/applications/winhlp32/Cs.rc
@@ -21,6 +21,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Czech strings in CP1250 */
/* Menu */
diff --git a/reactos/base/applications/winhlp32/lang/da-DK.rc b/reactos/base/applications/winhlp32/Da.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/da-DK.rc
rename to reactos/base/applications/winhlp32/Da.rc
index 927fc32079f..fc15eeba7d5 100644
--- a/reactos/base/applications/winhlp32/lang/da-DK.rc
+++ b/reactos/base/applications/winhlp32/Da.rc
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/winhlp32/lang/de-DE.rc b/reactos/base/applications/winhlp32/De.rc
similarity index 94%
rename from reactos/base/applications/winhlp32/lang/de-DE.rc
rename to reactos/base/applications/winhlp32/De.rc
index c8ee650ccca..fa59b42ce96 100644
--- a/reactos/base/applications/winhlp32/lang/de-DE.rc
+++ b/reactos/base/applications/winhlp32/De.rc
@@ -19,12 +19,16 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
+#pragma code_page(65001)
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
{
POPUP "&Datei" {
- MENUITEM "&ffnen...", MNID_FILE_OPEN
+ MENUITEM "Ö&ffnen...", MNID_FILE_OPEN
MENUITEM SEPARATOR
MENUITEM "Thema &drucken", MNID_FILE_PRINT
MENUITEM "Drucker&einrichtung...", MNID_FILE_SETUP
@@ -61,7 +65,7 @@ MAIN_MENU MENU LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
MENUITEM SEPARATOR
MENUITEM "&Info...", MNID_HELP_ABOUT
#ifdef WINELIB
- MENUITEM "&ber WINE", MNID_HELP_WINE
+ MENUITEM "&Über WINE", MNID_HELP_WINE
#endif
}
}
@@ -94,7 +98,7 @@ STID_NOT_IMPLEMENTED, "Nicht implementiert"
STID_HLPFILE_ERROR_s, "Fehler beim Lesen der Hilfe-Datei `%s'"
STID_INDEX, "&Inhalt"
STID_CONTENTS, "Summary"
-STID_BACK, "&Zurck"
+STID_BACK, "&Zurück"
STID_ALL_FILES, "Alle Dateien (*.*)"
STID_HELP_FILES_HLP, "Hilfe-Dateien (*.hlp)"
STID_FILE_NOT_FOUND_s "'%s' konnte nicht gefunden werden. Wollen Sie selber nach dieser Datei suchen?"
@@ -109,11 +113,11 @@ BEGIN
MENUITEM "Anmerken...", MNID_CTXT_ANNOTATE
MENUITEM "Kopieren", MNID_CTXT_COPY
MENUITEM "Drucken...", MNID_CTXT_PRINT
-POPUP "Schriftgre"
+POPUP "Schriftgröße"
BEGIN
MENUITEM "Klein", MNID_CTXT_FONTS_SMALL
MENUITEM "Normal", MNID_CTXT_FONTS_NORMAL
-MENUITEM "Gro", MNID_CTXT_FONTS_LARGE
+MENUITEM "Groß", MNID_CTXT_FONTS_LARGE
END
POPUP "Hilfe immer sichtbar"
BEGIN
diff --git a/reactos/base/applications/winhlp32/lang/en-US.rc b/reactos/base/applications/winhlp32/En.rc
similarity index 66%
rename from reactos/base/applications/winhlp32/lang/en-US.rc
rename to reactos/base/applications/winhlp32/En.rc
index 2a11e1a33c2..a4e9d8add4e 100644
--- a/reactos/base/applications/winhlp32/lang/en-US.rc
+++ b/reactos/base/applications/winhlp32/En.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
@@ -66,6 +68,51 @@ MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
}
}
+MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
+{
+ POPUP "&File" {
+ MENUITEM "&Open", MNID_FILE_OPEN
+ MENUITEM SEPARATOR
+ MENUITEM "&Print", MNID_FILE_PRINT
+ MENUITEM "Printer &setup...", MNID_FILE_SETUP
+ MENUITEM SEPARATOR
+ MENUITEM "E&xit", MNID_FILE_EXIT
+ }
+ POPUP "&Edit" {
+ MENUITEM "&Copy...", MNID_EDIT_COPYDLG
+ MENUITEM SEPARATOR
+ MENUITEM "&Annotate...", MNID_EDIT_ANNOTATE
+ }
+ POPUP "&Bookmark" {
+ MENUITEM "&Define...", MNID_BKMK_DEFINE
+ }
+ POPUP "&Options" {
+ POPUP "Help always visible"
+ BEGIN
+ MENUITEM "Default", MNID_OPTS_HELP_DEFAULT
+ MENUITEM "Visible", MNID_OPTS_HELP_VISIBLE
+ MENUITEM "Non visible", MNID_OPTS_HELP_NONVISIBLE
+ END
+ MENUITEM "History", MNID_OPTS_HISTORY
+ POPUP "Fonts"
+ BEGIN
+ MENUITEM "Small", MNID_OPTS_FONTS_SMALL
+ MENUITEM "Normal", MNID_OPTS_FONTS_NORMAL
+ MENUITEM "Large", MNID_OPTS_FONTS_LARGE
+ END
+ MENUITEM "Use system colours", MNID_OPTS_SYSTEM_COLORS
+ }
+ POPUP "&Help" {
+ MENUITEM "Help &on help", MNID_HELP_HELPON
+ MENUITEM "Always on &top", MNID_HELP_HELPTOP
+ MENUITEM SEPARATOR
+ MENUITEM "&Info...", MNID_HELP_ABOUT
+#ifdef WINELIB
+ MENUITEM "&About Wine", MNID_HELP_WINE
+#endif
+ }
+}
+
IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
@@ -123,3 +170,26 @@ BEGIN
MENUITEM "Use system colors", MNID_CTXT_SYSTEM_COLORS
END
END
+
+CONTEXT_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Annotation...", MNID_CTXT_ANNOTATE
+ MENUITEM "Copy", MNID_CTXT_COPY
+ MENUITEM "Print...", MNID_CTXT_PRINT
+ POPUP "Fonts"
+ BEGIN
+ MENUITEM "Small", MNID_CTXT_FONTS_SMALL
+ MENUITEM "Normal", MNID_CTXT_FONTS_NORMAL
+ MENUITEM "Large", MNID_CTXT_FONTS_LARGE
+ END
+ POPUP "Help always visible"
+ BEGIN
+ MENUITEM "Default", MNID_CTXT_HELP_DEFAULT
+ MENUITEM "Visible", MNID_CTXT_HELP_VISIBLE
+ MENUITEM "Non visible", MNID_CTXT_HELP_NONVISIBLE
+ END
+ MENUITEM "Use system colours", MNID_CTXT_SYSTEM_COLORS
+ END
+END
diff --git a/reactos/base/applications/winhlp32/lang/es-ES.rc b/reactos/base/applications/winhlp32/Es.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/es-ES.rc
rename to reactos/base/applications/winhlp32/Es.rc
index eee0e17e26a..e752950bcd9 100644
--- a/reactos/base/applications/winhlp32/lang/es-ES.rc
+++ b/reactos/base/applications/winhlp32/Es.rc
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
diff --git a/reactos/base/applications/winhlp32/lang/fi-FI.rc b/reactos/base/applications/winhlp32/Fi.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/fi-FI.rc
rename to reactos/base/applications/winhlp32/Fi.rc
index a1564e68adf..5585619e4ed 100644
--- a/reactos/base/applications/winhlp32/lang/fi-FI.rc
+++ b/reactos/base/applications/winhlp32/Fi.rc
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/winhlp32/lang/fr-FR.rc b/reactos/base/applications/winhlp32/Fr.rc
similarity index 78%
rename from reactos/base/applications/winhlp32/lang/fr-FR.rc
rename to reactos/base/applications/winhlp32/Fr.rc
index 0c5eea63f12..cedb0f694b7 100644
--- a/reactos/base/applications/winhlp32/lang/fr-FR.rc
+++ b/reactos/base/applications/winhlp32/Fr.rc
@@ -20,6 +20,11 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
/* Menu */
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
@@ -34,18 +39,18 @@ MAIN_MENU MENU
MENUITEM SEPARATOR
MENUITEM "&Quitter", MNID_FILE_EXIT
}
- POPUP "&dition" {
+ POPUP "É&dition" {
MENUITEM "&Copier...", MNID_EDIT_COPYDLG
MENUITEM SEPARATOR
- MENUITEM "&Annotation...", MNID_EDIT_ANNOTATE
+ MENUITEM "&Annoter...", MNID_EDIT_ANNOTATE
}
- POPUP "&Signet" {
- MENUITEM "&Dfinir...", MNID_BKMK_DEFINE
+ POPUP "&Signets" {
+ MENUITEM "&Définir...", MNID_BKMK_DEFINE
}
POPUP "&Options" {
POPUP "Aide toujours visible"
BEGIN
- MENUITEM "Par dfaut", MNID_OPTS_HELP_DEFAULT
+ MENUITEM "Par défaut", MNID_OPTS_HELP_DEFAULT
MENUITEM "Visible", MNID_OPTS_HELP_VISIBLE
MENUITEM "Non visible", MNID_OPTS_HELP_NONVISIBLE
END
@@ -56,7 +61,7 @@ MAIN_MENU MENU
MENUITEM "Normale", MNID_OPTS_FONTS_NORMAL
MENUITEM "Grande", MNID_OPTS_FONTS_LARGE
END
- MENUITEM "Utiliser les couleurs systme", MNID_OPTS_SYSTEM_COLORS
+ MENUITEM "Utiliser les couleurs système", MNID_OPTS_SYSTEM_COLORS
}
POPUP "Aid&e" {
MENUITEM "&Utiliser l'aide", MNID_HELP_HELPON
@@ -64,7 +69,7 @@ MAIN_MENU MENU
MENUITEM SEPARATOR
MENUITEM "&Info...", MNID_HELP_ABOUT
#ifdef WINELIB
- MENUITEM " &propos de Wine", MNID_HELP_WINE
+ MENUITEM "À &propos de Wine", MNID_HELP_WINE
#endif
}
}
@@ -82,7 +87,7 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Recherche"
{
- LTEXT "Pas encore implment", -1, 10, 10, 180, 150
+ LTEXT "Pas encore implémenté", -1, 10, 10, 180, 150
}
/* Strings */
@@ -92,15 +97,15 @@ STID_WINE_HELP, "Aide de Wine"
STID_WHERROR, "ERREUR"
STID_WARNING, "ATTENTION"
STID_INFO, "Information"
-STID_NOT_IMPLEMENTED, "Non implment"
-STID_HLPFILE_ERROR_s, "Une erreur est survenue en lisant le fichier d'aide %s"
+STID_NOT_IMPLEMENTED, "Non implémenté"
+STID_HLPFILE_ERROR_s, "Une erreur est survenue en lisant le fichier d'aide « %s »"
STID_INDEX, "&Index"
STID_CONTENTS, "Sommaire"
-STID_BACK, "&Prcdent"
-STID_ALL_FILES, "Tous fichiers (*.*)"
+STID_BACK, "&Précédent"
+STID_ALL_FILES, "Tous les fichiers (*.*)"
STID_HELP_FILES_HLP, "Fichiers d'aide (*.hlp)"
-STID_FILE_NOT_FOUND_s "Impossible de trouver %s. Souhaitez-vous rechercher ce fichier vous-mme?"
-STID_NO_RICHEDIT "La bibliothque RichEdit n'a pu tre localise... Abandon"
+STID_FILE_NOT_FOUND_s "Impossible de trouver « %s ». Souhaitez-vous rechercher ce fichier vous-même ?"
+STID_NO_RICHEDIT "La bibliothèque RichEdit n'a pu être localisée... Abandon"
STID_PSH_INDEX, "Rubriques d'aide : "
}
@@ -119,10 +124,10 @@ BEGIN
END
POPUP "Aide toujours visible"
BEGIN
- MENUITEM "Par dfaut", MNID_CTXT_HELP_DEFAULT
+ MENUITEM "Par défaut", MNID_CTXT_HELP_DEFAULT
MENUITEM "Visible", MNID_CTXT_HELP_VISIBLE
MENUITEM "Non visible", MNID_CTXT_HELP_NONVISIBLE
END
- MENUITEM "Utiliser les couleurs systme", MNID_CTXT_SYSTEM_COLORS
+ MENUITEM "Utiliser les couleurs système", MNID_CTXT_SYSTEM_COLORS
END
END
diff --git a/reactos/base/applications/winhlp32/lang/hu-HU.rc b/reactos/base/applications/winhlp32/Hu.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/hu-HU.rc
rename to reactos/base/applications/winhlp32/Hu.rc
index 39beb19c641..ef3a1ee2bc3 100644
--- a/reactos/base/applications/winhlp32/lang/hu-HU.rc
+++ b/reactos/base/applications/winhlp32/Hu.rc
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/winhlp32/lang/it-IT.rc b/reactos/base/applications/winhlp32/It.rc
similarity index 71%
rename from reactos/base/applications/winhlp32/lang/it-IT.rc
rename to reactos/base/applications/winhlp32/It.rc
index c929727791b..5d1abb8c92c 100644
--- a/reactos/base/applications/winhlp32/lang/it-IT.rc
+++ b/reactos/base/applications/winhlp32/It.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
@@ -39,21 +41,21 @@ MAIN_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
POPUP "&Segnalibro" {
MENUITEM "&Definisci...", MNID_BKMK_DEFINE
}
- POPUP "&Options" {
- POPUP "Help always visible"
+ POPUP "&Opzioni" {
+ POPUP "Aiuto sempre visibile"
BEGIN
- MENUITEM "Default", MNID_OPTS_HELP_DEFAULT
- MENUITEM "Visible", MNID_OPTS_HELP_VISIBLE
- MENUITEM "Non visible", MNID_OPTS_HELP_NONVISIBLE
+ MENUITEM "Predefinito", MNID_OPTS_HELP_DEFAULT
+ MENUITEM "Visibile", MNID_OPTS_HELP_VISIBLE
+ MENUITEM "Non visibile", MNID_OPTS_HELP_NONVISIBLE
END
- MENUITEM "History", MNID_OPTS_HISTORY
- POPUP "Fonts"
+ MENUITEM "Cronologia", MNID_OPTS_HISTORY
+ POPUP "Caratteri"
BEGIN
- MENUITEM "Small", MNID_OPTS_FONTS_SMALL
- MENUITEM "Normal", MNID_OPTS_FONTS_NORMAL
- MENUITEM "Large", MNID_OPTS_FONTS_LARGE
+ MENUITEM "Piccolo", MNID_OPTS_FONTS_SMALL
+ MENUITEM "Normale", MNID_OPTS_FONTS_NORMAL
+ MENUITEM "Grande", MNID_OPTS_FONTS_LARGE
END
- MENUITEM "Use system colors", MNID_OPTS_SYSTEM_COLORS
+ MENUITEM "Usa colori di sistema", MNID_OPTS_SYSTEM_COLORS
}
POPUP "&?" {
MENUITEM "&Aiuto sulla guida", MNID_HELP_HELPON
@@ -61,7 +63,7 @@ MAIN_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
MENUITEM SEPARATOR
MENUITEM "&Informazioni su...", MNID_HELP_ABOUT
#ifdef WINELIB
- MENUITEM "&Informazion su WINE", MNID_HELP_WINE
+ MENUITEM "&Informazioni su WINE", MNID_HELP_WINE
#endif
}
}
@@ -76,12 +78,12 @@ STID_WARNING, "ATTENZIONE"
STID_INFO, "Informazione"
STID_NOT_IMPLEMENTED, "Non ancora implementato"
STID_HLPFILE_ERROR_s, "Errore di lettura del file della Guida `%s'"
-STID_INDEX, "Index"
+STID_INDEX, "Indice"
STID_CONTENTS, "&Sommario"
STID_BACK, "&Precedente"
STID_ALL_FILES, "Tutti i file (*.*)"
STID_HELP_FILES_HLP, "File della Guida (*.hlp)"
-STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?"
-STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting"
-STID_PSH_INDEX, "Help topics: "
+STID_FILE_NOT_FOUND_s "Non è stato possibile trovare '%s'. Vuoi cercare questo file?"
+STID_NO_RICHEDIT "Non è stato possibile trovare un'implementazione richedit... Annullando"
+STID_PSH_INDEX, "Argomenti di aiuto: "
}
diff --git a/reactos/base/applications/winhlp32/lang/ja-JP.rc b/reactos/base/applications/winhlp32/Ja.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/ja-JP.rc
rename to reactos/base/applications/winhlp32/Ja.rc
index bd88b5d6fad..b73d18dd192 100644
--- a/reactos/base/applications/winhlp32/lang/ja-JP.rc
+++ b/reactos/base/applications/winhlp32/Ja.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* UTF-8 */
#pragma code_page(65001)
@@ -126,5 +128,3 @@ BEGIN
MENUITEM "システム カラーを使う", MNID_CTXT_SYSTEM_COLORS
END
END
-
-#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/lang/ko-KR.rc b/reactos/base/applications/winhlp32/Ko.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/ko-KR.rc
rename to reactos/base/applications/winhlp32/Ko.rc
index 68931789c60..8b4c785ed0c 100644
--- a/reactos/base/applications/winhlp32/lang/ko-KR.rc
+++ b/reactos/base/applications/winhlp32/Ko.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/winhlp32/Lt.rc b/reactos/base/applications/winhlp32/Lt.rc
new file mode 100644
index 00000000000..f8e78681aae
--- /dev/null
+++ b/reactos/base/applications/winhlp32/Lt.rc
@@ -0,0 +1,131 @@
+/*
+ * Help Viewer
+ *
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * 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 "winhelp_res.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+/* Menu */
+
+MAIN_MENU MENU
+{
+ POPUP "&Failas" {
+ MENUITEM "&Atverti", MNID_FILE_OPEN
+ MENUITEM SEPARATOR
+ MENUITEM "&Spausdinti", MNID_FILE_PRINT
+ MENUITEM "Spaus&dintuvo nuostatos...", MNID_FILE_SETUP
+ MENUITEM SEPARATOR
+ MENUITEM "Iš&eiti", MNID_FILE_EXIT
+ }
+ POPUP "&Taisa" {
+ MENUITEM "&Kopijuoti...", MNID_EDIT_COPYDLG
+ MENUITEM SEPARATOR
+ MENUITEM "Ko&mentuoti...", MNID_EDIT_ANNOTATE
+ }
+ POPUP "&Adresynas" {
+ MENUITEM "&Apibrėžti...", MNID_BKMK_DEFINE
+ }
+ POPUP "&Parinktys" {
+ POPUP "Žinynas visuomet matomas"
+ BEGIN
+ MENUITEM "Numatyta", MNID_OPTS_HELP_DEFAULT
+ MENUITEM "Matomas", MNID_OPTS_HELP_VISIBLE
+ MENUITEM "Nematomas", MNID_OPTS_HELP_NONVISIBLE
+ END
+ MENUITEM "Istorija", MNID_OPTS_HISTORY
+ POPUP "Šriftas"
+ BEGIN
+ MENUITEM "&Mažas", MNID_OPTS_FONTS_SMALL
+ MENUITEM "&Normalus", MNID_OPTS_FONTS_NORMAL
+ MENUITEM "&Didelis", MNID_OPTS_FONTS_LARGE
+ END
+ MENUITEM "Naudoti &sistemos spalvas", MNID_OPTS_SYSTEM_COLORS
+ }
+ POPUP "&Žinynas" {
+ MENUITEM "Pa&galba apie žinyną", MNID_HELP_HELPON
+ MENUITEM "&Visada viršuje", MNID_HELP_HELPTOP
+ MENUITEM SEPARATOR
+ MENUITEM "&Informacija...", MNID_HELP_ABOUT
+#ifdef WINELIB
+ MENUITEM "&Apie Wine", MNID_HELP_WINE
+#endif
+ }
+}
+
+IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg"
+CAPTION "Indeksas"
+{
+ LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
+}
+
+IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg"
+CAPTION "Paieška"
+{
+ LTEXT "Dar nerealizuota", -1, 10, 10, 180, 150
+}
+
+/* Strings */
+STRINGTABLE DISCARDABLE
+{
+STID_WINE_HELP, "Wine žinynas"
+STID_WHERROR, "KLAIDA"
+STID_WARNING, "ĮSPĖJIMAS"
+STID_INFO, "Informacija"
+STID_NOT_IMPLEMENTED, "Nerealizuota"
+STID_HLPFILE_ERROR_s, "Klaida skaitant žinyno failą „%s“"
+STID_INDEX, "&Rodyklė"
+STID_CONTENTS, "Santrauka"
+STID_BACK, "&Atgal"
+STID_ALL_FILES, "Visi failai (*.*)"
+STID_HELP_FILES_HLP, "Žinyno failai (*.hlp)"
+STID_FILE_NOT_FOUND_s "Nepavyko rasti „%s“. Ar norite rasti šį failą patys?"
+STID_NO_RICHEDIT "Nepavyko rasti RichEdit realizacijos... Nutraukiama"
+STID_PSH_INDEX, "Žinyno temos: "
+}
+
+CONTEXT_MENU MENU
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Komentuoti...", MNID_CTXT_ANNOTATE
+ MENUITEM "Kopijuoti", MNID_CTXT_COPY
+ MENUITEM "Spausdinti...", MNID_CTXT_PRINT
+ POPUP "Šriftas"
+ BEGIN
+ MENUITEM "Mažas", MNID_CTXT_FONTS_SMALL
+ MENUITEM "Normalus", MNID_CTXT_FONTS_NORMAL
+ MENUITEM "Didelis", MNID_CTXT_FONTS_LARGE
+ END
+ POPUP "Žinynas visuomet matomas"
+ BEGIN
+ MENUITEM "Numatyta", MNID_CTXT_HELP_DEFAULT
+ MENUITEM "Matomas", MNID_CTXT_HELP_VISIBLE
+ MENUITEM "Nematomas", MNID_CTXT_HELP_NONVISIBLE
+ END
+ MENUITEM "Naudoti sistemos spalvas", MNID_CTXT_SYSTEM_COLORS
+ END
+END
diff --git a/reactos/base/applications/winhlp32/lang/nl-NL.rc b/reactos/base/applications/winhlp32/Nl.rc
similarity index 74%
rename from reactos/base/applications/winhlp32/lang/nl-NL.rc
rename to reactos/base/applications/winhlp32/Nl.rc
index 6a8747a859e..029d58265b9 100644
--- a/reactos/base/applications/winhlp32/lang/nl-NL.rc
+++ b/reactos/base/applications/winhlp32/Nl.rc
@@ -19,6 +19,10 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
+#pragma code_page(65001)
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
@@ -32,28 +36,28 @@ MAIN_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
MENUITEM "&Afsluiten", MNID_FILE_EXIT
}
POPUP "&Bewerken" {
- MENUITEM "&Kopiren...", MNID_EDIT_COPYDLG
+ MENUITEM "&Kopiëren...", MNID_EDIT_COPYDLG
MENUITEM SEPARATOR
MENUITEM "&Annoteren...", MNID_EDIT_ANNOTATE
}
POPUP "&Favorieten" {
MENUITEM "&Aanmaken...", MNID_BKMK_DEFINE
}
- POPUP "&Options" {
- POPUP "Help always visible"
+ POPUP "&Opties" {
+ POPUP "Help altijd zichtbaar"
BEGIN
- MENUITEM "Default", MNID_OPTS_HELP_DEFAULT
- MENUITEM "Visible", MNID_OPTS_HELP_VISIBLE
- MENUITEM "Non visible", MNID_OPTS_HELP_NONVISIBLE
+ MENUITEM "Standaard", MNID_OPTS_HELP_DEFAULT
+ MENUITEM "Zichtbaar", MNID_OPTS_HELP_VISIBLE
+ MENUITEM "Niet zichtbaar", MNID_OPTS_HELP_NONVISIBLE
END
- MENUITEM "History", MNID_OPTS_HISTORY
- POPUP "Fonts"
+ MENUITEM "Historie", MNID_OPTS_HISTORY
+ POPUP "Lettertype"
BEGIN
- MENUITEM "Small", MNID_OPTS_FONTS_SMALL
- MENUITEM "Normal", MNID_OPTS_FONTS_NORMAL
- MENUITEM "Large", MNID_OPTS_FONTS_LARGE
+ MENUITEM "Klein", MNID_OPTS_FONTS_SMALL
+ MENUITEM "Standaard", MNID_OPTS_FONTS_NORMAL
+ MENUITEM "Groot", MNID_OPTS_FONTS_LARGE
END
- MENUITEM "Use system colors", MNID_OPTS_SYSTEM_COLORS
+ MENUITEM "Gebruik systeemkleuren", MNID_OPTS_SYSTEM_COLORS
}
POPUP "&Help" {
MENUITEM "Hulp &bij help", MNID_HELP_HELPON
@@ -61,7 +65,7 @@ MAIN_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
MENUITEM SEPARATOR
MENUITEM "&Info...", MNID_HELP_ABOUT
#ifdef WINELIB
- MENUITEM "&Over WINE", MNID_HELP_WINE
+ MENUITEM "&Over Wine", MNID_HELP_WINE
#endif
}
}
@@ -79,26 +83,26 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Zoeken"
{
- LTEXT "Nog niet geimplementeerd", -1, 10, 10, 180, 150
+ LTEXT "Nog niet geïmplementeerd", -1, 10, 10, 180, 150
}
/* Strings */
STRINGTABLE DISCARDABLE LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
{
-STID_WINE_HELP, "WINE Help"
+STID_WINE_HELP, "Wine Help"
STID_WHERROR, "FOUT"
STID_WARNING, "WAARSCHUWING"
STID_INFO, "Informatie"
-STID_NOT_IMPLEMENTED, "Niet gemplementeerd"
-STID_HLPFILE_ERROR_s, "Fout bij het lezen van het helpbestand `%s'"
-STID_INDEX, "&Inhoud"
-STID_CONTENTS, "Summary"
+STID_NOT_IMPLEMENTED, "Niet geïmplementeerd"
+STID_HLPFILE_ERROR_s, "Fout bij het lezen van het helpbestand '%s'"
+STID_INDEX, "Inde&x"
+STID_CONTENTS, "&Inhoudsopgave"
STID_BACK, "&Terug"
STID_ALL_FILES, "Alle bestanden (*.*)"
STID_HELP_FILES_HLP, "Helpbestanden (*.hlp)"
STID_FILE_NOT_FOUND_s "Kan '%s' niet openen. Wilt u zelf dit bestand zoeken?"
-STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting"
-STID_PSH_INDEX, "Help topics: "
+STID_NO_RICHEDIT "Kan geen richedit implementatie vinden... Actie afgebroken"
+STID_PSH_INDEX, "Help onderwerpen: "
}
CONTEXT_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
@@ -106,7 +110,7 @@ BEGIN
POPUP ""
BEGIN
MENUITEM "Annotering...", MNID_CTXT_ANNOTATE
- MENUITEM "Kopiren", MNID_CTXT_COPY
+ MENUITEM "Kopiëren", MNID_CTXT_COPY
MENUITEM "Print...", MNID_CTXT_PRINT
POPUP "Lettertypes"
BEGIN
diff --git a/reactos/base/applications/winhlp32/lang/no-NO.rc b/reactos/base/applications/winhlp32/No.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/no-NO.rc
rename to reactos/base/applications/winhlp32/No.rc
index 5f3e3101c46..2cf2a782372 100644
--- a/reactos/base/applications/winhlp32/lang/no-NO.rc
+++ b/reactos/base/applications/winhlp32/No.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
diff --git a/reactos/base/applications/winhlp32/lang/pl-PL.rc b/reactos/base/applications/winhlp32/Pl.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/pl-PL.rc
rename to reactos/base/applications/winhlp32/Pl.rc
index 17d5d22e346..75047892180 100644
--- a/reactos/base/applications/winhlp32/lang/pl-PL.rc
+++ b/reactos/base/applications/winhlp32/Pl.rc
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/winhlp32/lang/pt-BR.rc b/reactos/base/applications/winhlp32/Pt.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/pt-BR.rc
rename to reactos/base/applications/winhlp32/Pt.rc
index fd27a65b55f..9a12e58f096 100644
--- a/reactos/base/applications/winhlp32/lang/pt-BR.rc
+++ b/reactos/base/applications/winhlp32/Pt.rc
@@ -23,6 +23,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
diff --git a/reactos/base/applications/winhlp32/lang/rm-CH.rc b/reactos/base/applications/winhlp32/Rm.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/rm-CH.rc
rename to reactos/base/applications/winhlp32/Rm.rc
index 1339b39e189..ece7bb17c4d 100644
--- a/reactos/base/applications/winhlp32/lang/rm-CH.rc
+++ b/reactos/base/applications/winhlp32/Rm.rc
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* FIXME: This file is in the Vallader Romansh dialect and not in the
official Rumantsch Grischun. */
diff --git a/reactos/base/applications/winhlp32/lang/ru-RU.rc b/reactos/base/applications/winhlp32/Ru.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/ru-RU.rc
rename to reactos/base/applications/winhlp32/Ru.rc
index af0097b7eea..e2e6ef2f5c5 100644
--- a/reactos/base/applications/winhlp32/lang/ru-RU.rc
+++ b/reactos/base/applications/winhlp32/Ru.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/winhlp32/lang/sl-SI.rc b/reactos/base/applications/winhlp32/Si.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/sl-SI.rc
rename to reactos/base/applications/winhlp32/Si.rc
index a742cafe05b..527b45431ee 100644
--- a/reactos/base/applications/winhlp32/lang/sl-SI.rc
+++ b/reactos/base/applications/winhlp32/Si.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
#pragma code_page(65001)
/* Menu */
@@ -124,5 +126,3 @@ BEGIN
MENUITEM "Uporabi sistemske barve", MNID_CTXT_SYSTEM_COLORS
END
END
-
-#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/lang/sk-SK.rc b/reactos/base/applications/winhlp32/Sk.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/sk-SK.rc
rename to reactos/base/applications/winhlp32/Sk.rc
index f8338323dee..1b45e1fe89e 100644
--- a/reactos/base/applications/winhlp32/lang/sk-SK.rc
+++ b/reactos/base/applications/winhlp32/Sk.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
MAIN_MENU MENU LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
{
POPUP "&Sbor" {
diff --git a/reactos/base/applications/winhlp32/lang/sv-SE.rc b/reactos/base/applications/winhlp32/Sv.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/sv-SE.rc
rename to reactos/base/applications/winhlp32/Sv.rc
index d3893284cae..935b618909b 100644
--- a/reactos/base/applications/winhlp32/lang/sv-SE.rc
+++ b/reactos/base/applications/winhlp32/Sv.rc
@@ -22,6 +22,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
diff --git a/reactos/base/applications/winhlp32/lang/tr-TR.rc b/reactos/base/applications/winhlp32/Tr.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/tr-TR.rc
rename to reactos/base/applications/winhlp32/Tr.rc
index bbff7236580..876f33caa2f 100644
--- a/reactos/base/applications/winhlp32/lang/tr-TR.rc
+++ b/reactos/base/applications/winhlp32/Tr.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/winhlp32/lang/zh-CN.rc b/reactos/base/applications/winhlp32/Zh.rc
similarity index 99%
rename from reactos/base/applications/winhlp32/lang/zh-CN.rc
rename to reactos/base/applications/winhlp32/Zh.rc
index c0ed0176d77..ed20356cf47 100644
--- a/reactos/base/applications/winhlp32/lang/zh-CN.rc
+++ b/reactos/base/applications/winhlp32/Zh.rc
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "winhelp_res.h"
+
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@@ -158,5 +160,3 @@ STID_FILE_NOT_FOUND_s "不能開啟檔案 '%s'. 你想要自己找這個檔案
STID_NO_RICHEDIT "找不到 richedit... 終止"
STID_PSH_INDEX, "幫助內容: "
}
-
-#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/lang/el-GR.rc b/reactos/base/applications/winhlp32/lang/el-GR.rc
deleted file mode 100644
index da95d094710..00000000000
--- a/reactos/base/applications/winhlp32/lang/el-GR.rc
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Help Viewer
- *
- * Copyright 1996 Ulrich Schmid
- * Copyright 2002 Sylvain Petreolle
- *
- * 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
- */
-
-LANGUAGE LANG_GREEK, SUBLANG_DEFAULT
-
-/* Menu */
-
-MAIN_MENU MENU
-BEGIN
- POPUP "&"
- BEGIN
- MENUITEM "&", MNID_FILE_OPEN
- MENUITEM SEPARATOR
- MENUITEM "&", MNID_FILE_PRINT
- MENUITEM "& ...", MNID_FILE_SETUP
- MENUITEM SEPARATOR
- MENUITEM "&", MNID_FILE_EXIT
- END
- POPUP "&"
- BEGIN
- MENUITEM "&...", MNID_EDIT_COPYDLG
- MENUITEM SEPARATOR
- MENUITEM "&Annotate...", MNID_EDIT_ANNOTATE
- END
- POPUP "&"
- BEGIN
- MENUITEM "&Define...", MNID_BKMK_DEFINE
- END
- POPUP "&"
- BEGIN
- MENUITEM "Help &on help", MNID_HELP_HELPON
- MENUITEM " &", MNID_HELP_HELPTOP
- MENUITEM SEPARATOR
- MENUITEM "&...", MNID_HELP_ABOUT
-#ifdef WINELIB
- MENUITEM "& WINE", MNID_HELP_WINE
-#endif
- END
-END
-
-/* Strings */
-
-STRINGTABLE DISCARDABLE
-BEGIN
-STID_WINE_HELP, "WINE Help"
-STID_WHERROR, ""
-STID_WARNING, ""
-STID_INFO, ""
-STID_NOT_IMPLEMENTED, "Not implemented"
-STID_HLPFILE_ERROR_s, " `%s'"
-STID_CONTENTS, "&"
-STID_SEARCH, "&"
-STID_BACK, "&"
-STID_TOPICS, "&"
-STID_ALL_FILES, " (*.*)"
-STID_HELP_FILES_HLP, " (*.hlp)"
-STID_FILE_NOT_FOUND_s " '%s'. ;"
-END
diff --git a/reactos/base/applications/winhlp32/lang/lt-LT.rc b/reactos/base/applications/winhlp32/lang/lt-LT.rc
deleted file mode 100644
index 6bf6cb33e61..00000000000
--- a/reactos/base/applications/winhlp32/lang/lt-LT.rc
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Help Viewer
- *
- * Copyright 1996 Ulrich Schmid
- * Copyright 2002 Sylvain Petreolle
- *
- * 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
- *
- * Translation by Vytis "CMan" Girdijauskas (cman@cman.us)
- */
-
-LANGUAGE LANG_LITHUANIAN, SUBLANG_DEFAULT
-
-/* Menu */
-
-MAIN_MENU MENU
-{
- POPUP "&Byla" {
- MENUITEM "&Atverti", MNID_FILE_OPEN
- MENUITEM SEPARATOR
- MENUITEM "&Spausdinti", MNID_FILE_PRINT
- MENUITEM "S&pausdintuvo nuostatos...", MNID_FILE_SETUP
- MENUITEM SEPARATOR
- MENUITEM "&Baigti", MNID_FILE_EXIT
- }
- POPUP "&Redaguoti" {
- MENUITEM "&Kopijuoti...", MNID_EDIT_COPYDLG
- MENUITEM SEPARATOR
- MENUITEM "&Komentarai...", MNID_EDIT_ANNOTATE
- }
- POPUP "&yms" {
- MENUITEM "&Kurti...", MNID_BKMK_DEFINE
- }
- POPUP "&Parinktys" {
- POPUP "Pagalba visada matoma"
- BEGIN
- MENUITEM "Numatyta", MNID_OPTS_HELP_DEFAULT
- MENUITEM "Matoma", MNID_OPTS_HELP_VISIBLE
- MENUITEM "Nematoma", MNID_OPTS_HELP_NONVISIBLE
- END
- MENUITEM "Istorija", MNID_OPTS_HISTORY
- POPUP "riftas"
- BEGIN
- MENUITEM "Maas", MNID_OPTS_FONTS_SMALL
- MENUITEM "Normalus", MNID_OPTS_FONTS_NORMAL
- MENUITEM "Didelis", MNID_OPTS_FONTS_LARGE
- END
- MENUITEM "Naudoti sistemos spalvas", MNID_OPTS_SYSTEM_COLORS
- }
- POPUP "&Pagalba" {
- MENUITEM "&Turinys", MNID_HELP_HELPON
- MENUITEM "Visada &viruje", MNID_HELP_HELPTOP
- MENUITEM SEPARATOR
- MENUITEM "&Apie", MNID_HELP_ABOUT
-#ifdef WINELIB
- MENUITEM "Apie &Wine", MNID_HELP_WINE
-#endif
- }
-}
-
-IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-FONT 8, "MS Shell Dlg"
-CAPTION "Rodykl"
-{
- LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
-}
-
-IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-FONT 8, "MS Shell Dlg"
-CAPTION "Paieka"
-{
- LTEXT "Dar nesukurta", -1, 10, 10, 180, 150
-}
-
-/* Strings */
-STRINGTABLE DISCARDABLE
-{
-STID_WINE_HELP, "Wine Pagalba"
-STID_WHERROR, "KLAIDA"
-STID_WARNING, "DMESIO"
-STID_INFO, "Informacija"
-STID_NOT_IMPLEMENTED, "Dar nesukurta"
-STID_HLPFILE_ERROR_s, "vyko klaida skaitant pagalbos byl '%s'."
-STID_INDEX, "&Rodykl"
-STID_CONTENTS, "&Turinys"
-STID_BACK, "&Atgal"
-STID_ALL_FILES, "Visos bylos (*.*)"
-STID_HELP_FILES_HLP, "Pagalbos bylos (*.hlp)"
-STID_FILE_NOT_FOUND_s "Nepavyko rasti '%s'. Ar nortumte pabandyti surasti ia byl patys?"
-STID_NO_RICHEDIT "Nerastas richedit palaikymas... Darbas nutraukiamas"
-STID_PSH_INDEX, "Pagalbos temos: "
-}
-
-CONTEXT_MENU MENU
-BEGIN
- POPUP ""
- BEGIN
- MENUITEM "Komentarai...", MNID_CTXT_ANNOTATE
- MENUITEM "Kopijuoti", MNID_CTXT_COPY
- MENUITEM "Spausdinti...", MNID_CTXT_PRINT
- POPUP "riftas"
- BEGIN
- MENUITEM "Maas", MNID_CTXT_FONTS_SMALL
- MENUITEM "Normalus", MNID_CTXT_FONTS_NORMAL
- MENUITEM "Didelis", MNID_CTXT_FONTS_LARGE
- END
- POPUP "Pagalba visada matoma"
- BEGIN
- MENUITEM "Numatyta", MNID_CTXT_HELP_DEFAULT
- MENUITEM "Matoma", MNID_CTXT_HELP_VISIBLE
- MENUITEM "Nematoma", MNID_CTXT_HELP_NONVISIBLE
- END
- MENUITEM "Naudoti sistemos spalvas", MNID_CTXT_SYSTEM_COLORS
- END
-END
diff --git a/reactos/base/applications/winhlp32/lang/uk-UA.rc b/reactos/base/applications/winhlp32/lang/uk-UA.rc
deleted file mode 100644
index a895a2fa14b..00000000000
--- a/reactos/base/applications/winhlp32/lang/uk-UA.rc
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * PROJECT: ReactOS Help Viewer
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: applications/winhlp32/lang/uk-UA.rc
- * PURPOSE: Ukraianian Language File for ReactOS Help Viewer
- * PROGRAMMERS: Rostislav Zabolotny, Artem Reznikov
- */
-
-/* Menu */
-
-MAIN_MENU MENU LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
-{
- POPUP "&" {
- MENUITEM "&³", MNID_FILE_OPEN
- MENUITEM SEPARATOR
- MENUITEM "&", MNID_FILE_PRINT
- MENUITEM "& ...", MNID_FILE_SETUP
- MENUITEM SEPARATOR
- MENUITEM "&", MNID_FILE_EXIT
- }
- POPUP "&" {
- MENUITEM "&...", MNID_EDIT_COPYDLG
- MENUITEM SEPARATOR
- MENUITEM "&...", MNID_EDIT_ANNOTATE
- }
- POPUP "&" {
- MENUITEM "&...", MNID_BKMK_DEFINE
- }
- POPUP "&" {
- POPUP " "
- BEGIN
- MENUITEM " ", MNID_OPTS_HELP_DEFAULT
- MENUITEM "", MNID_OPTS_HELP_VISIBLE
- MENUITEM " ", MNID_OPTS_HELP_NONVISIBLE
- END
- MENUITEM "", MNID_OPTS_HISTORY
- POPUP ""
- BEGIN
- MENUITEM "", MNID_OPTS_FONTS_SMALL
- MENUITEM "", MNID_OPTS_FONTS_NORMAL
- MENUITEM "", MNID_OPTS_FONTS_LARGE
- END
- MENUITEM " ", MNID_OPTS_SYSTEM_COLORS
- }
- POPUP "&" {
- MENUITEM " & ", MNID_HELP_HELPON
- MENUITEM " ", MNID_HELP_HELPTOP
- MENUITEM SEPARATOR
- MENUITEM "&...", MNID_HELP_ABOUT
-#ifdef WINELIB
- MENUITEM "& WINE", MNID_HELP_WINE
-#endif
- }
-}
-
-IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-FONT 8, "MS Shell Dlg"
-CAPTION " "
-{
- LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
-}
-
-IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-FONT 8, "MS Shell Dlg"
-CAPTION "Search"
-{
- LTEXT " ", -1, 10, 10, 180, 150
-}
-
-/* Strings */
-STRINGTABLE DISCARDABLE LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
-{
-STID_WINE_HELP, " WINE"
-STID_WHERROR, ""
-STID_WARNING, ""
-STID_INFO, ""
-STID_NOT_IMPLEMENTED, " "
-STID_HLPFILE_ERROR_s, " `%s'"
-STID_INDEX, "& "
-STID_CONTENTS, ""
-STID_BACK, "&"
-STID_ALL_FILES, " (*.*)"
-STID_HELP_FILES_HLP, " (*.hlp)"
-STID_FILE_NOT_FOUND_s " '%s'. ?"
-STID_NO_RICHEDIT " richedit... "
-STID_PSH_INDEX, " : "
-}
-
-CONTEXT_MENU MENU LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
-BEGIN
- POPUP ""
- BEGIN
- MENUITEM "...", MNID_CTXT_ANNOTATE
- MENUITEM "", MNID_CTXT_COPY
- MENUITEM "...", MNID_CTXT_PRINT
- POPUP ""
- BEGIN
- MENUITEM "", MNID_CTXT_FONTS_SMALL
- MENUITEM "", MNID_CTXT_FONTS_NORMAL
- MENUITEM "", MNID_CTXT_FONTS_LARGE
- END
- POPUP " "
- BEGIN
- MENUITEM " ", MNID_CTXT_HELP_DEFAULT
- MENUITEM "", MNID_CTXT_HELP_VISIBLE
- MENUITEM " ", MNID_CTXT_HELP_NONVISIBLE
- END
- MENUITEM " ", MNID_CTXT_SYSTEM_COLORS
- END
-END
diff --git a/reactos/base/applications/winhlp32/lex.yy.c b/reactos/base/applications/winhlp32/lex.yy.c
index b1d60a8d97b..aa6f83c8b78 100644
--- a/reactos/base/applications/winhlp32/lex.yy.c
+++ b/reactos/base/applications/winhlp32/lex.yy.c
@@ -410,12 +410,17 @@ char *yytext;
#line 26 "macro.lex.l"
#include "config.h"
#include
+#include
#ifndef HAVE_UNISTD_H
#define YY_NO_UNISTD_H
#endif
-#include "macro.h"
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winhelp.h"
#include "wine/debug.h"
@@ -428,6 +433,7 @@ struct lex_data {
unsigned quote_stk_idx;
LPSTR cache_string[32];
int cache_used;
+ WINHELP_WINDOW* window;
};
static struct lex_data* lex_data = NULL;
@@ -436,7 +442,7 @@ struct lexret yylval;
#define YY_INPUT(buf,result,max_size)\
if ((result = *lex_data->macroptr ? 1 : 0)) buf[0] = *lex_data->macroptr++;
-#line 440 "lex.yy.c"
+#line 446 "lex.yy.c"
/* Macros after this point can all be overridden by user definitions in
* section 1.
@@ -587,10 +593,10 @@ YY_DECL
register char *yy_cp, *yy_bp;
register int yy_act;
-#line 55 "macro.lex.l"
+#line 61 "macro.lex.l"
-#line 594 "lex.yy.c"
+#line 600 "lex.yy.c"
if ( yy_init )
{
@@ -675,32 +681,32 @@ do_action: /* This label is used only to access EOF actions. */
case 1:
YY_RULE_SETUP
-#line 57 "macro.lex.l"
+#line 63 "macro.lex.l"
yylval.integer = strtol(yytext, NULL, 10); return INTEGER;
YY_BREAK
case 2:
YY_RULE_SETUP
-#line 58 "macro.lex.l"
+#line 64 "macro.lex.l"
yylval.integer = strtol(yytext, NULL, 16); return INTEGER;
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 60 "macro.lex.l"
+#line 66 "macro.lex.l"
return MACRO_Lookup(yytext, &yylval);
YY_BREAK
case 4:
-#line 63 "macro.lex.l"
+#line 69 "macro.lex.l"
case 5:
-#line 64 "macro.lex.l"
+#line 70 "macro.lex.l"
case 6:
-#line 65 "macro.lex.l"
+#line 71 "macro.lex.l"
case 7:
-#line 66 "macro.lex.l"
+#line 72 "macro.lex.l"
case 8:
-#line 67 "macro.lex.l"
+#line 73 "macro.lex.l"
case 9:
YY_RULE_SETUP
-#line 67 "macro.lex.l"
+#line 73 "macro.lex.l"
{
if (lex_data->quote_stk_idx == 0 ||
(yytext[0] == '\"' && lex_data->quote_stack[lex_data->quote_stk_idx - 1] != '\"') ||
@@ -735,34 +741,34 @@ YY_RULE_SETUP
YY_BREAK
case 10:
YY_RULE_SETUP
-#line 99 "macro.lex.l"
+#line 105 "macro.lex.l"
*lex_data->strptr++ = yytext[0];
YY_BREAK
case 11:
YY_RULE_SETUP
-#line 100 "macro.lex.l"
+#line 106 "macro.lex.l"
*lex_data->strptr++ = yytext[1];
YY_BREAK
case YY_STATE_EOF(quote):
-#line 101 "macro.lex.l"
+#line 107 "macro.lex.l"
return 0;
YY_BREAK
case 12:
YY_RULE_SETUP
-#line 103 "macro.lex.l"
+#line 109 "macro.lex.l"
YY_BREAK
case 13:
YY_RULE_SETUP
-#line 104 "macro.lex.l"
+#line 110 "macro.lex.l"
return yytext[0];
YY_BREAK
case 14:
YY_RULE_SETUP
-#line 105 "macro.lex.l"
+#line 111 "macro.lex.l"
ECHO;
YY_BREAK
-#line 766 "lex.yy.c"
+#line 772 "lex.yy.c"
case YY_STATE_EOF(INITIAL):
yyterminate();
@@ -1648,7 +1654,7 @@ int main()
return 0;
}
#endif
-#line 105 "macro.lex.l"
+#line 111 "macro.lex.l"
#if 0
@@ -1813,7 +1819,7 @@ static int MACRO_CallVoidFunc(FARPROC fn, const char* args)
return 1;
}
-BOOL MACRO_ExecuteMacro(LPCSTR macro)
+BOOL MACRO_ExecuteMacro(WINHELP_WINDOW* window, LPCSTR macro)
{
struct lex_data curr_lex_data, *prev_lex_data;
BOOL ret = TRUE;
@@ -1826,6 +1832,7 @@ BOOL MACRO_ExecuteMacro(LPCSTR macro)
memset(lex_data, 0, sizeof(*lex_data));
lex_data->macroptr = macro;
+ lex_data->window = WINHELP_GrabWindow(window);
while ((t = yylex()) != EMPTY)
{
@@ -1840,13 +1847,15 @@ BOOL MACRO_ExecuteMacro(LPCSTR macro)
break;
default:
WINE_WARN("got unexpected type %s\n", ts(t));
- return 0;
+ YY_FLUSH_BUFFER;
+ ret = FALSE;
+ goto done;
}
switch (t = yylex())
{
case EMPTY: goto done;
case ';': break;
- default: ret = FALSE; goto done;
+ default: ret = FALSE; YY_FLUSH_BUFFER; goto done;
}
}
@@ -1854,10 +1863,16 @@ done:
for (t = 0; t < lex_data->cache_used; t++)
HeapFree(GetProcessHeap(), 0, lex_data->cache_string[t]);
lex_data = prev_lex_data;
+ WINHELP_ReleaseWindow(window);
return ret;
}
+WINHELP_WINDOW* MACRO_CurrentWindow(void)
+{
+ return lex_data ? lex_data->window : Globals.active_win;
+}
+
#ifndef yywrap
int yywrap(void) { return 1; }
#endif
diff --git a/reactos/base/applications/winhlp32/macro.c b/reactos/base/applications/winhlp32/macro.c
index 9e6e5f8865e..c2fc3ccc710 100644
--- a/reactos/base/applications/winhlp32/macro.c
+++ b/reactos/base/applications/winhlp32/macro.c
@@ -68,7 +68,7 @@ static WINHELP_BUTTON** MACRO_LookupButton(WINHELP_WINDOW* win, LPCSTR na
void CALLBACK MACRO_CreateButton(LPCSTR id, LPCSTR name, LPCSTR macro)
{
- WINHELP_WINDOW *win = Globals.active_win;
+ WINHELP_WINDOW *win = MACRO_CurrentWindow();
WINHELP_BUTTON *button, **b;
LONG size;
LPSTR ptr;
@@ -115,7 +115,7 @@ void CALLBACK MACRO_DisableButton(LPCSTR id)
WINE_TRACE("(\"%s\")\n", id);
- b = MACRO_LookupButton(Globals.active_win, id);
+ b = MACRO_LookupButton(MACRO_CurrentWindow(), id);
if (!*b) {WINE_FIXME("Couldn't find button '%s'\n", id); return;}
EnableWindow((*b)->hWnd, FALSE);
@@ -127,7 +127,7 @@ static void CALLBACK MACRO_EnableButton(LPCSTR id)
WINE_TRACE("(\"%s\")\n", id);
- b = MACRO_LookupButton(Globals.active_win, id);
+ b = MACRO_LookupButton(MACRO_CurrentWindow(), id);
if (!*b) {WINE_FIXME("Couldn't find button '%s'\n", id); return;}
EnableWindow((*b)->hWnd, TRUE);
@@ -172,7 +172,7 @@ static void CALLBACK MACRO_AppendItem(LPCSTR str1, LPCSTR str2, LPCSTR str3, LPC
static void CALLBACK MACRO_Back(void)
{
- WINHELP_WINDOW* win = Globals.active_win;
+ WINHELP_WINDOW* win = MACRO_CurrentWindow();
WINE_TRACE("()\n");
@@ -182,7 +182,7 @@ static void CALLBACK MACRO_Back(void)
static void CALLBACK MACRO_BackFlush(void)
{
- WINHELP_WINDOW* win = Globals.active_win;
+ WINHELP_WINDOW* win = MACRO_CurrentWindow();
WINE_TRACE("()\n");
@@ -201,7 +201,7 @@ static void CALLBACK MACRO_BookmarkMore(void)
static void CALLBACK MACRO_BrowseButtons(void)
{
- HLPFILE_PAGE* page = Globals.active_win->page;
+ HLPFILE_PAGE* page = MACRO_CurrentWindow()->page;
ULONG relative;
WINE_TRACE("()\n");
@@ -217,7 +217,7 @@ static void CALLBACK MACRO_BrowseButtons(void)
static void CALLBACK MACRO_ChangeButtonBinding(LPCSTR id, LPCSTR macro)
{
- WINHELP_WINDOW* win = Globals.active_win;
+ WINHELP_WINDOW* win = MACRO_CurrentWindow();
WINHELP_BUTTON* button;
WINHELP_BUTTON** b;
LONG size;
@@ -280,8 +280,8 @@ static void CALLBACK MACRO_CloseSecondarys(void)
WINE_TRACE("()\n");
for (win = Globals.win_list; win; win = win->next)
- if (win->lpszName && lstrcmpi(win->lpszName, "main"))
- DestroyWindow(win->hMainWnd);
+ if (lstrcmpi(win->info->name, "main"))
+ WINHELP_ReleaseWindow(win);
}
static void CALLBACK MACRO_CloseWindow(LPCSTR lpszWindow)
@@ -293,8 +293,8 @@ static void CALLBACK MACRO_CloseWindow(LPCSTR lpszWindow)
if (!lpszWindow || !lpszWindow[0]) lpszWindow = "main";
for (win = Globals.win_list; win; win = win->next)
- if (win->lpszName && !lstrcmpi(win->lpszName, lpszWindow))
- DestroyWindow(win->hMainWnd);
+ if (!lstrcmpi(win->info->name, lpszWindow))
+ WINHELP_ReleaseWindow(win);
}
static void CALLBACK MACRO_Compare(LPCSTR str)
@@ -304,10 +304,12 @@ static void CALLBACK MACRO_Compare(LPCSTR str)
static void CALLBACK MACRO_Contents(void)
{
+ HLPFILE_PAGE* page = MACRO_CurrentWindow()->page;
+
WINE_TRACE("()\n");
- if (Globals.active_win->page)
- MACRO_JumpContents(Globals.active_win->page->file->lpszPath, NULL);
+ if (page)
+ MACRO_JumpContents(page->file->lpszPath, NULL);
}
static void CALLBACK MACRO_ControlPanel(LPCSTR str1, LPCSTR str2, LONG u)
@@ -365,7 +367,7 @@ void CALLBACK MACRO_Exit(void)
WINE_TRACE("()\n");
while (Globals.win_list)
- DestroyWindow(Globals.win_list->hMainWnd);
+ WINHELP_ReleaseWindow(Globals.win_list);
}
static void CALLBACK MACRO_ExtAbleItem(LPCSTR str, LONG u)
@@ -428,7 +430,7 @@ static void CALLBACK MACRO_FocusWindow(LPCSTR lpszWindow)
if (!lpszWindow || !lpszWindow[0]) lpszWindow = "main";
for (win = Globals.win_list; win; win = win->next)
- if (win->lpszName && !lstrcmpi(win->lpszName, lpszWindow))
+ if (!lstrcmpi(win->info->name, lpszWindow))
SetFocus(win->hMainWnd);
}
@@ -447,7 +449,7 @@ void CALLBACK MACRO_HelpOn(void)
LPCSTR file;
WINE_TRACE("()\n");
- file = Globals.active_win->page->file->help_on_file;
+ file = MACRO_CurrentWindow()->page->file->help_on_file;
if (!file)
file = (Globals.wVersion > 4) ? "winhlp32.hlp" : "winhelp.hlp";
@@ -473,12 +475,13 @@ void CALLBACK MACRO_History(void)
static void CALLBACK MACRO_IfThen(BOOL b, LPCSTR t)
{
- if (b) MACRO_ExecuteMacro(t);
+ if (b) MACRO_ExecuteMacro(MACRO_CurrentWindow(), t);
}
static void CALLBACK MACRO_IfThenElse(BOOL b, LPCSTR t, LPCSTR f)
{
- if (b) MACRO_ExecuteMacro(t); else MACRO_ExecuteMacro(f);
+ if (b) MACRO_ExecuteMacro(MACRO_CurrentWindow(), t);
+ else MACRO_ExecuteMacro(MACRO_CurrentWindow(), f);
}
static BOOL CALLBACK MACRO_InitMPrint(void)
@@ -532,7 +535,10 @@ void CALLBACK MACRO_JumpHash(LPCSTR lpszPath, LPCSTR lpszWindow, LONG lHash)
HLPFILE* hlpfile;
WINE_TRACE("(\"%s\", \"%s\", %u)\n", lpszPath, lpszWindow, lHash);
- hlpfile = WINHELP_LookupHelpFile(lpszPath);
+ if (!lpszPath || !lpszPath[0])
+ hlpfile = MACRO_CurrentWindow()->page->file;
+ else
+ hlpfile = WINHELP_LookupHelpFile(lpszPath);
WINHELP_OpenHelpWindow(HLPFILE_PageByHash, hlpfile, lHash,
WINHELP_GetWindowInfo(hlpfile, lpszWindow),
SW_NORMAL);
@@ -599,12 +605,12 @@ static void CALLBACK MACRO_Next(void)
WINHELP_WNDPAGE wp;
WINE_TRACE("()\n");
- wp.page = Globals.active_win->page;
+ wp.page = MACRO_CurrentWindow()->page;
wp.page = HLPFILE_PageByOffset(wp.page->file, wp.page->browse_fwd, &wp.relative);
if (wp.page)
{
wp.page->file->wRefCount++;
- wp.wininfo = Globals.active_win->info;
+ wp.wininfo = MACRO_CurrentWindow()->info;
WINHELP_CreateHelpWindow(&wp, SW_NORMAL, TRUE);
}
}
@@ -639,12 +645,12 @@ static void CALLBACK MACRO_Prev(void)
WINHELP_WNDPAGE wp;
WINE_TRACE("()\n");
- wp.page = Globals.active_win->page;
+ wp.page = MACRO_CurrentWindow()->page;
wp.page = HLPFILE_PageByOffset(wp.page->file, wp.page->browse_bwd, &wp.relative);
if (wp.page)
{
wp.page->file->wRefCount++;
- wp.wininfo = Globals.active_win->info;
+ wp.wininfo = MACRO_CurrentWindow()->info;
WINHELP_CreateHelpWindow(&wp, SW_NORMAL, TRUE);
}
}
@@ -656,7 +662,7 @@ void CALLBACK MACRO_Print(void)
WINE_TRACE("()\n");
printer.lStructSize = sizeof(printer);
- printer.hwndOwner = Globals.active_win->hMainWnd;
+ printer.hwndOwner = MACRO_CurrentWindow()->hMainWnd;
printer.hInstance = Globals.hInstance;
printer.hDevMode = 0;
printer.hDevNames = 0;
@@ -774,19 +780,23 @@ void CALLBACK MACRO_SetContents(LPCSTR str, LONG u)
static void CALLBACK MACRO_SetHelpOnFile(LPCSTR str)
{
+ HLPFILE_PAGE* page = MACRO_CurrentWindow()->page;
+
WINE_TRACE("(\"%s\")\n", str);
- HeapFree(GetProcessHeap(), 0, Globals.active_win->page->file->help_on_file);
- Globals.active_win->page->file->help_on_file = HeapAlloc(GetProcessHeap(), 0, strlen(str) + 1);
- if (Globals.active_win->page->file->help_on_file)
- strcpy(Globals.active_win->page->file->help_on_file, str);
+ HeapFree(GetProcessHeap(), 0, page->file->help_on_file);
+ page->file->help_on_file = HeapAlloc(GetProcessHeap(), 0, strlen(str) + 1);
+ if (page->file->help_on_file)
+ strcpy(page->file->help_on_file, str);
}
static void CALLBACK MACRO_SetPopupColor(LONG r, LONG g, LONG b)
{
+ HLPFILE_PAGE* page = MACRO_CurrentWindow()->page;
+
WINE_TRACE("(%x, %x, %x)\n", r, g, b);
- Globals.active_win->page->file->has_popup_color = TRUE;
- Globals.active_win->page->file->popup_color = RGB(r, g, b);
+ page->file->has_popup_color = TRUE;
+ page->file->popup_color = RGB(r, g, b);
}
static void CALLBACK MACRO_ShellExecute(LPCSTR str1, LPCSTR str2, LONG u1, LONG u2, LPCSTR str3, LPCSTR str4)
@@ -911,7 +921,7 @@ static struct MacroDesc MACRO_Builtins[] = {
{"MPrintHash", NULL, 0, "U", (FARPROC)MACRO_MPrintHash},
{"MPrintID", NULL, 0, "S", (FARPROC)MACRO_MPrintID},
{"Next", NULL, 0, "", (FARPROC)MACRO_Next},
- {"NoShow", NULL, 0, "", (FARPROC)MACRO_NoShow},
+ {"NoShow", "NS", 0, "", (FARPROC)MACRO_NoShow},
{"PopupContext", "PC", 0, "SU", (FARPROC)MACRO_PopupContext},
{"PopupHash", NULL, 0, "SU", (FARPROC)MACRO_PopupHash},
{"PopupId", "PI", 0, "SS", (FARPROC)MACRO_PopupId},
diff --git a/reactos/base/applications/winhlp32/macro.h b/reactos/base/applications/winhlp32/macro.h
index 8b157197ca5..910782db60c 100644
--- a/reactos/base/applications/winhlp32/macro.h
+++ b/reactos/base/applications/winhlp32/macro.h
@@ -33,9 +33,11 @@ struct lexret {
};
extern struct lexret yylval;
+struct tagWinHelp;
-BOOL MACRO_ExecuteMacro(LPCSTR);
-int MACRO_Lookup(const char* name, struct lexret* lr);
+BOOL MACRO_ExecuteMacro(struct tagWinHelp*, LPCSTR);
+int MACRO_Lookup(const char* name, struct lexret* lr);
+struct tagWinHelp* MACRO_CurrentWindow(void);
enum token_types {EMPTY, VOID_FUNCTION, BOOL_FUNCTION, INTEGER, STRING, IDENTIFIER};
void CALLBACK MACRO_About(void);
diff --git a/reactos/base/applications/winhlp32/macro.lex.l b/reactos/base/applications/winhlp32/macro.lex.l
index f3366b02bbd..67926cb9c63 100644
--- a/reactos/base/applications/winhlp32/macro.lex.l
+++ b/reactos/base/applications/winhlp32/macro.lex.l
@@ -25,12 +25,17 @@
%{
#include "config.h"
#include
+#include
#ifndef HAVE_UNISTD_H
#define YY_NO_UNISTD_H
#endif
-#include "macro.h"
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winhelp.h"
#include "wine/debug.h"
@@ -43,6 +48,7 @@ struct lex_data {
unsigned quote_stk_idx;
LPSTR cache_string[32];
int cache_used;
+ WINHELP_WINDOW* window;
};
static struct lex_data* lex_data = NULL;
@@ -266,7 +272,7 @@ static int MACRO_CallVoidFunc(FARPROC fn, const char* args)
return 1;
}
-BOOL MACRO_ExecuteMacro(LPCSTR macro)
+BOOL MACRO_ExecuteMacro(WINHELP_WINDOW* window, LPCSTR macro)
{
struct lex_data curr_lex_data, *prev_lex_data;
BOOL ret = TRUE;
@@ -279,6 +285,7 @@ BOOL MACRO_ExecuteMacro(LPCSTR macro)
memset(lex_data, 0, sizeof(*lex_data));
lex_data->macroptr = macro;
+ lex_data->window = WINHELP_GrabWindow(window);
while ((t = yylex()) != EMPTY)
{
@@ -293,13 +300,15 @@ BOOL MACRO_ExecuteMacro(LPCSTR macro)
break;
default:
WINE_WARN("got unexpected type %s\n", ts(t));
- return 0;
+ YY_FLUSH_BUFFER;
+ ret = FALSE;
+ goto done;
}
switch (t = yylex())
{
case EMPTY: goto done;
case ';': break;
- default: ret = FALSE; goto done;
+ default: ret = FALSE; YY_FLUSH_BUFFER; goto done;
}
}
@@ -307,10 +316,16 @@ done:
for (t = 0; t < lex_data->cache_used; t++)
HeapFree(GetProcessHeap(), 0, lex_data->cache_string[t]);
lex_data = prev_lex_data;
+ WINHELP_ReleaseWindow(window);
return ret;
}
+WINHELP_WINDOW* MACRO_CurrentWindow(void)
+{
+ return lex_data ? lex_data->window : Globals.active_win;
+}
+
#ifndef yywrap
int yywrap(void) { return 1; }
#endif
diff --git a/reactos/base/applications/winhlp32/rsrc.rc b/reactos/base/applications/winhlp32/rsrc.rc
index 35db516b15d..39652f4d2cb 100644
--- a/reactos/base/applications/winhlp32/rsrc.rc
+++ b/reactos/base/applications/winhlp32/rsrc.rc
@@ -19,38 +19,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include
-#include
-
-#include "winhelp.h"
#include "winhelp_res.h"
/* @makedep: winhelp.ico */
IDI_WINHELP ICON DISCARDABLE winhelp.ico
-
-#include "lang/bg-BG.rc"
-#include "lang/cs-CZ.rc"
-#include "lang/da-DK.rc"
-#include "lang/de-DE.rc"
-// #include "lang/el-GR.rc"
-#include "lang/en-US.rc"
-#include "lang/es-ES.rc"
-#include "lang/fi-FI.rc"
-#include "lang/fr-FR.rc"
-#include "lang/hu-HU.rc"
-#include "lang/it-IT.rc"
-#include "lang/ja-JP.rc"
-#include "lang/ko-KR.rc"
-#include "lang/lt-LT.rc"
-#include "lang/nl-NL.rc"
-#include "lang/no-NO.rc"
-#include "lang/pl-PL.rc"
-#include "lang/pt-BR.rc"
-// #include "lang/rm-CH.rc"
-#include "lang/ru-RU.rc"
-#include "lang/sl-SI.rc"
-#include "lang/sk-SK.rc"
-#include "lang/sv-SE.rc"
-#include "lang/tr-TR.rc"
-#include "lang/uk-UA.rc"
-#include "lang/zh-CN.rc"
diff --git a/reactos/base/applications/winhlp32/winhelp.c b/reactos/base/applications/winhlp32/winhelp.c
index 7f74d8b75df..56244d35aec 100644
--- a/reactos/base/applications/winhlp32/winhelp.c
+++ b/reactos/base/applications/winhlp32/winhelp.c
@@ -257,11 +257,11 @@ HLPFILE_WINDOWINFO* WINHELP_GetWindowInfo(HLPFILE* hlpfile, LPCSTR name)
unsigned int i;
if (!name || !name[0])
- name = Globals.active_win->lpszName;
+ name = Globals.active_win->info->name;
if (hlpfile)
for (i = 0; i < hlpfile->numWindows; i++)
- if (!strcmp(hlpfile->windows[i].name, name))
+ if (!lstrcmpi(hlpfile->windows[i].name, name))
return &hlpfile->windows[i];
if (strcmp(name, "main") != 0)
@@ -274,11 +274,19 @@ HLPFILE_WINDOWINFO* WINHELP_GetWindowInfo(HLPFILE* hlpfile, LPCSTR name)
{
strcpy(mwi.type, "primary");
strcpy(mwi.name, "main");
- LoadString(Globals.hInstance, STID_WINE_HELP, mwi.caption, sizeof(mwi.caption));
+ if (hlpfile && hlpfile->lpszTitle[0])
+ {
+ char tmp[128];
+ LoadString(Globals.hInstance, STID_WINE_HELP, tmp, sizeof(tmp));
+ snprintf(mwi.caption, sizeof(mwi.caption), "%s %s - %s",
+ hlpfile->lpszTitle, tmp, hlpfile->lpszPath);
+ }
+ else
+ LoadString(Globals.hInstance, STID_WINE_HELP, mwi.caption, sizeof(mwi.caption));
mwi.origin.x = mwi.origin.y = mwi.size.cx = mwi.size.cy = CW_USEDEFAULT;
mwi.style = SW_SHOW;
mwi.win_style = WS_OVERLAPPEDWINDOW;
- mwi.sr_color = mwi.sr_color = 0xFFFFFF;
+ mwi.sr_color = mwi.nsr_color = 0xFFFFFF;
}
return &mwi;
}
@@ -498,6 +506,33 @@ static void WINHELP_DeletePageLinks(HLPFILE_PAGE* page)
}
}
+/***********************************************************************
+ *
+ * WINHELP_GrabWindow
+ */
+WINHELP_WINDOW* WINHELP_GrabWindow(WINHELP_WINDOW* win)
+{
+ WINE_TRACE("Grab %p#%d++\n", win, win->ref_count);
+ win->ref_count++;
+ return win;
+}
+
+/***********************************************************************
+ *
+ * WINHELP_RelaseWindow
+ */
+BOOL WINHELP_ReleaseWindow(WINHELP_WINDOW* win)
+{
+ WINE_TRACE("Release %p#%d--\n", win, win->ref_count);
+
+ if (!--win->ref_count)
+ {
+ DestroyWindow(win->hMainWnd);
+ return FALSE;
+ }
+ return TRUE;
+}
+
/***********************************************************************
*
* WINHELP_DeleteWindow
@@ -505,6 +540,7 @@ static void WINHELP_DeletePageLinks(HLPFILE_PAGE* page)
static void WINHELP_DeleteWindow(WINHELP_WINDOW* win)
{
WINHELP_WINDOW** w;
+ BOOL bExit;
for (w = &Globals.win_list; *w; w = &(*w)->next)
{
@@ -514,6 +550,7 @@ static void WINHELP_DeleteWindow(WINHELP_WINDOW* win)
break;
}
}
+ bExit = (Globals.wVersion >= 4 && !lstrcmpi(win->info->name, "main"));
if (Globals.active_win == win)
{
@@ -537,6 +574,10 @@ static void WINHELP_DeleteWindow(WINHELP_WINDOW* win)
if (win->page) HLPFILE_FreeHlpFile(win->page->file);
HeapFree(GetProcessHeap(), 0, win);
+
+ if (bExit) MACRO_Exit();
+ if (!Globals.win_list)
+ PostQuitMessage(0);
}
static char* WINHELP_GetCaption(WINHELP_WNDPAGE* wpage)
@@ -645,7 +686,6 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
{
WINHELP_WINDOW* win = NULL;
BOOL bPrimary, bPopup, bReUsed = FALSE;
- LPSTR name;
HICON hIcon;
HWND hTextWnd = NULL;
@@ -656,7 +696,7 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
{
for (win = Globals.win_list; win; win = win->next)
{
- if (!lstrcmpi(win->lpszName, wpage->wininfo->name))
+ if (!lstrcmpi(win->info->name, wpage->wininfo->name))
{
POINT pt = {0, 0};
SIZE sz = {0, 0};
@@ -699,21 +739,19 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
if (!win)
{
/* Initialize WINHELP_WINDOW struct */
- win = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof(WINHELP_WINDOW) + strlen(wpage->wininfo->name) + 1);
+ win = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINHELP_WINDOW));
if (!win) return FALSE;
win->next = Globals.win_list;
Globals.win_list = win;
- name = (char*)win + sizeof(WINHELP_WINDOW);
- lstrcpy(name, wpage->wininfo->name);
- win->lpszName = name;
win->hHandCur = LoadCursorW(0, (LPWSTR)IDC_HAND);
win->back.index = 0;
win->font_scale = 1;
+ WINHELP_GrabWindow(win);
}
win->page = wpage->page;
win->info = wpage->wininfo;
+ WINHELP_GrabWindow(win);
if (!bPopup && wpage->page && remember)
{
@@ -772,11 +810,19 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
{
HLPFILE_MACRO *macro;
for (macro = wpage->page->file->first_macro; macro; macro = macro->next)
- MACRO_ExecuteMacro(macro->lpszMacro);
+ MACRO_ExecuteMacro(win, macro->lpszMacro);
for (macro = wpage->page->first_macro; macro; macro = macro->next)
- MACRO_ExecuteMacro(macro->lpszMacro);
+ MACRO_ExecuteMacro(win, macro->lpszMacro);
}
+ /* See #17681, in some cases, the newly created window is closed by the macros it contains
+ * (braindead), so deal with this case
+ */
+ for (win = Globals.win_list; win; win = win->next)
+ {
+ if (!lstrcmpi(win->info->name, wpage->wininfo->name)) break;
+ }
+ if (!win || !WINHELP_ReleaseWindow(win)) return TRUE;
if (bPopup)
{
@@ -870,7 +916,7 @@ static BOOL WINHELP_HandleTextMouse(WINHELP_WINDOW* win, UINT msg, LPARAM lParam
SW_NORMAL);
break;
case hlp_link_macro:
- MACRO_ExecuteMacro(link->string);
+ MACRO_ExecuteMacro(win, link->string);
break;
default:
WINE_FIXME("Unknown link cookie %d\n", link->cookie);
@@ -888,7 +934,7 @@ static BOOL WINHELP_HandleTextMouse(WINHELP_WINDOW* win, UINT msg, LPARAM lParam
*/
static BOOL WINHELP_CheckPopup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* lret)
{
- HWND hPopup;
+ WINHELP_WINDOW* popup;
if (!Globals.active_popup) return FALSE;
@@ -921,9 +967,9 @@ static BOOL WINHELP_CheckPopup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam
case WM_NCLBUTTONDOWN:
case WM_NCMBUTTONDOWN:
case WM_NCRBUTTONDOWN:
- hPopup = Globals.active_popup->hMainWnd;
+ popup = Globals.active_popup;
Globals.active_popup = NULL;
- DestroyWindow(hPopup);
+ WINHELP_ReleaseWindow(popup);
return TRUE;
}
return FALSE;
@@ -1368,7 +1414,7 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
for (button = win->first_button; button; button = button->next)
if (wParam == button->wParam) break;
if (button)
- MACRO_ExecuteMacro(button->lpszMacro);
+ MACRO_ExecuteMacro(win, button->lpszMacro);
else if (!HIWORD(wParam))
MessageBox(0, MAKEINTRESOURCE(STID_NOT_IMPLEMENTED),
MAKEINTRESOURCE(STID_WHERROR), MB_OK);
@@ -1427,7 +1473,8 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
switch (msgf->msg)
{
case WM_KEYUP:
- if (msgf->wParam == VK_ESCAPE) DestroyWindow(hWnd);
+ if (msgf->wParam == VK_ESCAPE)
+ WINHELP_ReleaseWindow((WINHELP_WINDOW*)GetWindowLongPtr(hWnd, 0));
break;
case WM_RBUTTONDOWN:
{
@@ -1491,18 +1538,9 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
CheckMenuItem((HMENU)wParam, MNID_OPTS_FONTS_LARGE,
MF_BYCOMMAND | (win->font_scale == 2) ? MF_CHECKED : 0);
break;
-
- case WM_NCDESTROY:
- {
- BOOL bExit;
- win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
- bExit = (Globals.wVersion >= 4 && !lstrcmpi(win->lpszName, "main"));
- WINHELP_DeleteWindow(win);
-
- if (bExit) MACRO_Exit();
- if (!Globals.win_list)
- PostQuitMessage(0);
- }
+ case WM_DESTROY:
+ win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
+ WINHELP_DeleteWindow(win);
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
@@ -1698,7 +1736,7 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show)
WINHELP_GetWindowInfo(hlpfile, wndname), show);
/* Message loop */
- while (GetMessage(&msg, 0, 0, 0))
+ while ((Globals.win_list || Globals.active_popup) && GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
diff --git a/reactos/base/applications/winhlp32/winhelp.h b/reactos/base/applications/winhlp32/winhelp.h
index 994547bf31b..e770cb5794b 100644
--- a/reactos/base/applications/winhlp32/winhelp.h
+++ b/reactos/base/applications/winhlp32/winhelp.h
@@ -71,8 +71,7 @@ typedef struct tagPageSet
typedef struct tagWinHelp
{
- LPCSTR lpszName;
-
+ unsigned ref_count;
WINHELP_BUTTON* first_button;
HLPFILE_PAGE* page;
@@ -153,6 +152,8 @@ void WINHELP_DeleteBackSet(WINHELP_WINDOW*);
HLPFILE* WINHELP_LookupHelpFile(LPCSTR lpszFile);
HLPFILE_WINDOWINFO* WINHELP_GetWindowInfo(HLPFILE* hlpfile, LPCSTR name);
void WINHELP_LayoutMainWindow(WINHELP_WINDOW* win);
+WINHELP_WINDOW* WINHELP_GrabWindow(WINHELP_WINDOW*);
+BOOL WINHELP_ReleaseWindow(WINHELP_WINDOW*);
extern const char MAIN_WIN_CLASS_NAME[];
extern const char BUTTON_BOX_WIN_CLASS_NAME[];
diff --git a/reactos/base/applications/winhlp32/winhelp_res.h b/reactos/base/applications/winhlp32/winhelp_res.h
index e1c72ff54e0..ba2f9799d25 100644
--- a/reactos/base/applications/winhlp32/winhelp_res.h
+++ b/reactos/base/applications/winhlp32/winhelp_res.h
@@ -1,3 +1,6 @@
+#include
+#include
+
#define MNID_FILE_OPEN 0x101
#define MNID_FILE_PRINT 0x104
#define MNID_FILE_SETUP 0x106
diff --git a/reactos/base/applications/winhlp32/winhlp32.rbuild b/reactos/base/applications/winhlp32/winhlp32.rbuild
index c76d847eb79..77d8c69a914 100644
--- a/reactos/base/applications/winhlp32/winhlp32.rbuild
+++ b/reactos/base/applications/winhlp32/winhlp32.rbuild
@@ -6,17 +6,40 @@
wine
- comdlg32
- comctl32
- shell32
user32
gdi32
kernel32
+ shell32
+ comctl32
+ comdlg32
callback.c
hlpfile.c
macro.c
string.c
winhelp.c
lex.yy.c
+ Bg.rc
+ Cs.rc
+ Da.rc
+ De.rc
+ En.rc
+ Es.rc
+ Fi.rc
+ Fr.rc
+ Hu.rc
+ It.rc
+ Ja.rc
+ Ko.rc
+ Lt.rc
+ Nl.rc
+ No.rc
+ Pl.rc
+ Pt.rc
+ Rm.rc
+ Ru.rc
+ Si.rc
+ Sk.rc
+ Sv.rc
+ Tr.rc
rsrc.rc
diff --git a/reactos/base/applications/wordpad/Da.rc b/reactos/base/applications/wordpad/Da.rc
index d09e90f9b72..34789469e5e 100644
--- a/reactos/base/applications/wordpad/Da.rc
+++ b/reactos/base/applications/wordpad/Da.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
IDM_MAINMENU MENU DISCARDABLE
diff --git a/reactos/base/applications/wordpad/De.rc b/reactos/base/applications/wordpad/De.rc
index 5b4b176a905..18181b2efba 100644
--- a/reactos/base/applications/wordpad/De.rc
+++ b/reactos/base/applications/wordpad/De.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
#pragma code_page(65001)
@@ -242,6 +244,5 @@ BEGIN
STRING_OPEN_FAILED, "Die Datei konnte nicht geöffnet werden."
STRING_OPEN_ACCESS_DENIED, "Sie haben keine ausreichende Zugriffsberechtigung um die Datei zu öffnen."
STRING_PRINTING_NOT_IMPLEMENTED, "Drucken ist nicht implementiert"
+ STRING_MAX_TAB_STOPS, "Es können nur maximal 32 Tabstopps definiert werden."
END
-
-#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/En.rc b/reactos/base/applications/wordpad/En.rc
index dd099e13349..b6ade3aaf3d 100644
--- a/reactos/base/applications/wordpad/En.rc
+++ b/reactos/base/applications/wordpad/En.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
IDM_MAINMENU MENU DISCARDABLE
@@ -177,10 +179,14 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_RICHTEXT_FILES_RTF, "Rich text format (*.rtf)"
+ STRING_ALL_FILES, "All documents (*.*)"
STRING_TEXT_FILES_TXT, "Text documents (*.txt)"
STRING_TEXT_FILES_UNICODE_TXT, "Unicode text document (*.txt)"
- STRING_ALL_FILES, "All documents (*.*)"
+ STRING_RICHTEXT_FILES_RTF, "Rich text format (*.rtf)"
+ STRING_NEWFILE_RICHTEXT, "Rich text document"
+ STRING_NEWFILE_TXT, "Text document"
+ STRING_NEWFILE_TXT_UNICODE, "Unicode text document"
+ STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)"
END
STRINGTABLE DISCARDABLE
@@ -190,18 +196,6 @@ BEGIN
STRING_ALIGN_CENTER, "Center"
END
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_NEWFILE_RICHTEXT, "Rich text document"
- STRING_NEWFILE_TXT, "Text document"
- STRING_NEWFILE_TXT_UNICODE, "Unicode text document"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)"
-END
-
STRINGTABLE DISCARDABLE
BEGIN
STRING_VIEWPROPS_TITLE, "Options"
@@ -217,11 +211,7 @@ BEGIN
STRING_PREVIEW_TWOPAGES, "Two pages"
STRING_PREVIEW_ONEPAGE, "One page"
STRING_PREVIEW_CLOSE, "Close"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_UNITS_CM, "cm"
+ STRING_UNITS_CM, "cm"
END
STRINGTABLE DISCARDABLE
@@ -242,3 +232,12 @@ BEGIN
STRING_PRINTING_NOT_IMPLEMENTED, "Printing not implemented"
STRING_MAX_TAB_STOPS, "Cannot add more than 32 tab stops."
END
+
+LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ STRING_ALIGN_LEFT, "Left"
+ STRING_ALIGN_RIGHT, "Right"
+ STRING_ALIGN_CENTER, "Centre"
+END
diff --git a/reactos/base/applications/wordpad/Fr.rc b/reactos/base/applications/wordpad/Fr.rc
index 459dd0ed82b..9691c0b0cc3 100644
--- a/reactos/base/applications/wordpad/Fr.rc
+++ b/reactos/base/applications/wordpad/Fr.rc
@@ -1,5 +1,5 @@
/*
- * Copyright 2006-2007 by Jonathan Ernst
+ * Copyright 2006-2009 by Jonathan Ernst
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -16,6 +16,11 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
IDM_MAINMENU MENU DISCARDABLE
@@ -28,44 +33,44 @@ BEGIN
MENUITEM "Enregistrer &sous...", ID_FILE_SAVEAS
MENUITEM SEPARATOR
MENUITEM "&Imprimer...\tCtrl+P", ID_PRINT
- MENUITEM "A&peru avant impression...", ID_PREVIEW
+ MENUITEM "A&perçu avant impression...", ID_PREVIEW
MENUITEM "&Mise en page...", ID_PRINTSETUP
MENUITEM SEPARATOR
MENUITEM "&Quitter", ID_FILE_EXIT
END
- POPUP "&dition"
+ POPUP "É&dition"
BEGIN
MENUITEM "&Annuler\tCtrl+Z", ID_EDIT_UNDO
- MENUITEM "&Rtablir\tCtrl+Y", ID_EDIT_REDO
+ MENUITEM "&Rétablir\tCtrl+Y", ID_EDIT_REDO
MENUITEM SEPARATOR
MENUITEM "&Couper\tCtrl+X", ID_EDIT_CUT
MENUITEM "Co&pier\tCtrl+C", ID_EDIT_COPY
MENUITEM "C&oller\tCtrl+V", ID_EDIT_PASTE
MENUITEM "&Effacer\tDel", ID_EDIT_CLEAR
- MENUITEM "&Slectionner tout\tCtrl+A", ID_EDIT_SELECTALL
+ MENUITEM "&Sélectionner tout\tCtrl+A", ID_EDIT_SELECTALL
MENUITEM SEPARATOR
MENUITEM "&Rechercher...\tCrtl+F", ID_FIND
MENUITEM "Rechercher le &suivant\tF3", ID_FIND_NEXT
MENUITEM "&Remplacer...\tCtrl+H", ID_REPLACE
MENUITEM SEPARATOR
- MENUITEM "Lecture-&seule", ID_EDIT_READONLY
- MENUITEM "&Modifi", ID_EDIT_MODIFIED
+ MENUITEM "Lecture &seule", ID_EDIT_READONLY
+ MENUITEM "&Modifié", ID_EDIT_MODIFIED
MENUITEM SEPARATOR
- POPUP "&Avancs"
+ POPUP "&Avancé"
BEGIN
- MENUITEM "&Information slection", ID_EDIT_SELECTIONINFO
- MENUITEM "&Format caractres", ID_EDIT_CHARFORMAT
- MENUITEM "&Df. format car.", ID_EDIT_DEFCHARFORMAT
+ MENUITEM "&Information sélection", ID_EDIT_SELECTIONINFO
+ MENUITEM "&Format caractères", ID_EDIT_CHARFORMAT
+ MENUITEM "&Déf. format car.", ID_EDIT_DEFCHARFORMAT
MENUITEM "Format paragrap&he", ID_EDIT_PARAFORMAT
- MENUITEM "&Recevoir texte", ID_EDIT_GETTEXT
+ MENUITEM "Texte &complet", ID_EDIT_GETTEXT
END
END
POPUP "&Affichage"
BEGIN
MENUITEM "&Barre d'outils", ID_TOGGLE_TOOLBAR
MENUITEM "&Barre de format", ID_TOGGLE_FORMATBAR
- MENUITEM "&Rgle", ID_TOGGLE_RULER
- MENUITEM "&Barre d'tat", ID_TOGGLE_STATUSBAR
+ MENUITEM "&Règle", ID_TOGGLE_RULER
+ MENUITEM "&Barre d'état", ID_TOGGLE_STATUSBAR
MENUITEM SEPARATOR
MENUITEM "&Options...", ID_VIEWPROPERTIES
END
@@ -76,18 +81,18 @@ BEGIN
POPUP "Forma&t"
BEGIN
MENUITEM "&Police...", ID_FONTSETTINGS
- MENUITEM "&Puces" ID_BULLET
- MENUITEM "&Paragraphe..." ID_PARAFORMAT
+ MENUITEM "Pu&ces" ID_BULLET
+ MENUITEM "Para&graphe..." ID_PARAFORMAT
MENUITEM "&Tabulations..." ID_TABSTOPS
- POPUP "&Fond"
+ POPUP "&Arrière-plan"
BEGIN
- MENUITEM "&Systme\tCtrl+1", ID_BACK_1
- MENUITEM "&Jaunasse\tCtrl+2", ID_BACK_2
+ MENUITEM "&Système\tCtrl+1", ID_BACK_1
+ MENUITEM "&Jaune pâle\tCtrl+2", ID_BACK_2
END
END
POPUP "Aid&e"
BEGIN
- MENUITEM " &propos du Wordpad de Wine" ID_ABOUT
+ MENUITEM "À &propos du Wordpad de Wine" ID_ABOUT
END
END
@@ -99,8 +104,8 @@ BEGIN
MENUITEM "Co&pier", ID_EDIT_COPY
MENUITEM "C&oller", ID_EDIT_PASTE
MENUITEM SEPARATOR
- MENUITEM "&Puces" ID_BULLET
- MENUITEM "&Paragraphe" ID_PARAFORMAT
+ MENUITEM "P&uces" ID_BULLET
+ MENUITEM "Para&graphe" ID_PARAFORMAT
END
END
@@ -136,7 +141,7 @@ BEGIN
EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13
LTEXT "Droite", -1, 15, 40, 40, 13
EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13
- LTEXT "Premire ligne", -1, 15, 58, 40, 18
+ LTEXT "Première ligne", -1, 15, 58, 40, 18
EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13
LTEXT "Alignement", -1, 15, 87, 40, 13
COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST
@@ -149,13 +154,13 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
Caption "Tabulations"
FONT 8, "MS SHell DLg"
BEGIN
- GROUPBOX "Arrts de tabulation", -1, 10, 10, 120, 90
+ GROUPBOX "Taquets de tabulation", -1, 10, 10, 120, 90
COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE
- DEFPUSHBUTTON "&Ajouter", ID_TAB_ADD, 20, 80, 45, 15
+ DEFPUSHBUTTON "A&jouter", ID_TAB_ADD, 20, 80, 45, 15
PUSHBUTTON "&Supprimer", ID_TAB_DEL, 72, 80, 45, 15
- PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15
- PUSHBUTTON "&Annuler", IDCANCEL, 137, 33, 50, 15
- PUSHBUTTON "Supprimer &tous", ID_TAB_EMPTY, 137, 51, 50, 15
+ PUSHBUTTON "&OK", IDOK, 137, 15, 56, 15
+ PUSHBUTTON "&Annuler", IDCANCEL, 137, 33, 56, 15
+ PUSHBUTTON "Supprimer &tous", ID_TAB_EMPTY, 137, 51, 56, 15
END
IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110
@@ -163,23 +168,23 @@ STYLE DS_SYSMODAL
Caption ""
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX "Enveloppement de ligne", -1, 10, 10, 170, 85
- RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 145, 15
- RADIOBUTTON "Enveloppe le texte partir de la bordure de fentre", IDC_PAGEFMT_WW, 18, 45, 145, 15
- RADIOBUTTON "Enveloppe le texte partir de la &marge", IDC_PAGEFMT_WM, 18, 65, 145, 15
- GROUPBOX "Barres d'outils", -1, 170, 10, 120, 85
- CHECKBOX "&Barre d'outils", IDC_PAGEFMT_TB, 180, 20, 80, 15
- CHECKBOX "Barre de &format", IDC_PAGEFMT_FB, 180, 38, 80, 15
- CHECKBOX "&Rgle", IDC_PAGEFMT_RU, 180, 56, 80, 15
- CHECKBOX "Barre de &statut", IDC_PAGEFMT_SB, 180, 74, 80, 15
+ GROUPBOX "Passage à la ligne automatique", -1, 10, 10, 140, 85
+ RADIOBUTTON "&Aucun", IDC_PAGEFMT_WN, 18, 25, 127, 15
+ RADIOBUTTON "Au niveau de la bordure de fe&nêtre", IDC_PAGEFMT_WW, 18, 45, 127, 15
+ RADIOBUTTON "Au niveau de la &marge", IDC_PAGEFMT_WM, 18, 65, 127, 15
+ GROUPBOX "Barres d'outils", -1, 156, 10, 115, 85
+ CHECKBOX "&Barre d'outils", IDC_PAGEFMT_TB, 166, 20, 80, 15
+ CHECKBOX "Barre de &format", IDC_PAGEFMT_FB, 166, 38, 80, 15
+ CHECKBOX "&Règle", IDC_PAGEFMT_RU, 166, 56, 80, 15
+ CHECKBOX "Barre de &statut", IDC_PAGEFMT_SB, 166, 74, 80, 15
LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0
END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_RICHTEXT_FILES_RTF, "Documents texte riche (*.rtf)"
+ STRING_RICHTEXT_FILES_RTF, "Format de texte enrichi (*.rtf)"
STRING_TEXT_FILES_TXT, "Documents texte (*.txt)"
- STRING_TEXT_FILES_UNICODE_TXT, "Documents texte unicode (*.txt)"
+ STRING_TEXT_FILES_UNICODE_TXT, "Documents texte Unicode (*.txt)"
STRING_ALL_FILES, "Tous les documents (*.*)"
END
@@ -192,9 +197,9 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_NEWFILE_RICHTEXT, "Document texte riche"
+ STRING_NEWFILE_RICHTEXT, "Format de texte enrichi (RTF)"
STRING_NEWFILE_TXT, "Document texte"
- STRING_NEWFILE_TXT_UNICODE, "Document texte unicode"
+ STRING_NEWFILE_TXT_UNICODE, "Document texte Unicode"
END
STRINGTABLE DISCARDABLE
@@ -213,7 +218,7 @@ STRINGTABLE DISCARDABLE
BEGIN
STRING_PREVIEW_PRINT, "Imprimer"
STRING_PREVIEW_NEXTPAGE, "Page suivante"
- STRING_PREVIEW_PREVPAGE, "Page prcdente"
+ STRING_PREVIEW_PREVPAGE, "Page précédente"
STRING_PREVIEW_TWOPAGES, "Deux pages"
STRING_PREVIEW_ONEPAGE, "Une page"
STRING_PREVIEW_CLOSE, "Fermer"
@@ -227,17 +232,18 @@ END
STRINGTABLE DISCARDABLE
BEGIN
STRING_DEFAULT_FILENAME, "Document"
- STRING_PROMPT_SAVE_CHANGES, "Enregistrer les modifications de %s?"
- STRING_SEARCH_FINISHED, "Recherche termine dans le document."
- STRING_LOAD_RICHED_FAILED, "Impossible de charger la bibliothque RichEdit."
+ STRING_PROMPT_SAVE_CHANGES, "Enregistrer les modifications de « %s » ?"
+ STRING_SEARCH_FINISHED, "Recherche terminée dans le document."
+ STRING_LOAD_RICHED_FAILED, "Impossible de charger la bibliothèque RichEdit."
STRING_SAVE_LOSEFORMATTING, "Vous avez choisi d'enregistrer en texte simple, " \
"ce qui causera la perte de tout formattage. " \
- "Voulez-vous vraiment continuer?"
+ "Voulez-vous vraiment continuer ?"
STRING_INVALID_NUMBER, "Format de nombre invalide"
- STRING_OLE_STORAGE_NOT_SUPPORTED, "Les documents conteneur OLE ne sont pas supports"
+ STRING_OLE_STORAGE_NOT_SUPPORTED, "Les documents conteneur OLE ne sont pas supportés"
STRING_WRITE_FAILED, "Impossible d'enregistrer le fichier."
- STRING_WRITE_ACCESS_DENIED, "Vous ne disposez pas des accs ncessaires l'enregistrement du fichier."
+ STRING_WRITE_ACCESS_DENIED, "Vous ne disposez pas des accès nécessaires à l'enregistrement du fichier."
STRING_OPEN_FAILED, "Impossible d'ouvrir le fichier."
- STRING_OPEN_ACCESS_DENIED, "Vous ne disposez pas des accs ncessaires l'ouverture du fichier."
- STRING_PRINTING_NOT_IMPLEMENTED, "L'impression n'est pas implmente"
+ STRING_OPEN_ACCESS_DENIED, "Vous ne disposez pas des accès nécessaires à l'ouverture du fichier."
+ STRING_PRINTING_NOT_IMPLEMENTED, "L'impression n'est pas implémentée"
+ STRING_MAX_TAB_STOPS, "Impossible d'ajouter plus de 32 taquets de tabulation."
END
diff --git a/reactos/base/applications/wordpad/Hu.rc b/reactos/base/applications/wordpad/Hu.rc
index 94ceda5a789..74926e1e597 100644
--- a/reactos/base/applications/wordpad/Hu.rc
+++ b/reactos/base/applications/wordpad/Hu.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
IDM_MAINMENU MENU DISCARDABLE
diff --git a/reactos/base/applications/wordpad/Ja.rc b/reactos/base/applications/wordpad/Ja.rc
index 09e48aafdf5..fc21c5a4e74 100644
--- a/reactos/base/applications/wordpad/Ja.rc
+++ b/reactos/base/applications/wordpad/Ja.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
/* UTF-8 */
#pragma code_page(65001)
@@ -242,6 +244,6 @@ BEGIN
STRING_WRITE_ACCESS_DENIED, "ファイルに保存する権限がありません。"
STRING_OPEN_FAILED, "ファイルを開けません。"
STRING_OPEN_ACCESS_DENIED, "ファイルを開く権限がありません。"
+ STRING_PRINTING_NOT_IMPLEMENTED, "プリントが実装されていません。"
+ STRING_MAX_TAB_STOPS, "32以上なタブを追加できません。"
END
-
-#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/Ko.rc b/reactos/base/applications/wordpad/Ko.rc
index 7bfaf00e767..58235857018 100644
--- a/reactos/base/applications/wordpad/Ko.rc
+++ b/reactos/base/applications/wordpad/Ko.rc
@@ -17,6 +17,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
diff --git a/reactos/base/applications/wordpad/Lt.rc b/reactos/base/applications/wordpad/Lt.rc
new file mode 100644
index 00000000000..91fbfcaba91
--- /dev/null
+++ b/reactos/base/applications/wordpad/Lt.rc
@@ -0,0 +1,249 @@
+/*
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * 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 "wordpad.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+IDM_MAINMENU MENU DISCARDABLE
+BEGIN
+ POPUP "&Failas"
+ BEGIN
+ MENUITEM "&Naujas...\tCtrl+N", ID_FILE_NEW
+ MENUITEM "&Atverti...\tCtrl+O", ID_FILE_OPEN
+ MENUITEM "&Išsaugoti\tCtrl+S", ID_FILE_SAVE
+ MENUITEM "Išsaugoti &kaip...", ID_FILE_SAVEAS
+ MENUITEM SEPARATOR
+ MENUITEM "S&pausdinti...\tCtrl+P", ID_PRINT
+ MENUITEM "Spaudinio pe&ržiūra...", ID_PREVIEW
+ MENUITEM "Puslapio n&uostatos...", ID_PRINTSETUP
+ MENUITEM SEPARATOR
+ MENUITEM "Iš&eiti", ID_FILE_EXIT
+ END
+ POPUP "&Taisa"
+ BEGIN
+ MENUITEM "&Atšaukti\tCtrl+Z", ID_EDIT_UNDO
+ MENUITEM "&Grąžinti\tCtrl+Y", ID_EDIT_REDO
+ MENUITEM SEPARATOR
+ MENUITEM "&Iškirpti\tCtrl+X", ID_EDIT_CUT
+ MENUITEM "&Kopijuoti\tCtrl+C", ID_EDIT_COPY
+ MENUITEM "Į&dėti\tCtrl+V", ID_EDIT_PASTE
+ MENUITEM "&Šalinti\tDEL", ID_EDIT_CLEAR
+ MENUITEM "&Pažymėti viską\tCtrl+A", ID_EDIT_SELECTALL
+ MENUITEM SEPARATOR
+ MENUITEM "I&eškoti...\tCrtl+F", ID_FIND
+ MENUITEM "Iešk&oti kito\tF3", ID_FIND_NEXT
+ MENUITEM "Pa&keisti...\tCtrl+H", ID_REPLACE
+ MENUITEM SEPARATOR
+ MENUITEM "Tik skait&ymui", ID_EDIT_READONLY
+ MENUITEM "&Modifikuotas", ID_EDIT_MODIFIED
+ MENUITEM SEPARATOR
+ POPUP "Papi&ldomi"
+ BEGIN
+ MENUITEM "Žymėjimo &informacija", ID_EDIT_SELECTIONINFO
+ MENUITEM "Rašmenų &formatas", ID_EDIT_CHARFORMAT
+ MENUITEM "&Numatytas rašmenų formatas", ID_EDIT_DEFCHARFORMAT
+ MENUITEM "&Pastraipos formatas", ID_EDIT_PARAFORMAT
+ MENUITEM "&Gauti tekstą", ID_EDIT_GETTEXT
+ END
+ END
+ POPUP "&Rodymas"
+ BEGIN
+ MENUITEM "&Įrankių juosta", ID_TOGGLE_TOOLBAR
+ MENUITEM "&Formatų juosta", ID_TOGGLE_FORMATBAR
+ MENUITEM "&Liniuotė", ID_TOGGLE_RULER
+ MENUITEM "&Būsenos juosta", ID_TOGGLE_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Parinktys...", ID_VIEWPROPERTIES
+ END
+ POPUP "Įter&pimas"
+ BEGIN
+ MENUITEM "&Data ir laikas...", ID_DATETIME
+ END
+ POPUP "F&ormatas"
+ BEGIN
+ MENUITEM "&Šriftas...", ID_FONTSETTINGS
+ MENUITEM "&Ženkleliai" ID_BULLET
+ MENUITEM "&Pastraipa..." ID_PARAFORMAT
+ MENUITEM "&Tabuliavimo žymės..." ID_TABSTOPS
+ POPUP "&Fonas"
+ BEGIN
+ MENUITEM "&Sistemos\tCtrl+1", ID_BACK_1
+ MENUITEM "&Gelsvas\tCtrl+2", ID_BACK_2
+ END
+ END
+ POPUP "&Žinynas"
+ BEGIN
+ MENUITEM "&Apie Wine Wordpad" ID_ABOUT
+ END
+END
+
+IDM_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Iškirpti", ID_EDIT_CUT
+ MENUITEM "&Kopijuoti", ID_EDIT_COPY
+ MENUITEM "Į&dėti", ID_EDIT_PASTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Ženkleliai" ID_BULLET
+ MENUITEM "&Pastraipa..." ID_PARAFORMAT
+ END
+END
+
+IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "Data ir laikas"
+FONT 10, "MS Sans Serif"
+BEGIN
+ LTEXT "Galimi formatai",-1,3,2,100,15
+ LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY
+ PUSHBUTTON "&Gerai",IDOK,87,12,40,12
+ PUSHBUTTON "&Atsisakyti",IDCANCEL,87,26,40,12
+END
+
+IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "Naujas"
+FONT 10, "MS Sans Serif"
+BEGIN
+ LTEXT "Naujo dokumento tipas",-1,3,2,100,15
+ LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT
+ PUSHBUTTON "&Gerai",IDOK,97,12,40,12
+ PUSHBUTTON "&Atsisakyti",IDCANCEL,97,26,40,12
+END
+
+IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+Caption "Pastraipos formatas"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Įtrauka", -1, 10, 10, 120, 68
+ LTEXT "Iš kairės", -1, 15, 22, 45, 13
+ EDITTEXT IDC_PARA_LEFT, 60, 20, 55, 13
+ LTEXT "Iš dešinės", -1, 15, 40, 45, 13
+ EDITTEXT IDC_PARA_RIGHT, 60, 38, 55, 13
+ LTEXT "Pirmoji eilutė", -1, 15, 58, 45, 13
+ EDITTEXT IDC_PARA_FIRST, 60, 56, 55, 13
+ LTEXT "Lygiuotė", -1, 15, 87, 40, 13
+ COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST
+ PUSHBUTTON "&Gerai", IDOK, 137, 15, 50, 15
+ PUSHBUTTON "&Atsisakyti", IDCANCEL, 137, 33, 50, 15
+END
+
+IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+Caption "Tabuliavimo žymės"
+FONT 8, "MS SHell DLg"
+BEGIN
+ GROUPBOX "Tabuliavimo pozicija", -1, 10, 10, 120, 90
+ COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE
+ DEFPUSHBUTTON "&Pridėti", ID_TAB_ADD, 20, 80, 45, 15
+ PUSHBUTTON "Pa&šalinti", ID_TAB_DEL, 72, 80, 45, 15
+ PUSHBUTTON "&Gerai", IDOK, 137, 15, 50, 15
+ PUSHBUTTON "&Atsisakyti", IDCANCEL, 137, 33, 50, 15
+ PUSHBUTTON "Pašalinti &visas", ID_TAB_EMPTY, 137, 51, 50, 15
+END
+
+IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110
+STYLE DS_SYSMODAL
+Caption ""
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Eilutės skaidymas", -1, 10, 10, 130, 85
+ RADIOBUTTON "&Eilutės neskaidomos", IDC_PAGEFMT_WN, 18, 25, 117, 15
+ RADIOBUTTON "Skaidyti tekstą prie lango &rėmelio", IDC_PAGEFMT_WW, 18, 45, 117, 15
+ RADIOBUTTON "Skaidyti tekstą prie ¶štės", IDC_PAGEFMT_WM, 18, 65, 117, 15
+ GROUPBOX "Įrankių juostos", -1, 150, 10, 120, 85
+ CHECKBOX "Įran&kių juosta", IDC_PAGEFMT_TB, 160, 20, 80, 15
+ CHECKBOX "&Formatų juosta", IDC_PAGEFMT_FB, 160, 38, 80, 15
+ CHECKBOX "&Liniuotė", IDC_PAGEFMT_RU, 160, 56, 80, 15
+ CHECKBOX "&Būsenos juosta", IDC_PAGEFMT_SB, 160, 74, 80, 15
+ LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ STRING_RICHTEXT_FILES_RTF, "Raiškiojo teksto dokumentai (*.rtf)"
+ STRING_TEXT_FILES_TXT, "Tekstiniai dokumentai (*.txt)"
+ STRING_TEXT_FILES_UNICODE_TXT, "Teksto unikodu dokumentai (*.txt)"
+ STRING_ALL_FILES, "Visi dokumentai (*.*)"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ STRING_ALIGN_LEFT, "Kairinė"
+ STRING_ALIGN_RIGHT, "Dešininė"
+ STRING_ALIGN_CENTER, "Centrinė"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ STRING_NEWFILE_RICHTEXT, "Raiškiojo teksto dokumentas"
+ STRING_NEWFILE_TXT, "Tekstinis dokumentas"
+ STRING_NEWFILE_TXT_UNICODE, "Teksto unikodu dokumentas"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ STRING_PRINTER_FILES_PRN, "Spausdintuvo failai (*.PRN)"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ STRING_VIEWPROPS_TITLE, "Parinktys"
+ STRING_VIEWPROPS_TEXT, "Tekstas"
+ STRING_VIEWPROPS_RICHTEXT, "Raiškusis tekstas"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ STRING_PREVIEW_PRINT, "Spausdinti"
+ STRING_PREVIEW_NEXTPAGE, "Tolesnis puslapis"
+ STRING_PREVIEW_PREVPAGE, "Ankstesnis puslapis"
+ STRING_PREVIEW_TWOPAGES, "Du puslapiai"
+ STRING_PREVIEW_ONEPAGE, "Vienas puslapis"
+ STRING_PREVIEW_CLOSE, "Užverti"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ STRING_UNITS_CM, "cm"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ STRING_DEFAULT_FILENAME, "Dokumentas"
+ STRING_PROMPT_SAVE_CHANGES, "Išsaugoti „%s“ pakeitimus?"
+ STRING_SEARCH_FINISHED, "Paieška dokumente baigta."
+ STRING_LOAD_RICHED_FAILED, "Nepavyko įkelti RichEdit bibliotekos."
+ STRING_SAVE_LOSEFORMATTING, "Jūs pasirinkote išsaugoti paprasto teksto formatu, " \
+ "todėl bus prarastas visas formatavimas. " \
+ "Ar tikrai norite tai padaryti?"
+ STRING_INVALID_NUMBER, "Neteisingas skaičiaus formatas"
+ STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE saugyklos dokumentai yra nepalaikomi"
+ STRING_WRITE_FAILED, "Nepavyko išsaugoti failo."
+ STRING_WRITE_ACCESS_DENIED, "Jūs neturite prieigos failui išsaugoti."
+ STRING_OPEN_FAILED, "Nepavyko atverti failo."
+ STRING_OPEN_ACCESS_DENIED, "Jūs neturite prieigos failui atverti."
+ STRING_PRINTING_NOT_IMPLEMENTED, "Spausdinimas nerealizuotas"
+ STRING_MAX_TAB_STOPS, "Negalima pridėti daugiau negu 32-jų tabuliavimo pozicijų."
+END
diff --git a/reactos/base/applications/wordpad/Nl.rc b/reactos/base/applications/wordpad/Nl.rc
index c91e028c3e4..c9ce64a4b29 100644
--- a/reactos/base/applications/wordpad/Nl.rc
+++ b/reactos/base/applications/wordpad/Nl.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
IDM_MAINMENU MENU DISCARDABLE
diff --git a/reactos/base/applications/wordpad/No.rc b/reactos/base/applications/wordpad/No.rc
index 6261c6fb81d..5a4fdbf8c30 100644
--- a/reactos/base/applications/wordpad/No.rc
+++ b/reactos/base/applications/wordpad/No.rc
@@ -1,5 +1,5 @@
/*
- * Copyright 2006-2008 by Alexander N. Srnes
+ * Copyright 2006-2009 by Alexander N. Sørnes
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -16,6 +16,10 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
+#pragma code_page(65001)
+
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
IDM_MAINMENU MENU DISCARDABLE
@@ -23,12 +27,12 @@ BEGIN
POPUP "&Fil"
BEGIN
MENUITEM "&Ny...\tCtrl+N", ID_FILE_NEW
- MENUITEM "&pne...\tCtrl+O", ID_FILE_OPEN
+ MENUITEM "&Åpne...\tCtrl+O", ID_FILE_OPEN
MENUITEM "&Lagre\tCtrl+S", ID_FILE_SAVE
MENUITEM "Lagre &som...", ID_FILE_SAVEAS
MENUITEM SEPARATOR
MENUITEM "&Skriv ut...\tCtrl+P", ID_PRINT
- MENUITEM "&Forhndsvisning...", ID_PREVIEW
+ MENUITEM "&Forhåndsvisning...", ID_PREVIEW
MENUITEM "&Utskriftformat...", ID_PRINTSETUP
MENUITEM SEPARATOR
MENUITEM "&Avslutt", ID_FILE_EXIT
@@ -44,8 +48,8 @@ BEGIN
MENUITEM "&Fjern\tDEL", ID_EDIT_CLEAR
MENUITEM "&Merk alt\tCtrl+A", ID_EDIT_SELECTALL
MENUITEM SEPARATOR
- MENUITEM "&Sk etter...\tCrtl+F", ID_FIND
- MENUITEM "Sk etter &neste\tF3", ID_FIND_NEXT
+ MENUITEM "&Søk etter...\tCrtl+F", ID_FIND
+ MENUITEM "Søk etter &neste\tF3", ID_FIND_NEXT
MENUITEM "E&rstatt...\tCtrl+H", ID_REPLACE
MENUITEM SEPARATOR
MENUITEM "S&krivebeskyttet", ID_EDIT_READONLY
@@ -53,7 +57,7 @@ BEGIN
MENUITEM SEPARATOR
POPUP "&Ekstra"
BEGIN
- MENUITEM "&Info om merket omrde", ID_EDIT_SELECTIONINFO
+ MENUITEM "&Info om merket område", ID_EDIT_SELECTIONINFO
MENUITEM "Tegn&format", ID_EDIT_CHARFORMAT
MENUITEM "Stan&dard tegnformat", ID_EDIT_DEFCHARFORMAT
MENUITEM "&Avsnittformat", ID_EDIT_PARAFORMAT
@@ -62,7 +66,7 @@ BEGIN
END
POPUP "&Vis"
BEGIN
- MENUITEM "Verk&tylinje", ID_TOGGLE_TOOLBAR
+ MENUITEM "Verk&tøylinje", ID_TOGGLE_TOOLBAR
MENUITEM "&Formatlinje", ID_TOGGLE_FORMATBAR
MENUITEM "&Linjal", ID_TOGGLE_RULER
MENUITEM "&Statuslinje", ID_TOGGLE_STATUSBAR
@@ -134,9 +138,9 @@ BEGIN
GROUPBOX "Innrykk", -1, 10, 10, 120, 68
LTEXT "Venstre", -1, 15, 22, 40, 13
EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13
- LTEXT "Hyre", -1, 15, 40, 40, 13
+ LTEXT "Høyre", -1, 15, 40, 40, 13
EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13
- LTEXT "Frste linje", -1, 15, 58, 40, 13
+ LTEXT "Første linje", -1, 15, 58, 40, 13
EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13
LTEXT "Justering", -1, 15, 87, 40, 13
COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST
@@ -167,8 +171,8 @@ BEGIN
RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15
RADIOBUTTON "Bryt tekst etter v&indusbredden", IDC_PAGEFMT_WW, 18, 45, 117, 15
RADIOBUTTON "Bryt tekst etter &margen", IDC_PAGEFMT_WM, 18, 65, 117, 15
- GROUPBOX "Verktylinjer", -1, 150, 10, 120, 85
- CHECKBOX "&Verktylinje", IDC_PAGEFMT_TB, 160, 20, 80, 15
+ GROUPBOX "Verktøylinjer", -1, 150, 10, 120, 85
+ CHECKBOX "&Verktøylinje", IDC_PAGEFMT_TB, 160, 20, 80, 15
CHECKBOX "&Formatlinje", IDC_PAGEFMT_FB, 160, 38, 80, 15
CHECKBOX "&Linjal", IDC_PAGEFMT_RU, 160, 56, 80, 15
CHECKBOX "&Statuslinje", IDC_PAGEFMT_SB, 160, 74, 80, 15
@@ -193,7 +197,7 @@ END
STRINGTABLE DISCARDABLE
BEGIN
STRING_ALIGN_LEFT, "Venstrestilt"
- STRING_ALIGN_RIGHT, "Hyrestilt"
+ STRING_ALIGN_RIGHT, "Høyrestilt"
STRING_ALIGN_CENTER, "Midtstilt"
END
@@ -215,7 +219,7 @@ BEGIN
STRING_PREVIEW_NEXTPAGE, "Neste side"
STRING_PREVIEW_PREVPAGE, "Forrige side"
STRING_PREVIEW_TWOPAGES, "To sider"
- STRING_PREVIEW_ONEPAGE, "n side"
+ STRING_PREVIEW_ONEPAGE, "Én side"
STRING_PREVIEW_CLOSE, "Lukk"
END
@@ -227,16 +231,18 @@ END
STRINGTABLE DISCARDABLE
BEGIN
STRING_DEFAULT_FILENAME, "Dokument"
- STRING_PROMPT_SAVE_CHANGES, "Lagre endringer i %s?"
- STRING_SEARCH_FINISHED, "Ferdig med ske i dokumentet."
+ STRING_PROMPT_SAVE_CHANGES, "Lagre endringer i «%s»?"
+ STRING_SEARCH_FINISHED, "Ferdig med å søke i dokumentet."
STRING_LOAD_RICHED_FAILED, "Klarte ikke laste RichEdit-biblioteket."
- STRING_SAVE_LOSEFORMATTING, "Du har valgt lagre i rent tekstformat, noe som " \
- "vil fre til at all formatering gr tapt. Er du " \
- "sikker p at du vil fortsette?"
+ STRING_SAVE_LOSEFORMATTING, "Du har valgt å lagre i rent tekstformat, noe som " \
+ "vil føre til at all formatering går tapt. Er du " \
+ "sikker på at du vil fortsette?"
STRING_INVALID_NUMBER, "Ugyldig tallformat"
STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage documents are not supported"
STRING_WRITE_FAILED, "Klarte ikke lagre filen."
- STRING_WRITE_ACCESS_DENIED, "Du har ikke tilgang til lagre filen."
- STRING_OPEN_FAILED, "Klarte ikke pne filen."
- STRING_OPEN_ACCESS_DENIED, "Du har ikke tilgang til pne filen."
+ STRING_WRITE_ACCESS_DENIED, "Du har ikke tilgang til å lagre filen."
+ STRING_OPEN_FAILED, "Klarte ikke åpne filen."
+ STRING_OPEN_ACCESS_DENIED, "Du har ikke tilgang til å åpne filen."
+ STRING_PRINTING_NOT_IMPLEMENTED, "Utskriftfunksjonen er ikke laget ennå."
+ STRING_MAX_TAB_STOPS, "Kan ikke legge til mer enn 32 tabulatorstopp."
END
diff --git a/reactos/base/applications/wordpad/Pl.rc b/reactos/base/applications/wordpad/Pl.rc
index 47ff1bd0e3f..ab72104e5d0 100644
--- a/reactos/base/applications/wordpad/Pl.rc
+++ b/reactos/base/applications/wordpad/Pl.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
IDM_MAINMENU MENU DISCARDABLE
diff --git a/reactos/base/applications/wordpad/Pt.rc b/reactos/base/applications/wordpad/Pt.rc
index b246c700bcd..fd512c9f1aa 100644
--- a/reactos/base/applications/wordpad/Pt.rc
+++ b/reactos/base/applications/wordpad/Pt.rc
@@ -18,7 +18,11 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
+#include "wordpad.h"
+
+#pragma code_page(65001)
+
+LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
IDM_MAINMENU MENU DISCARDABLE
BEGIN
@@ -30,8 +34,8 @@ BEGIN
MENUITEM "Guardar &como...", ID_FILE_SAVEAS
MENUITEM SEPARATOR
MENUITEM "&Imprimir...\tCtrl+P", ID_PRINT
- MENUITEM "&Pr visualizar...", ID_PREVIEW
- MENUITEM "C&onfigurar pgina...", ID_PRINTSETUP
+ MENUITEM "&Pré visualizar...", ID_PREVIEW
+ MENUITEM "C&onfigurar página...", ID_PRINTSETUP
MENUITEM SEPARATOR
MENUITEM "&Sair", ID_FILE_EXIT
END
@@ -55,21 +59,21 @@ BEGIN
MENUITEM SEPARATOR
POPUP "E&xtras"
BEGIN
- MENUITEM "&Informao da seleco", ID_EDIT_SELECTIONINFO
+ MENUITEM "&Informação da selecção", ID_EDIT_SELECTIONINFO
MENUITEM "&Formato dos caracteres", ID_EDIT_CHARFORMAT
MENUITEM "&Definir formato dos caracteres", ID_EDIT_DEFCHARFORMAT
- MENUITEM "F&ormato dos pargrafos", ID_EDIT_PARAFORMAT
+ MENUITEM "F&ormato dos parágrafos", ID_EDIT_PARAFORMAT
MENUITEM "&Buscar texto", ID_EDIT_GETTEXT
END
END
POPUP "&Ver"
BEGIN
MENUITEM "&Barra de Ferramentas", ID_TOGGLE_TOOLBAR
- MENUITEM "Barra de &Formatao", ID_TOGGLE_FORMATBAR
- MENUITEM "&Rgua", ID_TOGGLE_RULER
+ MENUITEM "Barra de &Formatação", ID_TOGGLE_FORMATBAR
+ MENUITEM "&Régua", ID_TOGGLE_RULER
MENUITEM "Barra de &Estado", ID_TOGGLE_STATUSBAR
MENUITEM SEPARATOR
- MENUITEM "&Opes...", ID_VIEWPROPERTIES
+ MENUITEM "&Opções...", ID_VIEWPROPERTIES
END
POPUP "&Inserir"
BEGIN
@@ -79,8 +83,8 @@ BEGIN
BEGIN
MENUITEM "&Tipo de Letra...", ID_FONTSETTINGS
MENUITEM "&Lista de marcas" ID_BULLET
- MENUITEM "&Pargrafo..." ID_PARAFORMAT
- MENUITEM "T&abulaes..." ID_TABSTOPS
+ MENUITEM "&Parágrafo..." ID_PARAFORMAT
+ MENUITEM "T&abulações..." ID_TABSTOPS
POPUP "&Fundo"
BEGIN
MENUITEM "&Sistema\tCtrl+1", ID_BACK_1
@@ -102,7 +106,7 @@ BEGIN
MENUITEM "Co&lar", ID_EDIT_PASTE
MENUITEM SEPARATOR
MENUITEM "&Lista de marcas" ID_BULLET
- MENUITEM "&Pargrafo..." ID_PARAFORMAT
+ MENUITEM "&Parágrafo..." ID_PARAFORMAT
END
END
@@ -111,7 +115,7 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Data e hora"
FONT 10, "MS Sans Serif"
BEGIN
- LTEXT "Formatos Disponveis",-1,3,2,100,15
+ LTEXT "Formatos Disponíveis",-1,3,2,100,15
LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY
PUSHBUTTON "&OK",IDOK,87,12,40,12
PUSHBUTTON "&Cancelar",IDCANCEL,87,26,40,12
@@ -130,10 +134,10 @@ END
IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-Caption "Pargrafo"
+Caption "Parágrafo"
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX "Identao", -1, 10, 10, 120, 68
+ GROUPBOX "Identação", -1, 10, 10, 120, 68
LTEXT "Esquerda", -1, 15, 22, 40, 13
EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13
LTEXT "Direita", -1, 15, 40, 40, 13
@@ -148,10 +152,10 @@ END
IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-Caption "Tabulaes"
+Caption "Tabulações"
FONT 8, "MS SHell DLg"
BEGIN
- GROUPBOX "Marca de tabulao", -1, 10, 10, 120, 90
+ GROUPBOX "Marca de tabulação", -1, 10, 10, 120, 90
COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE
DEFPUSHBUTTON "&Adicionar", ID_TAB_ADD, 20, 80, 45, 15
PUSHBUTTON "&Remover", ID_TAB_DEL, 72, 80, 45, 15
@@ -167,12 +171,12 @@ FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Moldar o texto", -1, 10, 10, 130, 85
RADIOBUTTON "&Sem moldagem", IDC_PAGEFMT_WN, 18, 25, 117, 15
- RADIOBUTTON "&Moldar janela", IDC_PAGEFMT_WW, 18, 45, 117, 15
- RADIOBUTTON "Moldar pela &rgua", IDC_PAGEFMT_WM, 18, 65, 117, 15
+ RADIOBUTTON "&Moldar à janela", IDC_PAGEFMT_WW, 18, 45, 117, 15
+ RADIOBUTTON "Moldar pela &régua", IDC_PAGEFMT_WM, 18, 65, 117, 15
GROUPBOX "Barras de Ferramentas", -1, 150, 10, 120, 85
CHECKBOX "&Barra de Ferramentas", IDC_PAGEFMT_TB, 160, 20, 90, 15
- CHECKBOX "Barra de &Formatao", IDC_PAGEFMT_FB, 160, 38, 90, 15
- CHECKBOX "&Rgua", IDC_PAGEFMT_RU, 160, 56, 90, 15
+ CHECKBOX "Barra de &Formatação", IDC_PAGEFMT_FB, 160, 38, 90, 15
+ CHECKBOX "&Régua", IDC_PAGEFMT_RU, 160, 56, 90, 15
CHECKBOX "Barra de &Estado", IDC_PAGEFMT_SB, 160, 74, 90, 15
LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0
END
@@ -206,7 +210,7 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_VIEWPROPS_TITLE, "Opes"
+ STRING_VIEWPROPS_TITLE, "Opções"
STRING_VIEWPROPS_TEXT, "Texto"
STRING_VIEWPROPS_RICHTEXT, "Rich text"
END
@@ -214,10 +218,10 @@ END
STRINGTABLE DISCARDABLE
BEGIN
STRING_PREVIEW_PRINT, "Imprimir"
- STRING_PREVIEW_NEXTPAGE, "Prxima pgina"
- STRING_PREVIEW_PREVPAGE, "Pgina anterior"
- STRING_PREVIEW_TWOPAGES, "Duas pginas"
- STRING_PREVIEW_ONEPAGE, "Uma pgina"
+ STRING_PREVIEW_NEXTPAGE, "Próxima página"
+ STRING_PREVIEW_PREVPAGE, "Página anterior"
+ STRING_PREVIEW_TWOPAGES, "Duas páginas"
+ STRING_PREVIEW_ONEPAGE, "Uma página"
STRING_PREVIEW_CLOSE, "Fechar"
END
@@ -229,17 +233,18 @@ END
STRINGTABLE DISCARDABLE
BEGIN
STRING_DEFAULT_FILENAME, "Documento"
- STRING_PROMPT_SAVE_CHANGES, "Guardar alteraes a '%s'?"
+ STRING_PROMPT_SAVE_CHANGES, "Guardar alterações a '%s'?"
STRING_SEARCH_FINISHED, "Acabou a pesquisa do documento."
STRING_LOAD_RICHED_FAILED, "Falhou o carregamento da biblioteca RichEdit."
STRING_SAVE_LOSEFORMATTING, "Escolheu guardar em formato de texto simples, " \
- "o que vai anular todas as formataes. " \
+ "o que vai anular todas as formatações. " \
"Tem a certeza que quer fazer isto?"
- STRING_INVALID_NUMBER, "Formato de nmero invlido"
- STRING_OLE_STORAGE_NOT_SUPPORTED, "Documentos OLE no so suportados"
- STRING_WRITE_FAILED, "No foi possvel guardar o ficheiro."
- STRING_WRITE_ACCESS_DENIED, "No tem permisses para guardar o ficheiro."
- STRING_OPEN_FAILED, "No foi possvel abrir o ficheiro."
- STRING_OPEN_ACCESS_DENIED, "No tem permisses para abrir o ficheiro."
- STRING_PRINTING_NOT_IMPLEMENTED, "Impresso no implementada"
+ STRING_INVALID_NUMBER, "Formato de número inválido"
+ STRING_OLE_STORAGE_NOT_SUPPORTED, "Documentos OLE não são suportados"
+ STRING_WRITE_FAILED, "Não foi possível guardar o ficheiro."
+ STRING_WRITE_ACCESS_DENIED, "Não tem permissões para guardar o ficheiro."
+ STRING_OPEN_FAILED, "Não foi possível abrir o ficheiro."
+ STRING_OPEN_ACCESS_DENIED, "Não tem permissões para abrir o ficheiro."
+ STRING_PRINTING_NOT_IMPLEMENTED, "Impressão não implementada"
+ STRING_MAX_TAB_STOPS, "Não pode adicionar mais de 32 tabs."
END
diff --git a/reactos/base/applications/wordpad/Ru.rc b/reactos/base/applications/wordpad/Ru.rc
index e4371993991..6428f7b1a0d 100644
--- a/reactos/base/applications/wordpad/Ru.rc
+++ b/reactos/base/applications/wordpad/Ru.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
IDM_MAINMENU MENU DISCARDABLE
diff --git a/reactos/base/applications/wordpad/Si.rc b/reactos/base/applications/wordpad/Si.rc
index 3be81b82c45..1b6d37fd41c 100644
--- a/reactos/base/applications/wordpad/Si.rc
+++ b/reactos/base/applications/wordpad/Si.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
#pragma code_page(65001)
LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
@@ -242,7 +244,6 @@ BEGIN
STRING_WRITE_ACCESS_DENIED, "Nimate pravic za shranjevanje te datoteke."
STRING_OPEN_FAILED, "Napaka pri odpiranju datoteke."
STRING_OPEN_ACCESS_DENIED, "Nimate pravic za odpiranje te datoteke."
- STRING_PRINTING_NOT_IMPLEMENTED, "Tiskanje (še) ni na voljo"
+ STRING_PRINTING_NOT_IMPLEMENTED, "Tiskanje (še) ni na voljo"
+ STRING_MAX_TAB_STOPS, "Ne morem vstaviti več kot 32 položajev tabulatorja."
END
-
-#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/Sv.rc b/reactos/base/applications/wordpad/Sv.rc
index 4bb2ae24557..d94e6e3d190 100644
--- a/reactos/base/applications/wordpad/Sv.rc
+++ b/reactos/base/applications/wordpad/Sv.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
#pragma code_page(65001)
@@ -244,5 +246,3 @@ BEGIN
STRING_PRINTING_NOT_IMPLEMENTED, "Utskrift ej implementerat."
STRING_MAX_TAB_STOPS, "Kan ej lägga till mer än 32 tabbstopp."
END
-
-#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/Tr.rc b/reactos/base/applications/wordpad/Tr.rc
index 7df9a36fb7a..92290371d37 100644
--- a/reactos/base/applications/wordpad/Tr.rc
+++ b/reactos/base/applications/wordpad/Tr.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
IDM_MAINMENU MENU DISCARDABLE
diff --git a/reactos/base/applications/wordpad/Zh.rc b/reactos/base/applications/wordpad/Zh.rc
index 5c11ab79963..d8ceec43a1a 100644
--- a/reactos/base/applications/wordpad/Zh.rc
+++ b/reactos/base/applications/wordpad/Zh.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wordpad.h"
+
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@@ -469,5 +471,3 @@ BEGIN
STRING_OPEN_FAILED, "不能開啟檔案."
STRING_OPEN_ACCESS_DENIED, "你沒有開啟檔案的權力."
END
-
-#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/rsrc.rc b/reactos/base/applications/wordpad/rsrc.rc
index 1a77fe27be1..ac159da8916 100644
--- a/reactos/base/applications/wordpad/rsrc.rc
+++ b/reactos/base/applications/wordpad/rsrc.rc
@@ -17,9 +17,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include
-#include
-
#include "wordpad.h"
MAINACCELTABLE ACCELERATORS
@@ -63,20 +60,3 @@ IDI_WRI ICON "wri.ico"
/* @makedep: txt.ico */
IDI_TXT ICON "txt.ico"
-
-#include "Da.rc"
-#include "De.rc"
-#include "En.rc"
-#include "Fr.rc"
-#include "Hu.rc"
-#include "Ja.rc"
-#include "Ko.rc"
-#include "Nl.rc"
-#include "No.rc"
-#include "Pl.rc"
-#include "Pt.rc"
-#include "Ru.rc"
-#include "Si.rc"
-#include "Sv.rc"
-#include "Tr.rc"
-#include "Zh.rc"
diff --git a/reactos/base/applications/wordpad/wordpad.h b/reactos/base/applications/wordpad/wordpad.h
index ece183fc1c2..b51bec8fcb0 100644
--- a/reactos/base/applications/wordpad/wordpad.h
+++ b/reactos/base/applications/wordpad/wordpad.h
@@ -17,6 +17,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include
+#include
+
#define MAX_STRING_LEN 255
#define TWIPS_PER_INCH 1440
@@ -169,24 +172,24 @@
#define STRING_NEWFILE_TXT 1405
#define STRING_NEWFILE_TXT_UNICODE 1406
-#define STRING_ALIGN_LEFT 1407
-#define STRING_ALIGN_RIGHT 1408
-#define STRING_ALIGN_CENTER 1409
+#define STRING_PRINTER_FILES_PRN 1407
-#define STRING_PRINTER_FILES_PRN 1410
+#define STRING_ALIGN_LEFT 1416
+#define STRING_ALIGN_RIGHT 1417
+#define STRING_ALIGN_CENTER 1418
-#define STRING_VIEWPROPS_TITLE 1411
-#define STRING_VIEWPROPS_TEXT 1412
-#define STRING_VIEWPROPS_RICHTEXT 1413
+#define STRING_VIEWPROPS_TITLE 1432
+#define STRING_VIEWPROPS_TEXT 1433
+#define STRING_VIEWPROPS_RICHTEXT 1434
-#define STRING_PREVIEW_PRINT 1414
-#define STRING_PREVIEW_NEXTPAGE 1415
-#define STRING_PREVIEW_PREVPAGE 1416
-#define STRING_PREVIEW_TWOPAGES 1417
-#define STRING_PREVIEW_ONEPAGE 1418
-#define STRING_PREVIEW_CLOSE 1419
+#define STRING_PREVIEW_PRINT 1448
+#define STRING_PREVIEW_NEXTPAGE 1449
+#define STRING_PREVIEW_PREVPAGE 1450
+#define STRING_PREVIEW_TWOPAGES 1451
+#define STRING_PREVIEW_ONEPAGE 1452
+#define STRING_PREVIEW_CLOSE 1453
-#define STRING_UNITS_CM 1420
+#define STRING_UNITS_CM 1454
#define STRING_DEFAULT_FILENAME 1700
#define STRING_PROMPT_SAVE_CHANGES 1701
diff --git a/reactos/base/applications/wordpad/wordpad.rbuild b/reactos/base/applications/wordpad/wordpad.rbuild
index f5b7a54c481..454d01bd42c 100644
--- a/reactos/base/applications/wordpad/wordpad.rbuild
+++ b/reactos/base/applications/wordpad/wordpad.rbuild
@@ -10,10 +10,25 @@
advapi32
kernel32
comctl32
-
- print.c
- registry.c
- wordpad.c
-
+ print.c
+ registry.c
+ wordpad.c
+ Da.rc
+ De.rc
+ En.rc
+ Fr.rc
+ Hu.rc
+ Ja.rc
+ Ko.rc
+ Lt.rc
+ Nl.rc
+ No.rc
+ Pl.rc
+ Pt.rc
+ Ru.rc
+ Si.rc
+ Sv.rc
+ Tr.rc
+ Zh.rc
rsrc.rc
diff --git a/reactos/base/applications/cmdutils/xcopy/rsrc.rc b/reactos/base/applications/write/De.rc
similarity index 68%
rename from reactos/base/applications/cmdutils/xcopy/rsrc.rc
rename to reactos/base/applications/write/De.rc
index a62f34cf19a..db175a02d56 100644
--- a/reactos/base/applications/cmdutils/xcopy/rsrc.rc
+++ b/reactos/base/applications/write/De.rc
@@ -1,5 +1,6 @@
/*
- * Copyright 2007 Jason Edmeades
+ * Copyright (C) 2007 Mikolaj Zalewski
+ * Copyright (C) 2008 Michael Stefaniuc
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -16,23 +17,13 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include
+#include "resources.h"
-#include "xcopy.h"
+#pragma code_page(65001)
-LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
-#include "Bg.rc"
-#include "Da.rc"
-#include "De.rc"
-#include "El.rc"
-#include "En.rc"
-#include "Fr.rc"
-#include "It.rc"
-#include "Ko.rc"
-#include "Nl.rc"
-#include "No.rc"
-#include "Pl.rc"
-#include "Pt.rc"
-#include "Ru.rc"
-#include "Si.rc"
+STRINGTABLE
+{
+ IDS_FAILED, "Der Start von Wordpad ist fehlgeschlagen"
+}
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg.rc b/reactos/base/applications/write/En.rc
similarity index 75%
rename from reactos/dll/win32/cryptdlg/cryptdlg.rc
rename to reactos/base/applications/write/En.rc
index e8156531dcc..715957846c1 100644
--- a/reactos/dll/win32/cryptdlg/cryptdlg.rc
+++ b/reactos/base/applications/write/En.rc
@@ -1,7 +1,7 @@
/*
- * cryptdlg dll resources
+ * English language support
*
- * Copyright 2008 Juan Lang
+ * Copyright (C) 2007 Mikolaj Zalewski
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -17,12 +17,12 @@
* 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 "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "cryptres.h"
-#include "cryptdlg_En.rc"
-#include "cryptdlg_Fr.rc"
-#include "cryptdlg_Ko.rc"
-#include "cryptdlg_Nl.rc"
+#include "resources.h"
+
+LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
+
+STRINGTABLE
+{
+ IDS_FAILED, "Starting Wordpad failed"
+}
diff --git a/reactos/dll/win32/crypt32/crypt32.rc b/reactos/base/applications/write/Fr.rc
similarity index 67%
rename from reactos/dll/win32/crypt32/crypt32.rc
rename to reactos/base/applications/write/Fr.rc
index 1afa8a75296..a81dffda827 100644
--- a/reactos/dll/win32/crypt32/crypt32.rc
+++ b/reactos/base/applications/write/Fr.rc
@@ -1,7 +1,7 @@
/*
- * crypt32 dll resources
+ * French language support
*
- * Copyright (C) 2006 Juan Lang
+ * Copyright (C) 2007 Jonathan Ernst
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -17,18 +17,14 @@
* 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 "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "cryptres.h"
-#include "version.rc"
+#include "resources.h"
-#include "crypt32_De.rc"
-#include "crypt32_En.rc"
-#include "crypt32_Fr.rc"
-#include "crypt32_Ko.rc"
-#include "crypt32_Nl.rc"
-#include "crypt32_No.rc"
-#include "crypt32_Pt.rc"
-#include "crypt32_Sv.rc"
+#pragma code_page(65001)
+
+LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
+
+STRINGTABLE
+{
+ IDS_FAILED, "Wordpad n'a pas pu être démarré"
+}
diff --git a/reactos/base/applications/write/rsrc.rc b/reactos/base/applications/write/Ja.rc
similarity index 58%
rename from reactos/base/applications/write/rsrc.rc
rename to reactos/base/applications/write/Ja.rc
index 51dafa2d103..5c9a8259a97 100644
--- a/reactos/base/applications/write/rsrc.rc
+++ b/reactos/base/applications/write/Ja.rc
@@ -1,5 +1,7 @@
/*
- * Copyright 2007 Mikolaj Zalewski
+ * Japanese language support
+ *
+ * Copyright (C) 2007 Mikolaj Zalewski
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -16,27 +18,14 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include
-#include
-
#include "resources.h"
-LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+/* UTF-8 */
+#pragma code_page(65001)
-#include "lang/bg-BG.rc"
-#include "lang/de-DE.rc"
-#include "lang/en-US.rc"
-#include "lang/es-ES.rc"
-#include "lang/fr-FR.rc"
-#include "lang/ja-JP.rc"
-#include "lang/ko-KR.rc"
-#include "lang/nl-NL.rc"
-#include "lang/no-NO.rc"
-#include "lang/pl-PL.rc"
-#include "lang/pt-BR.rc"
-#include "lang/ro-RO.rc"
-#include "lang/ru-RU.rc"
-#include "lang/sk-SK.rc"
-#include "lang/sl-SI.rc"
-#include "lang/sv-SE.rc"
-#include "lang/uk-UA.rc"
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+
+STRINGTABLE
+{
+ IDS_FAILED, "Wordpad の起動に失敗しました"
+}
diff --git a/reactos/base/applications/write/Ko.rc b/reactos/base/applications/write/Ko.rc
new file mode 100644
index 00000000000..3e076c2d101
--- /dev/null
+++ b/reactos/base/applications/write/Ko.rc
@@ -0,0 +1,29 @@
+/*
+ * Korean language support
+ *
+ * Copyright (C) 2007 Mikolaj Zalewski
+ * Copyright (C) 2008 YunSong Hwang(Ȳ)(hys545@dreamwiz.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "resources.h"
+
+LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
+
+STRINGTABLE
+{
+ IDS_FAILED, "е "
+}
diff --git a/reactos/base/applications/write/Lt.rc b/reactos/base/applications/write/Lt.rc
new file mode 100644
index 00000000000..5cef934fbc7
--- /dev/null
+++ b/reactos/base/applications/write/Lt.rc
@@ -0,0 +1,31 @@
+/*
+ * Lithuanian language support
+ *
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * 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 "resources.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE
+{
+ IDS_FAILED, "Nepavyko paleisti Wordpad"
+}
diff --git a/reactos/base/applications/write/Nl.rc b/reactos/base/applications/write/Nl.rc
new file mode 100644
index 00000000000..6910cde8baa
--- /dev/null
+++ b/reactos/base/applications/write/Nl.rc
@@ -0,0 +1,28 @@
+/*
+ * Dutch language support
+ *
+ * Copyright (C) 2008 Frans Kool
+ *
+ * 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 "resources.h"
+
+LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
+
+STRINGTABLE
+{
+ IDS_FAILED, "Starten van Wordpad mislukt"
+}
diff --git a/reactos/base/applications/write/No.rc b/reactos/base/applications/write/No.rc
new file mode 100644
index 00000000000..b20abc3d56c
--- /dev/null
+++ b/reactos/base/applications/write/No.rc
@@ -0,0 +1,28 @@
+/*
+ * Norwegian Bokml language support
+ *
+ * Copyright (C) 2007 Alexander N. Srnes
+ *
+ * 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 "resources.h"
+
+LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
+
+STRINGTABLE
+{
+ IDS_FAILED, "Klarte ikke starte Wordpad"
+}
diff --git a/reactos/base/applications/write/Pl.rc b/reactos/base/applications/write/Pl.rc
new file mode 100644
index 00000000000..6a3c8ae3199
--- /dev/null
+++ b/reactos/base/applications/write/Pl.rc
@@ -0,0 +1,28 @@
+/*
+ * Polish language support
+ *
+ * Copyright (C) 2007 Mikolaj Zalewski
+ *
+ * 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 "resources.h"
+
+LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
+
+STRINGTABLE
+{
+ IDS_FAILED, "Nie udao si uruchomi programu Wordpad"
+}
diff --git a/reactos/base/applications/write/Pt.rc b/reactos/base/applications/write/Pt.rc
new file mode 100644
index 00000000000..95fad3463f4
--- /dev/null
+++ b/reactos/base/applications/write/Pt.rc
@@ -0,0 +1,28 @@
+/*
+ * Portuguese language support
+ *
+ * Copyright (C) 2008 Ricardo Filipe
+ *
+ * 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 "resources.h"
+
+LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
+
+STRINGTABLE
+{
+ IDS_FAILED, "Falhou ao iniciar o Wordpad"
+}
diff --git a/reactos/base/applications/write/Ro.rc b/reactos/base/applications/write/Ro.rc
new file mode 100644
index 00000000000..f6a7b65665f
--- /dev/null
+++ b/reactos/base/applications/write/Ro.rc
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2007 Mikolaj Zalewski
+ * Copyright (C) 2008 Michael Stefaniuc
+ *
+ * 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 "resources.h"
+
+LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+
+#pragma code_page(65001)
+
+STRINGTABLE
+{
+ IDS_FAILED, "Execuția Wordpad a eșuat"
+}
diff --git a/reactos/base/applications/write/Ru.rc b/reactos/base/applications/write/Ru.rc
new file mode 100644
index 00000000000..5824ad13f00
--- /dev/null
+++ b/reactos/base/applications/write/Ru.rc
@@ -0,0 +1,28 @@
+/*
+ * Russian language support
+ *
+ * Copyright 2008 Andrey Esin
+ *
+ * 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 "resources.h"
+
+LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
+
+STRINGTABLE
+{
+ IDS_FAILED, " Wordpad"
+}
diff --git a/reactos/base/applications/write/Si.rc b/reactos/base/applications/write/Si.rc
new file mode 100644
index 00000000000..9d3e5fe1520
--- /dev/null
+++ b/reactos/base/applications/write/Si.rc
@@ -0,0 +1,30 @@
+/*
+ * Slovenian language support
+ *
+ * Copyright (C) 2008 Rok Mandeljc
+ *
+ * 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 "resources.h"
+
+LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
+
+#pragma code_page(65001)
+
+STRINGTABLE
+{
+ IDS_FAILED, "Zagon programa Wordpad ni uspel"
+}
diff --git a/reactos/base/applications/write/Sv.rc b/reactos/base/applications/write/Sv.rc
new file mode 100644
index 00000000000..7cfa2acea01
--- /dev/null
+++ b/reactos/base/applications/write/Sv.rc
@@ -0,0 +1,28 @@
+/*
+ * Swedish language support
+ *
+ * Copyright (C) 2009 Anders Jonsson
+ *
+ * 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 "resources.h"
+
+LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
+
+STRINGTABLE
+{
+ IDS_FAILED, "Kunde inte starta Wordpad"
+}
diff --git a/reactos/base/applications/write/resources.h b/reactos/base/applications/write/resources.h
index e99e5b19a40..73ef91aa40f 100644
--- a/reactos/base/applications/write/resources.h
+++ b/reactos/base/applications/write/resources.h
@@ -16,4 +16,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include
+
#define IDS_FAILED 101
diff --git a/reactos/base/applications/write/write.rbuild b/reactos/base/applications/write/write.rbuild
index e559784bc3a..7a215abb19c 100644
--- a/reactos/base/applications/write/write.rbuild
+++ b/reactos/base/applications/write/write.rbuild
@@ -2,10 +2,22 @@
.
- kernel32
user32
- advapi32
- shell32
+ gdi32
+ kernel32
write.c
- rsrc.rc
+ De.rc
+ En.rc
+ Fr.rc
+ Ja.rc
+ Ko.rc
+ Lt.rc
+ Nl.rc
+ No.rc
+ Pl.rc
+ Pt.rc
+ Ro.rc
+ Ru.rc
+ Si.rc
+ Sv.rc
diff --git a/reactos/base/services/dhcp/adapter.c b/reactos/base/services/dhcp/adapter.c
index 660441801c7..01225213d5e 100644
--- a/reactos/base/services/dhcp/adapter.c
+++ b/reactos/base/services/dhcp/adapter.c
@@ -3,7 +3,6 @@
static SOCKET DhcpSocket = INVALID_SOCKET;
static LIST_ENTRY AdapterList;
static WSADATA wsd;
-extern struct interface_info *ifi;
PCHAR *GetSubkeyNames( PCHAR MainKeyName, PCHAR Append ) {
int i = 0;
@@ -150,7 +149,6 @@ BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) {
PCHAR IPAddress = NULL, Netmask = NULL, DefaultGateway = NULL;
NTSTATUS Status = STATUS_SUCCESS;
DWORD Error = ERROR_SUCCESS;
- MIB_IPFORWARDROW DefGatewayRow;
Adapter->DhclientState.config = &Adapter->DhclientConfig;
strncpy(Adapter->DhclientInfo.name, (char*)Adapter->IfMib.bDescr,
@@ -182,11 +180,11 @@ BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) {
DefaultGateway = RegReadString( AdapterKey, NULL, "DefaultGateway" );
if( DefaultGateway ) {
- DefGatewayRow.dwForwardDest = 0;
- DefGatewayRow.dwForwardMask = 0;
- DefGatewayRow.dwForwardMetric1 = 1;
- DefGatewayRow.dwForwardNextHop = inet_addr(DefaultGateway);
- Error = CreateIpForwardEntry( &DefGatewayRow );
+ Adapter->RouterMib.dwForwardDest = 0;
+ Adapter->RouterMib.dwForwardMask = 0;
+ Adapter->RouterMib.dwForwardMetric1 = 1;
+ Adapter->RouterMib.dwForwardNextHop = inet_addr(DefaultGateway);
+ Error = CreateIpForwardEntry( &Adapter->RouterMib );
if( Error )
warning("Failed to set default gateway %s: %ld\n",
DefaultGateway, Error);
@@ -200,6 +198,10 @@ BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) {
(MID_TRACE,("Adapter Name: [%s] (Bind Status %x) (dynamic)\n",
Adapter->DhclientInfo.name,
Adapter->BindStatus));
+
+ add_protocol(Adapter->DhclientInfo.name, Adapter->DhclientInfo.rfdesc, got_one, &Adapter->DhclientInfo);
+ Adapter->DhclientInfo.client->state = S_INIT;
+ state_reboot(&Adapter->DhclientInfo);
}
if( IPAddress ) free( IPAddress );
@@ -207,18 +209,31 @@ BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) {
return TRUE;
}
-/*
- * XXX Figure out the way to bind a specific adapter to a socket.
- */
-
void AdapterInit() {
- PMIB_IFTABLE Table = (PMIB_IFTABLE) malloc(sizeof(MIB_IFTABLE));
- DWORD Error, Size, i;
- PDHCP_ADAPTER Adapter = NULL;
-
WSAStartup(0x0101,&wsd);
InitializeListHead( &AdapterList );
+}
+
+int
+InterfaceConnected(MIB_IFROW IfEntry)
+{
+ if (IfEntry.dwOperStatus == IF_OPER_STATUS_CONNECTED ||
+ IfEntry.dwOperStatus == IF_OPER_STATUS_OPERATIONAL)
+ return 1;
+
+ return 0;
+}
+
+/*
+ * XXX Figure out the way to bind a specific adapter to a socket.
+ */
+void AdapterDiscover() {
+ PMIB_IFTABLE Table = (PMIB_IFTABLE) malloc(sizeof(MIB_IFTABLE));
+ DWORD Error, Size = sizeof(MIB_IFTABLE);
+ PDHCP_ADAPTER Adapter = NULL;
+ struct interface_info *ifi = NULL;
+ int i;
DH_DbgPrint(MID_TRACE,("Getting Adapter List...\n"));
@@ -233,12 +248,28 @@ void AdapterInit() {
DH_DbgPrint(MID_TRACE,("Got Adapter List (%d entries)\n", Table->dwNumEntries));
- for( i = 0; i < Table->dwNumEntries; i++ ) {
+ for( i = Table->dwNumEntries - 1; i >= 0; i-- ) {
DH_DbgPrint(MID_TRACE,("Getting adapter %d attributes\n",
Table->table[i].dwIndex));
+
+ if (AdapterFindByHardwareAddress(Table->table[i].bPhysAddr, Table->table[i].dwPhysAddrLen))
+ {
+ /* This is an existing adapter */
+ if (InterfaceConnected(Table->table[i])) {
+ /* We're still active so we stay in the list */
+ ifi = &Adapter->DhclientInfo;
+ } else {
+ /* We've lost our link so out we go */
+ RemoveEntryList(&Adapter->ListEntry);
+ free(Adapter);
+ }
+
+ continue;
+ }
+
Adapter = (DHCP_ADAPTER*) calloc( sizeof( DHCP_ADAPTER ) + Table->table[i].dwMtu, 1 );
- if( Adapter && Table->table[i].dwType == MIB_IF_TYPE_ETHERNET ) {
+ if( Adapter && Table->table[i].dwType == MIB_IF_TYPE_ETHERNET && InterfaceConnected(Table->table[i])) {
memcpy( &Adapter->IfMib, &Table->table[i],
sizeof(Adapter->IfMib) );
Adapter->DhclientInfo.client = &Adapter->DhclientState;
@@ -287,6 +318,9 @@ void AdapterInit() {
if( PrepareAdapterForService( Adapter ) ) {
Adapter->DhclientInfo.next = ifi;
ifi = &Adapter->DhclientInfo;
+
+ read_client_conf(&Adapter->DhclientInfo);
+
InsertTailList( &AdapterList, &Adapter->ListEntry );
} else { free( Adapter ); Adapter = 0; }
} else { free( Adapter ); Adapter = 0; }
@@ -355,6 +389,23 @@ PDHCP_ADAPTER AdapterFindInfo( struct interface_info *ip ) {
return NULL;
}
+PDHCP_ADAPTER AdapterFindByHardwareAddress( u_int8_t haddr[16], u_int8_t hlen ) {
+ PDHCP_ADAPTER Adapter;
+ PLIST_ENTRY ListEntry;
+
+ for(ListEntry = AdapterList.Flink;
+ ListEntry != &AdapterList;
+ ListEntry = ListEntry->Flink) {
+ Adapter = CONTAINING_RECORD( ListEntry, DHCP_ADAPTER, ListEntry );
+ if (Adapter->DhclientInfo.hw_address.hlen == hlen &&
+ !memcmp(Adapter->DhclientInfo.hw_address.haddr,
+ haddr,
+ hlen)) return Adapter;
+ }
+
+ return NULL;
+}
+
PDHCP_ADAPTER AdapterGetFirst() {
if( IsListEmpty( &AdapterList ) ) return NULL; else {
return CONTAINING_RECORD
diff --git a/reactos/base/services/dhcp/api.c b/reactos/base/services/dhcp/api.c
index b2d9c9e2ad5..268466980b6 100644
--- a/reactos/base/services/dhcp/api.c
+++ b/reactos/base/services/dhcp/api.c
@@ -61,10 +61,14 @@ DWORD DSQueryHWInfo( PipeSendFunc Send, COMM_DHCP_REQ *Req ) {
Adapter = AdapterFindIndex( Req->AdapterIndex );
- Reply.QueryHWInfo.AdapterIndex = Req->AdapterIndex;
- Reply.QueryHWInfo.MediaType = Adapter->IfMib.dwType;
- Reply.QueryHWInfo.Mtu = Adapter->IfMib.dwMtu;
- Reply.QueryHWInfo.Speed = Adapter->IfMib.dwSpeed;
+ Reply.Reply = Adapter ? 1 : 0;
+
+ if (Adapter) {
+ Reply.QueryHWInfo.AdapterIndex = Req->AdapterIndex;
+ Reply.QueryHWInfo.MediaType = Adapter->IfMib.dwType;
+ Reply.QueryHWInfo.Mtu = Adapter->IfMib.dwMtu;
+ Reply.QueryHWInfo.Speed = Adapter->IfMib.dwSpeed;
+ }
ApiUnlock();
@@ -74,6 +78,7 @@ DWORD DSQueryHWInfo( PipeSendFunc Send, COMM_DHCP_REQ *Req ) {
DWORD DSReleaseIpAddressLease( PipeSendFunc Send, COMM_DHCP_REQ *Req ) {
COMM_DHCP_REPLY Reply;
PDHCP_ADAPTER Adapter;
+ struct protocol* proto;
ApiLock();
@@ -82,8 +87,12 @@ DWORD DSReleaseIpAddressLease( PipeSendFunc Send, COMM_DHCP_REQ *Req ) {
Reply.Reply = Adapter ? 1 : 0;
if( Adapter ) {
- DeleteIPAddress( Adapter->NteContext );
- remove_protocol( find_protocol_by_adapter( &Adapter->DhclientInfo ) );
+ if (Adapter->NteContext)
+ DeleteIPAddress( Adapter->NteContext );
+
+ proto = find_protocol_by_adapter( &Adapter->DhclientInfo );
+ if (proto)
+ remove_protocol(proto);
}
ApiUnlock();
@@ -99,17 +108,19 @@ DWORD DSRenewIpAddressLease( PipeSendFunc Send, COMM_DHCP_REQ *Req ) {
Adapter = AdapterFindIndex( Req->AdapterIndex );
- Reply.Reply = Adapter ? 1 : 0;
-
- if( !Adapter || Adapter->DhclientState.state != S_BOUND ) {
+ if( !Adapter || Adapter->DhclientState.state == S_STATIC ) {
Reply.Reply = 0;
+ ApiUnlock();
return Send( &Reply );
}
- Adapter->DhclientState.state = S_BOUND;
+ Reply.Reply = 1;
- send_discover( &Adapter->DhclientInfo );
- state_bound( &Adapter->DhclientInfo );
+ add_protocol( Adapter->DhclientInfo.name,
+ Adapter->DhclientInfo.rfdesc, got_one,
+ &Adapter->DhclientInfo );
+ Adapter->DhclientInfo.client->state = S_INIT;
+ state_reboot(&Adapter->DhclientInfo);
ApiUnlock();
@@ -120,6 +131,7 @@ DWORD DSStaticRefreshParams( PipeSendFunc Send, COMM_DHCP_REQ *Req ) {
NTSTATUS Status;
COMM_DHCP_REPLY Reply;
PDHCP_ADAPTER Adapter;
+ struct protocol* proto;
ApiLock();
@@ -128,9 +140,12 @@ DWORD DSStaticRefreshParams( PipeSendFunc Send, COMM_DHCP_REQ *Req ) {
Reply.Reply = Adapter ? 1 : 0;
if( Adapter ) {
- DeleteIPAddress( Adapter->NteContext );
+ if (Adapter->NteContext)
+ DeleteIPAddress( Adapter->NteContext );
Adapter->DhclientState.state = S_STATIC;
- remove_protocol( find_protocol_by_adapter( &Adapter->DhclientInfo ) );
+ proto = find_protocol_by_adapter( &Adapter->DhclientInfo );
+ if (proto)
+ remove_protocol(proto);
Status = AddIPAddress( Req->Body.StaticRefreshParams.IPAddress,
Req->Body.StaticRefreshParams.Netmask,
Req->AdapterIndex,
diff --git a/reactos/base/services/dhcp/dhclient.c b/reactos/base/services/dhcp/dhclient.c
index 39a3de4c51e..3d2ed494220 100644
--- a/reactos/base/services/dhcp/dhclient.c
+++ b/reactos/base/services/dhcp/dhclient.c
@@ -72,8 +72,6 @@
#define domainchar(c) ((c) > 0x20 && (c) < 0x7f)
unsigned long debug_trace_level = 0; /* DEBUG_ULTRA */
-time_t cur_time;
-time_t default_lease_time = 43200; /* 12 hours... */
char *path_dhclient_conf = _PATH_DHCLIENT_CONF;
char *path_dhclient_db = NULL;
@@ -85,7 +83,6 @@ int privfd;
struct iaddr iaddr_broadcast = { 4, { 255, 255, 255, 255 } };
struct in_addr inaddr_any;
struct sockaddr_in sockaddr_broadcast;
-unsigned long old_default_route = 0;
/*
* ASSERT_STATE() does nothing now; it used to be
@@ -100,8 +97,6 @@ int no_daemon;
int unknown_ok = 1;
int routefd;
-struct interface_info *ifi = NULL;
-
void usage(void);
int check_option(struct client_lease *l, int option);
int ipv4addrs(char * buf);
@@ -134,13 +129,11 @@ static SERVICE_TABLE_ENTRY ServiceTable[2] =
int
main(int argc, char *argv[])
{
- int i = 0;
ApiInit();
AdapterInit();
PipeInit();
tzset();
- time(&cur_time);
memset(&sockaddr_broadcast, 0, sizeof(sockaddr_broadcast));
sockaddr_broadcast.sin_family = AF_INET;
@@ -150,34 +143,6 @@ main(int argc, char *argv[])
DH_DbgPrint(MID_TRACE,("DHCP Service Started\n"));
- read_client_conf();
-
- if (!interface_link_status(ifi->name)) {
- DH_DbgPrint(MID_TRACE,("%s: no link ", ifi->name));
- Sleep(1000);
- while (!interface_link_status(ifi->name)) {
- DH_DbgPrint(MID_TRACE,("."));
- if (++i > 10) {
- DH_DbgPrint(MID_TRACE,("Giving up for now on adapter [%s]\n", ifi->name));
- }
- Sleep(1000);
- }
- DH_DbgPrint(MID_TRACE,("Got link on [%s]\n", ifi->name));
- }
-
- DH_DbgPrint(MID_TRACE,("Discover Interfaces\n"));
-
- /* If no adapters were found, just idle for now ... If any show up,
- * then we'll start it later */
- if( ifi ) {
- /* set up the interface */
- discover_interfaces(ifi);
-
- DH_DbgPrint
- (MID_TRACE,
- ("Setting init state and restarting interface %p\n",ifi));
- }
-
bootp_packet_handler = do_packet;
DH_DbgPrint(MID_TRACE,("Going into dispatch()\n"));
@@ -253,7 +218,7 @@ state_reboot(void *ipp)
flags. */
make_request(ip, ip->client->active);
ip->client->destination = iaddr_broadcast;
- ip->client->first_sending = cur_time;
+ time(&ip->client->first_sending);
ip->client->interval = ip->client->config->initial_interval;
/* Zap the medium list... */
@@ -280,7 +245,7 @@ state_init(void *ipp)
ip->client->xid = ip->client->packet.xid;
ip->client->destination = iaddr_broadcast;
ip->client->state = S_SELECTING;
- ip->client->first_sending = cur_time;
+ time(&ip->client->first_sending);
ip->client->interval = ip->client->config->initial_interval;
/* Add an immediate timeout to cause the first DHCPDISCOVER packet
@@ -297,9 +262,12 @@ state_selecting(void *ipp)
{
struct interface_info *ip = ipp;
struct client_lease *lp, *next, *picked;
+ time_t cur_time;
ASSERT_STATE(state, S_SELECTING);
+ time(&cur_time);
+
/* Cancel state_selecting and send_discover timeouts, since either
one could have got us here. */
cancel_timeout(state_selecting, ip);
@@ -375,6 +343,9 @@ dhcpack(struct packet *packet)
{
struct interface_info *ip = packet->interface;
struct client_lease *lease;
+ time_t cur_time;
+
+ time(&cur_time);
/* If we're not receptive to an offer right now, or if the offer
has an unrecognizable transaction id, then just drop it. */
@@ -408,7 +379,7 @@ dhcpack(struct packet *packet)
ip->client->new->expiry = getULong(
ip->client->new->options[DHO_DHCP_LEASE_TIME].data);
else
- ip->client->new->expiry = default_lease_time;
+ ip->client->new->expiry = DHCP_DEFAULT_LEASE_TIME;
/* A number that looks negative here is really just very large,
because the lease expiry offset is unsigned. */
if (ip->client->new->expiry < 0)
@@ -466,8 +437,6 @@ void set_name_servers( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) {
int i, addrs =
new_lease->options[DHO_DOMAIN_NAME_SERVERS].len / sizeof(ULONG);
- /* XXX I'm setting addrs to 1 until we are ready up the chain */
- addrs = 1;
nsbuf = malloc( addrs * sizeof(IP_ADDRESS_STRING) );
if( nsbuf) {
@@ -545,28 +514,24 @@ void setup_adapter( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) {
}
if( new_lease->options[DHO_ROUTERS].len ) {
- MIB_IPFORWARDROW RouterMib;
NTSTATUS Status;
- RouterMib.dwForwardDest = 0; /* Default route */
- RouterMib.dwForwardMask = 0;
- RouterMib.dwForwardMetric1 = 1;
+ Adapter->RouterMib.dwForwardDest = 0; /* Default route */
+ Adapter->RouterMib.dwForwardMask = 0;
+ Adapter->RouterMib.dwForwardMetric1 = 1;
- if( old_default_route ) {
+ if( Adapter->RouterMib.dwForwardNextHop ) {
/* If we set a default route before, delete it before continuing */
- RouterMib.dwForwardDest = old_default_route;
- DeleteIpForwardEntry( &RouterMib );
+ DeleteIpForwardEntry( &Adapter->RouterMib );
}
- RouterMib.dwForwardNextHop =
+ Adapter->RouterMib.dwForwardNextHop =
*((ULONG*)new_lease->options[DHO_ROUTERS].data);
- Status = CreateIpForwardEntry( &RouterMib );
+ Status = CreateIpForwardEntry( &Adapter->RouterMib );
if( !NT_SUCCESS(Status) )
warning("CreateIpForwardEntry: %lx\n", Status);
- else
- old_default_route = RouterMib.dwForwardNextHop;
if (hkey) {
Buffer[0] = '\0';
@@ -591,6 +556,9 @@ bind_lease(struct interface_info *ip)
{
PDHCP_ADAPTER Adapter;
struct client_lease *new_lease = ip->client->new;
+ time_t cur_time;
+
+ time(&cur_time);
/* Remember the medium. */
ip->client->new->medium = ip->client->medium;
@@ -616,8 +584,6 @@ bind_lease(struct interface_info *ip)
else warning("Could not find adapter for info %p\n", ip);
set_name_servers( Adapter, new_lease );
-
- reinitialize_interfaces();
}
/*
@@ -644,7 +610,7 @@ state_bound(void *ipp)
} else
ip->client->destination = iaddr_broadcast;
- ip->client->first_sending = cur_time;
+ time(&ip->client->first_sending);
ip->client->interval = ip->client->config->initial_interval;
ip->client->state = S_RENEWING;
@@ -717,6 +683,9 @@ dhcpoffer(struct packet *packet)
int arp_timeout_needed = 0, stop_selecting;
char *name = packet->options[DHO_DHCP_MESSAGE_TYPE].len ?
"DHCPOFFER" : "BOOTREPLY";
+ time_t cur_time;
+
+ time(&cur_time);
/* If we're not receptive to an offer right now, or if the offer
has an unrecognizable transaction id, then just drop it. */
@@ -955,9 +924,12 @@ send_discover(void *ipp)
{
struct interface_info *ip = ipp;
int interval, increase = 1;
+ time_t cur_time;
DH_DbgPrint(MID_TRACE,("Doing discover on interface %p\n",ip));
+ time(&cur_time);
+
/* Figure out how long it's been since we started transmitting. */
interval = cur_time - ip->client->first_sending;
@@ -1059,9 +1031,12 @@ state_panic(void *ipp)
struct interface_info *ip = ipp;
struct client_lease *loop = ip->client->active;
struct client_lease *lp;
+ time_t cur_time;
note("No DHCPOFFERS received.");
+ time(&cur_time);
+
/* We may not have an active lease, but we may have some
predefined leases that we can try. */
if (!ip->client->active && ip->client->leases)
@@ -1098,7 +1073,6 @@ state_panic(void *ipp)
note("bound: immediate renewal.");
state_bound(ip);
}
- reinitialize_interfaces();
return;
}
@@ -1146,6 +1120,9 @@ send_request(void *ipp)
struct sockaddr_in destination;
struct in_addr from;
int interval;
+ time_t cur_time;
+
+ time(&cur_time);
/* Figure out how long it's been since we started transmitting. */
interval = cur_time - ip->client->first_sending;
@@ -1556,14 +1533,14 @@ free_client_lease(struct client_lease *lease)
FILE *leaseFile;
void
-rewrite_client_leases(void)
+rewrite_client_leases(struct interface_info *ifi)
{
struct client_lease *lp;
if (!leaseFile) {
leaseFile = fopen(path_dhclient_db, "w");
if (!leaseFile)
- error("can't create %s: %s", path_dhclient_db, strerror(errno));
+ error("can't create %s", path_dhclient_db);
} else {
fflush(leaseFile);
rewind(leaseFile);
@@ -1587,7 +1564,7 @@ write_client_lease(struct interface_info *ip, struct client_lease *lease,
if (!rewrite) {
if (leases_written++ > 20) {
- rewrite_client_leases();
+ rewrite_client_leases(ip);
leases_written = 0;
}
}
@@ -1600,7 +1577,7 @@ write_client_lease(struct interface_info *ip, struct client_lease *lease,
if (!leaseFile) { /* XXX */
leaseFile = fopen(path_dhclient_db, "w");
if (!leaseFile)
- error("can't create %s: %s", path_dhclient_db, strerror(errno));
+ error("can't create %s", path_dhclient_db);
}
fprintf(leaseFile, "lease {\n");
@@ -1655,7 +1632,7 @@ script_init(char *reason, struct string_list *medium)
sizeof(size_t) + strlen(reason);
if ((buf = buf_open(hdr.len)) == NULL)
- error("buf_open: %s", strerror(errno));
+ return;
errs = 0;
errs += buf_add(buf, &hdr, sizeof(hdr));
@@ -1667,26 +1644,23 @@ script_init(char *reason, struct string_list *medium)
errs += buf_add(buf, reason, len);
if (errs)
- error("buf_add: %s", strerror(errno));
+ error("buf_add: %d", WSAGetLastError());
if (buf_close(privfd, buf) == -1)
- error("buf_close: %s", strerror(errno));
+ error("buf_close: %d", WSAGetLastError());
}
void
-priv_script_init(char *reason, char *medium)
+priv_script_init(struct interface_info *ip, char *reason, char *medium)
{
- struct interface_info *ip = ifi;
-
if (ip) {
// XXX Do we need to do anything?
}
}
void
-priv_script_write_params(char *prefix, struct client_lease *lease)
+priv_script_write_params(struct interface_info *ip, char *prefix, struct client_lease *lease)
{
- struct interface_info *ip = ifi;
u_int8_t dbuf[1500];
int i, len = 0;
@@ -1848,7 +1822,7 @@ script_write_params(char *prefix, struct client_lease *lease)
scripttime = time(NULL);
if ((buf = buf_open(hdr.len)) == NULL)
- error("buf_open: %s", strerror(errno));
+ return;
errs = 0;
errs += buf_add(buf, &hdr, sizeof(hdr));
@@ -1868,10 +1842,10 @@ script_write_params(char *prefix, struct client_lease *lease)
}
if (errs)
- error("buf_add: %s", strerror(errno));
+ error("buf_add: %d", WSAGetLastError());
if (buf_close(privfd, buf) == -1)
- error("buf_close: %s", strerror(errno));
+ error("buf_close: %d", WSAGetLastError());
}
int
@@ -2101,41 +2075,3 @@ toobig:
return "";
}
-#if 0
-int
-fork_privchld(int fd, int fd2)
-{
- struct pollfd pfd[1];
- int nfds;
-
- switch (fork()) {
- case -1:
- error("cannot fork");
- case 0:
- break;
- default:
- return (0);
- }
-
- setproctitle("%s [priv]", ifi->name);
-
- dup2(nullfd, STDIN_FILENO);
- dup2(nullfd, STDOUT_FILENO);
- dup2(nullfd, STDERR_FILENO);
- close(nullfd);
- close(fd2);
-
- for (;;) {
- pfd[0].fd = fd;
- pfd[0].events = POLLIN;
- if ((nfds = poll(pfd, 1, INFTIM)) == -1)
- if (errno != EINTR)
- error("poll error");
-
- if (nfds == 0 || !(pfd[0].revents & POLLIN))
- continue;
-
- dispatch_imsg(fd);
- }
-}
-#endif
diff --git a/reactos/base/services/dhcp/dispatch.c b/reactos/base/services/dhcp/dispatch.c
index b88d5e26956..3839c20bdfb 100644
--- a/reactos/base/services/dhcp/dispatch.c
+++ b/reactos/base/services/dhcp/dispatch.c
@@ -50,40 +50,10 @@
struct protocol *protocols = NULL;
struct timeout *timeouts = NULL;
static struct timeout *free_timeouts = NULL;
-static int interfaces_invalidated = FALSE;
void (*bootp_packet_handler)(struct interface_info *,
struct dhcp_packet *, int, unsigned int,
struct iaddr, struct hardware *);
-static int interface_status(struct interface_info *ifinfo);
-
-/*
- * Use getifaddrs() to get a list of all the attached interfaces. For
- * each interface that's of type INET and not the loopback interface,
- * register that interface with the network I/O software, figure out
- * what subnet it's on, and add it to the list of interfaces.
- */
-void
-discover_interfaces(struct interface_info *iface)
-{
- PDHCP_ADAPTER Adapter = AdapterFindInfo( iface );
-
- if_register_receive(iface);
- if_register_send(iface);
-
- if( Adapter->DhclientState.state != S_STATIC ) {
- add_protocol(iface->name, iface->rfdesc, got_one, iface);
- iface->client->state = S_INIT;
- state_reboot(iface);
- }
-}
-
-void
-reinitialize_interfaces(void)
-{
- interfaces_invalidated = 1;
-}
-
/*
* Wait for packets to come in using poll(). When a packet comes in,
* call receive_packet to receive the packet and possibly strip hardware
@@ -93,25 +63,29 @@ reinitialize_interfaces(void)
void
dispatch(void)
{
- int count, i, to_msec, nfds = 0;
+ int count, i, to_msec, nfds, err;
struct protocol *l;
fd_set fds;
- time_t howlong;
+ time_t howlong, cur_time;
struct timeval timeval;
ApiLock();
- for (l = protocols; l; l = l->next)
- nfds++;
-
- FD_ZERO(&fds);
-
do {
/*
* Call any expired timeouts, and then if there's still
* a timeout registered, time out the select call then.
*/
another:
+ AdapterDiscover();
+
+ for (l = protocols, nfds = 0; l; l = l->next)
+ nfds++;
+
+ FD_ZERO(&fds);
+
+ time(&cur_time);
+
if (timeouts) {
struct timeout *t;
@@ -148,10 +122,9 @@ dispatch(void)
}
if (i == 0) {
- /* No interfaces for now, set the select timeout reasonably so
- * we can recover from that condition later. */
- timeval.tv_sec = 5;
- timeval.tv_usec = 0;
+ /* Wait for 5 seconds before looking for more interfaces */
+ Sleep(5000);
+ continue;
} else {
/* Wait for a packet or a timeout... XXX */
timeval.tv_sec = to_msec / 1000;
@@ -182,18 +155,11 @@ dispatch(void)
/* Not likely to be transitory... */
if (count == SOCKET_ERROR) {
- if (errno == EAGAIN || errno == EINTR) {
- time(&cur_time);
- continue;
- } else {
- error("poll: %s", strerror(errno));
- break;
- }
+ err = WSAGetLastError();
+ error("poll: %d", err);
+ break;
}
- /* Get the current time... */
- time(&cur_time);
-
i = 0;
for (l = protocols; l; l = l->next) {
struct interface_info *ip;
@@ -203,12 +169,9 @@ dispatch(void)
!ip->dead)) {
DH_DbgPrint(MID_TRACE,("Handling %x\n", l));
(*(l->handler))(l);
- if (interfaces_invalidated)
- break;
}
i++;
}
- interfaces_invalidated = 0;
}
} while (1);
@@ -231,22 +194,25 @@ got_one(struct protocol *l)
struct dhcp_packet packet;
} u;
struct interface_info *ip = l->local;
+ PDHCP_ADAPTER adapter;
if ((result = receive_packet(ip, u.packbuf, sizeof(u), &from,
&hfrom)) == -1) {
- warning("receive_packet failed on %s: %s", ip->name,
- strerror(errno));
+ warning("receive_packet failed on %s: %d", ip->name,
+ WSAGetLastError());
ip->errors++;
- if ((!interface_status(ip)) ||
- (ip->noifmedia && ip->errors > 20)) {
+ if (ip->errors > 20) {
/* our interface has gone away. */
warning("Interface %s no longer appears valid.",
ip->name);
ip->dead = 1;
- interfaces_invalidated = 1;
close(l->fd);
remove_protocol(l);
- free(ip);
+ adapter = AdapterFindInfo(ip);
+ if (adapter) {
+ RemoveEntryList(&adapter->ListEntry);
+ free(adapter);
+ }
}
return;
}
@@ -257,80 +223,20 @@ got_one(struct protocol *l)
ifrom.len = 4;
memcpy(ifrom.iabuf, &from.sin_addr, ifrom.len);
- (*bootp_packet_handler)(ip, &u.packet, result,
+
+ adapter = AdapterFindByHardwareAddress(u.packet.chaddr,
+ u.packet.hlen);
+
+ if (!adapter) {
+ warning("Discarding packet with a non-matching target physical address\n");
+ return;
+ }
+
+ (*bootp_packet_handler)(&adapter->DhclientInfo, &u.packet, result,
from.sin_port, ifrom, &hfrom);
}
}
-#if 0
-int
-interface_status(struct interface_info *ifinfo)
-{
- char *ifname = ifinfo->name;
- int ifsock = ifinfo->rfdesc;
- struct ifreq ifr;
- struct ifmediareq ifmr;
-
- /* get interface flags */
- memset(&ifr, 0, sizeof(ifr));
- strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
- if (ioctl(ifsock, SIOCGIFFLAGS, &ifr) < 0) {
- syslog(LOG_ERR, "ioctl(SIOCGIFFLAGS) on %s: %m", ifname);
- goto inactive;
- }
-
- /*
- * if one of UP and RUNNING flags is dropped,
- * the interface is not active.
- */
- if ((ifr.ifr_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING))
- goto inactive;
-
- /* Next, check carrier on the interface, if possible */
- if (ifinfo->noifmedia)
- goto active;
- memset(&ifmr, 0, sizeof(ifmr));
- strlcpy(ifmr.ifm_name, ifname, sizeof(ifmr.ifm_name));
- if (ioctl(ifsock, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
- if (errno != EINVAL) {
- syslog(LOG_DEBUG, "ioctl(SIOCGIFMEDIA) on %s: %m",
- ifname);
-
- ifinfo->noifmedia = 1;
- goto active;
- }
- /*
- * EINVAL (or ENOTTY) simply means that the interface
- * does not support the SIOCGIFMEDIA ioctl. We regard it alive.
- */
- ifinfo->noifmedia = 1;
- goto active;
- }
- if (ifmr.ifm_status & IFM_AVALID) {
- switch (ifmr.ifm_active & IFM_NMASK) {
- case IFM_ETHER:
- if (ifmr.ifm_status & IFM_ACTIVE)
- goto active;
- else
- goto inactive;
- break;
- default:
- goto inactive;
- }
- }
-inactive:
- return (0);
-active:
- return (1);
-}
-#else
-int
-interface_status(struct interface_info *ifinfo)
-{
- return (1);
-}
-#endif
-
void
add_timeout(time_t when, void (*where)(void *), void *what)
{
@@ -468,33 +374,5 @@ find_protocol_by_adapter(struct interface_info *info)
int
interface_link_status(char *ifname)
{
-#if 0
- struct ifmediareq ifmr;
- int sock;
-
- if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- error("Can't create socket");
-
- memset(&ifmr, 0, sizeof(ifmr));
- strlcpy(ifmr.ifm_name, ifname, sizeof(ifmr.ifm_name));
- if (ioctl(sock, SIOCGIFMEDIA, (caddr_t)&ifmr) == -1) {
- /* EINVAL -> link state unknown. treat as active */
- if (errno != EINVAL)
- syslog(LOG_DEBUG, "ioctl(SIOCGIFMEDIA) on %s: %m",
- ifname);
- close(sock);
- return (1);
- }
- close(sock);
-
- if (ifmr.ifm_status & IFM_AVALID) {
- if ((ifmr.ifm_active & IFM_NMASK) == IFM_ETHER) {
- if (ifmr.ifm_status & IFM_ACTIVE)
- return (1);
- else
- return (0);
- }
- }
-#endif
return (1);
}
diff --git a/reactos/base/services/dhcp/include/dhcpd.h b/reactos/base/services/dhcp/include/dhcpd.h
index 48b91d57787..e94566dea3b 100644
--- a/reactos/base/services/dhcp/include/dhcpd.h
+++ b/reactos/base/services/dhcp/include/dhcpd.h
@@ -98,7 +98,6 @@ struct udphdr {
#include
//#include
#include
-#include
#include
#include
//#include
@@ -426,11 +425,11 @@ void make_request(struct interface_info *, struct client_lease *);
void make_decline(struct interface_info *, struct client_lease *);
void free_client_lease(struct client_lease *);
-void rewrite_client_leases(void);
+void rewrite_client_leases(struct interface_info *);
void write_client_lease(struct interface_info *, struct client_lease *, int);
-void priv_script_init(char *, char *);
-void priv_script_write_params(char *, struct client_lease *);
+void priv_script_init(struct interface_info *, char *, char *);
+void priv_script_write_params(struct interface_info *, char *, struct client_lease *);
int priv_script_go(void);
void script_init(char *, struct string_list *);
@@ -466,7 +465,7 @@ ssize_t decode_ethernet_header(struct interface_info *, unsigned char *,
int, struct hardware *);
/* clparse.c */
-int read_client_conf(void);
+int read_client_conf(struct interface_info *);
void read_client_leases(void);
void parse_client_statement(FILE *, struct interface_info *,
struct client_config *);
diff --git a/reactos/base/services/dhcp/include/rosdhcp.h b/reactos/base/services/dhcp/include/rosdhcp.h
index bcb0b4c4237..ce24ae8edb4 100644
--- a/reactos/base/services/dhcp/include/rosdhcp.h
+++ b/reactos/base/services/dhcp/include/rosdhcp.h
@@ -25,6 +25,7 @@
#define DHCP_REBOOT_TIMEOUT 300
#define DHCP_PANIC_TIMEOUT DHCP_REBOOT_TIMEOUT * 3
#define DHCP_BACKOFF_MAX 300
+#define DHCP_DEFAULT_LEASE_TIME 43200 /* 12 hours */
#define _PATH_DHCLIENT_PID "\\systemroot\\system32\\drivers\\etc\\dhclient.pid"
typedef void *VOIDPTR;
@@ -54,6 +55,7 @@ typedef void (*handler_t) PROTO ((struct packet *));
typedef struct _DHCP_ADAPTER {
LIST_ENTRY ListEntry;
MIB_IFROW IfMib;
+ MIB_IPFORWARDROW RouterMib;
MIB_IPADDRROW IfAddr;
SOCKADDR Address;
ULONG NteContext,NteInstance;
@@ -71,9 +73,13 @@ typedef DWORD (*PipeSendFunc)( COMM_DHCP_REPLY *Reply );
#define srandom srand
void AdapterInit(VOID);
+void AdapterDiscover(VOID);
HANDLE PipeInit(VOID);
+extern PDHCP_ADAPTER AdapterGetFirst();
+extern PDHCP_ADAPTER AdapterGetNext(PDHCP_ADAPTER);
extern PDHCP_ADAPTER AdapterFindIndex( unsigned int AdapterIndex );
extern PDHCP_ADAPTER AdapterFindInfo( struct interface_info *info );
+extern PDHCP_ADAPTER AdapterFindByHardwareAddress( u_int8_t haddr[16], u_int8_t hlen );
extern VOID ApiInit();
extern VOID ApiLock();
extern VOID ApiUnlock();
diff --git a/reactos/base/services/dhcp/pipe.c b/reactos/base/services/dhcp/pipe.c
index 026343b9086..9ea0402c413 100644
--- a/reactos/base/services/dhcp/pipe.c
+++ b/reactos/base/services/dhcp/pipe.c
@@ -89,7 +89,7 @@ DWORD WINAPI PipeThreadProc( LPVOID Parameter ) {
}
HANDLE PipeInit() {
- CommPipe = CreateNamedPipe
+ CommPipe = CreateNamedPipeW
( DHCP_PIPE_NAME,
PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
diff --git a/reactos/base/services/dhcp/privsep.c b/reactos/base/services/dhcp/privsep.c
index 2cc59a41b33..7a13bfed21b 100644
--- a/reactos/base/services/dhcp/privsep.c
+++ b/reactos/base/services/dhcp/privsep.c
@@ -52,19 +52,16 @@ buf_close(int sock, struct buf *buf)
{
ssize_t n;
- do {
- n = write(sock, buf->buf + buf->rpos, buf->size - buf->rpos);
- if (n != -1)
- buf->rpos += n;
- if (n == 0) { /* connection closed */
- errno = 0;
- return (-1);
- }
- } while (n == -1 && (errno == EAGAIN || errno == EINTR));
+ n = write(sock, buf->buf + buf->rpos, buf->size - buf->rpos);
+ if (n != -1)
+ buf->rpos += n;
+ if (n == 0) { /* connection closed */
+ return (-1);
+ }
if (buf->rpos < buf->size)
- error("short %s write: wanted %lu got %ld bytes",
- strerror(errno), (unsigned long)buf->size, (long)buf->rpos);
+ error("short write: wanted %lu got %ld bytes",
+ (unsigned long)buf->size, (long)buf->rpos);
free(buf->buf);
free(buf);
@@ -77,19 +74,17 @@ buf_read(int sock, void *buf, size_t nbytes)
ssize_t n, r = 0;
char *p = buf;
- do {
- n = read(sock, p, nbytes);
- if (n == 0)
- error("connection closed");
- if (n != -1) {
- r += n;
- p += n;
- nbytes -= n;
- }
- } while (n == -1 && (errno == EINTR || errno == EAGAIN));
+ n = read(sock, p, nbytes);
+ if (n == 0)
+ error("connection closed");
+ if (n != -1) {
+ r += n;
+ p += n;
+ nbytes -= n;
+ }
if (n == -1)
- error("buf_read: %s", strerror(errno));
+ error("buf_read: %d", WSAGetLastError());
if (r < nbytes)
error("short read: wanted %lu got %ld bytes",
@@ -121,9 +116,8 @@ dispatch_imsg(int fd)
+ sizeof(size_t) || medium_len == SIZE_T_MAX)
error("corrupted message received");
if (medium_len > 0) {
- if ((medium = calloc(1, medium_len + 1)) == NULL)
- error("%s", strerror(errno));
- buf_read(fd, medium, medium_len);
+ if ((medium = calloc(1, medium_len + 1)) != NULL)
+ buf_read(fd, medium, medium_len);
} else
medium = NULL;
@@ -132,9 +126,8 @@ dispatch_imsg(int fd)
reason_len == SIZE_T_MAX)
error("corrupted message received");
if (reason_len > 0) {
- if ((reason = calloc(1, reason_len + 1)) == NULL)
- error("%s", strerror(errno));
- buf_read(fd, reason, reason_len);
+ if ((reason = calloc(1, reason_len + 1)) != NULL)
+ buf_read(fd, reason, reason_len);
} else
reason = NULL;
@@ -155,9 +148,8 @@ dispatch_imsg(int fd)
if (hdr.len < totlen || filename_len == SIZE_T_MAX)
error("corrupted message received");
if (filename_len > 0) {
- if ((filename = calloc(1, filename_len + 1)) == NULL)
- error("%s", strerror(errno));
- buf_read(fd, filename, filename_len);
+ if ((filename = calloc(1, filename_len + 1)) != NULL)
+ buf_read(fd, filename, filename_len);
} else
filename = NULL;
@@ -167,9 +159,8 @@ dispatch_imsg(int fd)
error("corrupted message received");
if (servername_len > 0) {
if ((servername =
- calloc(1, servername_len + 1)) == NULL)
- error("%s", strerror(errno));
- buf_read(fd, servername, servername_len);
+ calloc(1, servername_len + 1)) != NULL)
+ buf_read(fd, servername, servername_len);
} else
servername = NULL;
@@ -178,9 +169,8 @@ dispatch_imsg(int fd)
if (hdr.len < totlen || prefix_len == SIZE_T_MAX)
error("corrupted message received");
if (prefix_len > 0) {
- if ((prefix = calloc(1, prefix_len + 1)) == NULL)
- error("%s", strerror(errno));
- buf_read(fd, prefix, prefix_len);
+ if ((prefix = calloc(1, prefix_len + 1)) != NULL)
+ buf_read(fd, prefix, prefix_len);
} else
prefix = NULL;
@@ -197,9 +187,8 @@ dispatch_imsg(int fd)
error("corrupted message received");
lease.options[i].data =
calloc(1, optlen + 1);
- if (lease.options[i].data == NULL)
- error("%s", strerror(errno));
- buf_read(fd, lease.options[i].data, optlen);
+ if (lease.options[i].data != NULL)
+ buf_read(fd, lease.options[i].data, optlen);
}
}
lease.server_name = servername;
@@ -222,14 +211,13 @@ dispatch_imsg(int fd)
hdr.code = IMSG_SCRIPT_GO_RET;
hdr.len = sizeof(struct imsg_hdr) + sizeof(int);
- if ((buf = buf_open(hdr.len)) == NULL)
- error("buf_open: %s", strerror(errno));
- if (buf_add(buf, &hdr, sizeof(hdr)))
- error("buf_add: %s", strerror(errno));
- if (buf_add(buf, &ret, sizeof(ret)))
- error("buf_add: %s", strerror(errno));
- if (buf_close(fd, buf) == -1)
- error("buf_close: %s", strerror(errno));
+ buf = buf_open(hdr.len);
+
+ if (buf != NULL) {
+ buf_add(buf, &hdr, sizeof(hdr));
+ buf_add(buf, &ret, sizeof(ret));
+ buf_close(fd, buf);
+ }
break;
default:
error("received unknown message, code %d", hdr.code);
diff --git a/reactos/base/services/dhcp/util.c b/reactos/base/services/dhcp/util.c
index fdf30755b22..1b995ee4330 100644
--- a/reactos/base/services/dhcp/util.c
+++ b/reactos/base/services/dhcp/util.c
@@ -4,8 +4,6 @@
#define NDEBUG
#include
-extern struct interface_info *ifi;
-
char *piaddr( struct iaddr addr ) {
struct sockaddr_in sa;
memcpy(&sa.sin_addr,addr.iabuf,sizeof(sa.sin_addr));
@@ -96,7 +94,7 @@ int addr_eq( struct iaddr a, struct iaddr b ) {
void *dmalloc( int size, char *name ) { return malloc( size ); }
-int read_client_conf(void) {
+int read_client_conf(struct interface_info *ifi) {
/* What a strange dance */
struct client_config *config;
char ComputerName [MAX_COMPUTERNAME_LENGTH + 1];
diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c
index 36498c066eb..c483812a3e5 100644
--- a/reactos/base/setup/usetup/interface/usetup.c
+++ b/reactos/base/setup/usetup/interface/usetup.c
@@ -3353,6 +3353,18 @@ BootLoaderPage(PINPUT_RECORD Ir)
PartitionType = PartitionList->ActiveBootPartition->
PartInfo[PartitionList->ActiveBootPartitionNumber].PartitionType;
+ if (IsUnattendedSetup)
+ {
+ if (UnattendMBRInstallType == 0) /* skip MBR installation */
+ {
+ return SUCCESS_PAGE;
+ }
+ else if (UnattendMBRInstallType == 1) /* install on floppy */
+ {
+ return BOOT_LOADER_FLOPPY_PAGE;
+ }
+ }
+
if (PartitionType == PARTITION_ENTRY_UNUSED)
{
DPRINT("Error: active partition invalid (unused)\n");
@@ -3398,20 +3410,10 @@ BootLoaderPage(PINPUT_RECORD Ir)
return BOOT_LOADER_FLOPPY_PAGE;
}
- if (IsUnattendedSetup)
+ /* Unattended install on hdd? */
+ if (IsUnattendedSetup && UnattendMBRInstallType == 2)
{
- if (UnattendMBRInstallType == 0) /* skip MBR installation */
- {
- return SUCCESS_PAGE;
- }
- else if (UnattendMBRInstallType == 1) /* install on floppy */
- {
- return BOOT_LOADER_FLOPPY_PAGE;
- }
- else if (UnattendMBRInstallType == 2) /* install on hdd */
- {
- return BOOT_LOADER_HARDDISK_PAGE;
- }
+ return BOOT_LOADER_HARDDISK_PAGE;
}
MUIDisplayPage(BOOT_LOADER_PAGE);
diff --git a/reactos/base/setup/usetup/lang/cs-CZ.h b/reactos/base/setup/usetup/lang/cs-CZ.h
index 90e9f7344be..d4521e253d0 100644
--- a/reactos/base/setup/usetup/lang/cs-CZ.h
+++ b/reactos/base/setup/usetup/lang/cs-CZ.h
@@ -1353,7 +1353,7 @@ MUI_ERROR csCZErrorEntries[] =
"\n"
"Vytven nebo odstraovn oddl me tuto tabulku oddl zniit.\n"
"\n"
- " \x07 Stisknutm F3 ukonte instalaci."
+ " \x07 Stisknutm F3 ukonte instalaci.\n"
" \x07 Stisknutm ENTER budete pokraovat v instalaci.",
"F3= Ukonit ENTER = Pokraovat"
},
diff --git a/reactos/base/setup/usetup/lang/en-US.h b/reactos/base/setup/usetup/lang/en-US.h
index c26926555be..2754b06f922 100644
--- a/reactos/base/setup/usetup/lang/en-US.h
+++ b/reactos/base/setup/usetup/lang/en-US.h
@@ -1345,7 +1345,7 @@ MUI_ERROR enUSErrorEntries[] =
"\n"
"Creating or deleting partitions can destroy the partition table.\n"
"\n"
- " \x07 Press F3 to quit Setup."
+ " \x07 Press F3 to quit Setup.\n"
" \x07 Press ENTER to continue.",
"F3= Quit ENTER = Continue"
},
diff --git a/reactos/base/setup/usetup/lang/sk-SK.h b/reactos/base/setup/usetup/lang/sk-SK.h
index a67aa811581..f3d2fd4d9ef 100644
--- a/reactos/base/setup/usetup/lang/sk-SK.h
+++ b/reactos/base/setup/usetup/lang/sk-SK.h
@@ -1,7 +1,7 @@
/* TRANSLATOR: Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
* DATE OF TR: 22-01-2008
* Encoding : Latin II (852)
- * LastChange: 14-12-2008
+ * LastChange: 20-06-2009
*/
#ifndef LANG_SK_SK_H__
@@ -1349,12 +1349,13 @@ MUI_ERROR skSKErrorEntries[] =
},
{
//ERROR_WARN_PARTITION,
- "Setup found that at least one harddisk contains an incompatible\n"
- "partition table that can not be handled properly!\n"
+// "Intaltor zistil, e najmenej jeden pevn disk obsahuje nekompatibiln\n"
+ "Intaltor naiel najmenej na jednom pevnom disku nekompatibiln\n"
+ "tabuku oblast, s ktorou sa ned sprvne zaobchdza!\n"
"\n"
"Vytvorenie alebo odstrnenie oblast me znii tabuku oblast.\n"
"\n"
- " \x07 Stlate F3 pre skonenie intalcie."
+ " \x07 Stlate F3 pre skonenie intalcie.\n"
" \x07 Stlate ENTER pre pokraovanie.",
"F3 = Skoni ENTER = Pokraova"
},
@@ -1484,8 +1485,8 @@ MUI_ERROR skSKErrorEntries[] =
},
{
//ERROR_UPDATE_GEOID,
- "Setup could not set the geo id.\n"
- "ENTER = Reboot computer"
+ "Intaltor nemohol nastavi geo id.\n"
+ "ENTER = Retart potaa"
},
{
NULL,
diff --git a/reactos/base/shell/cmd/cmd.c b/reactos/base/shell/cmd/cmd.c
index 0ec4d674e0b..0ef2ce25a9a 100644
--- a/reactos/base/shell/cmd/cmd.c
+++ b/reactos/base/shell/cmd/cmd.c
@@ -739,42 +739,22 @@ ExecuteCommand(PARSED_COMMAND *Cmd)
return Ret;
}
-BOOL
-GrowIfNecessary_dbg ( UINT needed, LPTSTR* ret, UINT* retlen, const char *file, int line )
-{
- if ( *ret && needed < *retlen )
- return TRUE;
- *retlen = needed;
- if ( *ret )
- cmd_free ( *ret );
-#ifdef _DEBUG_MEM
- *ret = (LPTSTR)cmd_alloc_dbg ( *retlen * sizeof(TCHAR), file, line );
-#else
- *ret = (LPTSTR)cmd_alloc ( *retlen * sizeof(TCHAR) );
-#endif
- if ( !*ret )
- SetLastError ( ERROR_OUTOFMEMORY );
- return *ret != NULL;
-}
-#define GrowIfNecessary(x, y, z) GrowIfNecessary_dbg(x, y, z, __FILE__, __LINE__)
-
LPTSTR
GetEnvVar(LPCTSTR varName)
{
static LPTSTR ret = NULL;
- static UINT retlen = 0;
UINT size;
- size = GetEnvironmentVariable ( varName, ret, retlen );
- if ( size > retlen )
+ cmd_free(ret);
+ ret = NULL;
+ size = GetEnvironmentVariable(varName, NULL, 0);
+ if (size > 0)
{
- if ( !GrowIfNecessary ( size, &ret, &retlen ) )
- return NULL;
- size = GetEnvironmentVariable ( varName, ret, retlen );
+ ret = cmd_alloc(size * sizeof(TCHAR));
+ if (ret != NULL)
+ GetEnvironmentVariable(varName, ret, size + 1);
}
- if ( size )
- return ret;
- return NULL;
+ return ret;
}
LPCTSTR
@@ -1636,9 +1616,6 @@ Initialize()
NtReadVirtualMemoryPtr = (NtReadVirtualMemoryProc)GetProcAddress(NtDllModule, "NtReadVirtualMemory");
}
- cmdLine = GetCommandLine();
- TRACE ("[command args: %s]\n", debugstr_aw(cmdLine));
-
InitLocale ();
/* get default input and output console handles */
@@ -1652,9 +1629,32 @@ Initialize()
if (GetEnvironmentVariable(_T("PROMPT"),lpBuffer, sizeof(lpBuffer) / sizeof(lpBuffer[0])) == 0)
SetEnvironmentVariable (_T("PROMPT"), _T("$P$G"));
+#ifdef FEATURE_DIR_STACK
+ /* initialize directory stack */
+ InitDirectoryStack ();
+#endif
+
+#ifdef FEATURE_HISTORY
+ /*initialize history*/
+ InitHistory();
+#endif
+
+ /* Set COMSPEC environment variable */
+ if (0 != GetModuleFileName (NULL, ModuleName, _MAX_PATH + 1))
+ {
+ ModuleName[_MAX_PATH] = _T('\0');
+ SetEnvironmentVariable (_T("COMSPEC"), ModuleName);
+ }
+
+ /* add ctrl break handler */
+ AddBreakHandler ();
+
SetConsoleMode (hIn, ENABLE_PROCESSED_INPUT);
+ cmdLine = GetCommandLine();
+ TRACE ("[command args: %s]\n", debugstr_aw(cmdLine));
+
for (ptr = cmdLine; *ptr; ptr++)
{
if (*ptr == _T('/'))
@@ -1663,7 +1663,9 @@ Initialize()
if (option == _T('?'))
{
ConOutResPaging(TRUE,STRING_CMD_HELP8);
- cmd_exit(0);
+ nErrorLevel = 1;
+ bExit = TRUE;
+ return;
}
else if (option == _T('P'))
{
@@ -1731,27 +1733,6 @@ Initialize()
ConOutPuts(_T("(C) Copyright 1998-") _T(COPYRIGHT_YEAR) _T(" ReactOS Team."));
}
-#ifdef FEATURE_DIR_STACK
- /* initialize directory stack */
- InitDirectoryStack ();
-#endif
-
-
-#ifdef FEATURE_HISTORY
- /*initialize history*/
- InitHistory();
-#endif
-
- /* Set COMSPEC environment variable */
- if (0 != GetModuleFileName (NULL, ModuleName, _MAX_PATH + 1))
- {
- ModuleName[_MAX_PATH] = _T('\0');
- SetEnvironmentVariable (_T("COMSPEC"), ModuleName);
- }
-
- /* add ctrl break handler */
- AddBreakHandler ();
-
if (AutoRun)
{
ExecuteAutoRunFile(HKEY_LOCAL_MACHINE);
@@ -1796,6 +1777,8 @@ static VOID Cleanup()
CleanHistory();
#endif
+ /* free GetEnvVar's buffer */
+ GetEnvVar(NULL);
/* remove ctrl break handler */
RemoveBreakHandler ();
diff --git a/reactos/base/shell/cmd/if.c b/reactos/base/shell/cmd/if.c
index 2f2ae79e7e8..ee74c046632 100644
--- a/reactos/base/shell/cmd/if.c
+++ b/reactos/base/shell/cmd/if.c
@@ -115,16 +115,21 @@ INT ExecuteIf(PARSED_COMMAND *Cmd)
else if (Cmd->If.Operator == IF_EXIST)
{
/* IF EXIST filename: check if file exists (wildcards allowed) */
- WIN32_FIND_DATA f;
- HANDLE hFind;
-
StripQuotes(Right);
- hFind = FindFirstFile(Right, &f);
- if (hFind != INVALID_HANDLE_VALUE)
+ if (_tcschr(Right, _T('*')) || _tcschr(Right, _T('?')))
{
- result = TRUE;
- FindClose(hFind);
+ WIN32_FIND_DATA f;
+ HANDLE hFind = FindFirstFile(Right, &f);
+ if (hFind != INVALID_HANDLE_VALUE)
+ {
+ result = TRUE;
+ FindClose(hFind);
+ }
+ }
+ else
+ {
+ result = (GetFileAttributes(Right) != INVALID_FILE_ATTRIBUTES);
}
}
else
diff --git a/reactos/base/shell/cmd/lang/en-US.rc b/reactos/base/shell/cmd/lang/en-US.rc
index 7beaa5593d7..53a25387d2d 100644
--- a/reactos/base/shell/cmd/lang/en-US.rc
+++ b/reactos/base/shell/cmd/lang/en-US.rc
@@ -563,7 +563,7 @@ title new title\n"
STRING_HELP1, "List of all available commands (+ description)\n\n\
command /? For more information on a specific command\n\n\
-? List all available commands without description).\n\
+? List all available commands (without description).\n\
ALIAS Sets, removes or shows aliases.\n\
ATTRIB Displays or changes file attributes.\n\
BEEP Beep the speaker.\n\
diff --git a/reactos/base/shell/cmd/lang/no-NO.rc b/reactos/base/shell/cmd/lang/no-NO.rc
index ff0d7c3e4c5..2b1c1c941ca 100644
--- a/reactos/base/shell/cmd/lang/no-NO.rc
+++ b/reactos/base/shell/cmd/lang/no-NO.rc
@@ -243,7 +243,10 @@ Skriv ECHO uten parameter for
STRING_ECHO_HELP5, "ECHO er %s\n"
-STRING_EXIT_HELP, "Avslutt kommandotolk.\n\nEXIT\n"
+STRING_EXIT_HELP, "Avslutt kommando linje interpreter.\n\nAVSLUTT [/b] [ExitCode]\n\n\
+ /B Avslutt bare en batch fil. \n\
+ Hvis det kjres en batch fil p utsiden vil den avslutte cmd.exe\n\
+ ExitCode Denne verdien vil bli utpekt til ERRORLEVEL ved avslutting\n"
STRING_FOR_HELP1, "Kjr en spesifisert kommando for hver fil i en gruppe med filer\n\n\
FOR %variabel IN (gruppe) DO kommando [parametere]\n\n\
@@ -397,6 +400,46 @@ STRING_REN_HELP2, " %lu fil endret navn\n"
STRING_REN_HELP3, " %lu filer endret navn\n"
+STRING_REPLACE_HELP1, "Replaces files.\n\n\
+REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [/P] [/R] [/W]\n\
+REPLACE [drive1:][path1]filename [drive2:][path2] [/P] [/R] [/S] [/W] [/U]\n\n\
+ [drive1:][path1]filename Specifies the source file or files.\n\
+ [drive2:][path2] Specifies the directory where files are to be\n\
+ replaced.\n\
+ /A Adds new files to destination directory. Cannot\n\
+ use with /S or /U switches.\n\
+ /P Prompts for confirmation before replacing a file or\n\
+ adding a source file.\n\
+ /R Replaces read-only files as well as unprotected\n\
+ files.\n\
+ /S Replaces files in all subdirectories of the\n\
+ destination directory. Cannot use with the /A\n\
+ switch.\n\
+ /W Waits for you to insert a disk before beginning.\n\
+ /U Replaces (updates) only files that are older than\n\
+ source files. Cannot use with the /A switch.\n"
+
+STRING_REPLACE_HELP2, "Source path required\n"
+
+STRING_REPLACE_HELP3, "No files replaced\n"
+
+STRING_REPLACE_HELP4, "%lu file(s) replaced\n"
+
+STRING_REPLACE_HELP5, "Replacing %s\n"
+
+STRING_REPLACE_HELP6, "Replace %s\n"
+
+STRING_REPLACE_HELP7, "No files added\n"
+
+STRING_REPLACE_HELP8, "%lu file(s) added\n"
+
+STRING_REPLACE_HELP9, "Add %s (Y/N) "
+
+STRING_REPLACE_HELP10, "Replace %s (Y/N) "
+
+STRING_REPLACE_HELP11, "Adding %s\n"
+
+
STRING_SHIFT_HELP, "Endre posisjon for erstattelig parameter i et satsvis fil.\n\n\
SHIFT [NED]"
@@ -511,6 +554,7 @@ MAX maksimer vinduet\n\
RESTORE gjenopprett vinduet\n\
tittel ny tittel\n"
+
STRING_HELP1, "Liste av alle tilgjengelige kommandoer (+ beskrivelse)\n\n\
kommando /? For mer informasjon om en bestemt kommando\n\n\
? Lister alle tilgjengelige kommando uten beskrivelse).\n\
@@ -557,7 +601,6 @@ RMDIR Fjerner en mappe.\n\
SCREEN Flytter markr.\n\
SET Vis, sett, eller fjern ReactOS miljvariabel.\n\
SHIFT Shift plass for erstattelige parameter i satsvise filer.\n"
-
STRING_HELP2, "START Start et separat vindu til kjre et spesifisert program eller kommando.\n\
Utfrer kommando.\n\
TIME Vis eller sett system tid.\n\
@@ -573,9 +616,8 @@ VOL Vis et volums navn og serienummer.\n"
STRING_CHOICE_OPTION, "YN"
STRING_COPY_OPTION, "YNA"
-
+STRING_ASSOC_ERROR, "Fil association ble ikke funnet for utvidelsen %s\n"
STRING_ALIAS_ERROR, "Kommando linje for lang etter alias utvidelse!\n"
-STRING_ASSOC_ERROR, "File association not found for extension %s\n"
STRING_BATCH_ERROR, "Feil ved pning av satsvis fil\n"
STRING_CHCP_ERROR1, "Aktiv tegntabell: %u\n"
STRING_CHCP_ERROR4, "Ugyldig tegntabell\n"
@@ -643,8 +685,16 @@ STRING_ERROR_DRIVER_NOT_READY, "Stasjonen er ikke klar"
STRING_PATH_ERROR, "CMD: Ikke i miljet '%s'\n"
-STRING_REACTOS_VERSION, "ReactOS Operating System [Version %s-%s]\n"
-STRING_CMD_SHELLINFO, "\nReactOS Kommandotolk\nVersion %s %s"
+STRING_REPLACE_ERROR1, "Invalid switch - %s\n"
+STRING_REPLACE_ERROR2, "Mappen ble ikke funnet - %s\n"
+STRING_REPLACE_ERROR3, "The filename, directory name, or volume label syntax is incorrect.\n"
+STRING_REPLACE_ERROR4, "Invalid parameter combination\n"
+STRING_REPLACE_ERROR5, "Tilgang nektet - %s\n"
+STRING_REPLACE_ERROR6, "Ingen filer ble funnet - %s\n"
+STRING_REPLACE_ERROR7, "Extended Error 32\n"
+
+STRING_REACTOS_VERSION, "ReactOS Operativsystem [Versjon %s-%s]\n"
+STRING_CMD_SHELLINFO, "\nReactOS Kommandotolk\nVersjon %s %s"
STRING_VERSION_RUNVER, " kjrer p %s"
STRING_COPY_FILE , " %d file(r) kopiert\n"
STRING_DELETE_WIPE, "slettet"
@@ -656,7 +706,7 @@ STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
STRING_MORE, "More? "
-STRING_CANCEL_BATCH_FILE, "\r\nCtrl-Break pressed. Cancel batch file? (Yes/No/All) "
+STRING_CANCEL_BATCH_FILE, "\r\nCtrl-Break trykket. Avbryt batch filen? (Ja/Nei/Alt) "
STRING_INVALID_OPERAND, "Ugyldig operand."
STRING_EXPECTED_CLOSE_PAREN, "Forventet ')'."
diff --git a/reactos/base/shell/cmd/lang/sk-SK.rc b/reactos/base/shell/cmd/lang/sk-SK.rc
index 478ae88a4d3..ceaa89dc415 100644
--- a/reactos/base/shell/cmd/lang/sk-SK.rc
+++ b/reactos/base/shell/cmd/lang/sk-SK.rc
@@ -1,7 +1,7 @@
/* Slovak translation for CMD
* TRANSLATOR: Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
* DATE OF TR: 21-03-2009
- * LastChange: 27-05-2009
+ * LastChange: 21-06-2009
* _________________________________________________________________
* NOTE : this file is not really translated (only scrap yet)
*/
@@ -78,7 +78,7 @@ CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\
text Prompt string to display.\n\n\
ERRORLEVEL is set to offset of key user presses in choices.\n"
-STRING_CLS_HELP, "Clears the screen.\n\nCLS\n"
+STRING_CLS_HELP, "Vymae obrazovku.\n\nCLS\n"
STRING_CMD_HELP1, "\nInternal commands available:\n"
@@ -123,7 +123,7 @@ dec hex name dec hex name\n\
STRING_COPY_HELP1, "Overwrite %s (Yes/No/All)? "
-STRING_COPY_HELP2, "Copies one or more files to another location.\n\n\
+STRING_COPY_HELP2, "Skopruje jeden alebo viac sborov na in umiestnenie.\n\n\
COPY [/V][/Y|/-Y][/A|/B] source [/A|/B]\n\
[+ source [/A|/B] [+ ...]] [destination [/A|/B]]\n\n\
source Specifies the file or files to be copied.\n\
@@ -566,8 +566,8 @@ title new title\n"
STRING_HELP1, "Zoznam vetkch dostupnch prkazov (+ popis)\n\n\
- command /? For more information on a specific command\n\n\
-? List all available commands without description).\n\
+ prkaz /? Pre viac informci o konkrtnom prkaze\n\n\
+? Zoznam vetkch dostupnch prkazov (bez popisu).\n\
ALIAS Sets, removes or shows aliases.\n\
ATTRIB Displays or changes file attributes.\n\
BEEP Ppnutie reproduktora.\n\
@@ -575,10 +575,10 @@ CALL Calls one batch program from another.\n\
CD Displays the name of or changes the current directory.\n\
CHCP Displays or sets the active code page number.\n\
CHOICE Waits for the user to choose one of a set of choices.\n\
-CLS Clears the screen.\n\
+CLS Vymae obrazovku.\n\
CMD Starts a new instance of the ReactOS command interpreter.\n\
COLOR Sets the default console foreground and background colors.\n\
-COPY Copies one or more files to another location.\n\
+COPY Skopruje jeden alebo viac sborov na in umiestnenie.\n\
DATE Displays or sets the date.\n\
DELETE Deletes one or more files.\n\
DIR Displays a list of files and subdirectories in a directory.\n\
diff --git a/reactos/base/shell/cmd/parser.c b/reactos/base/shell/cmd/parser.c
index 1b7a8cf60a8..02cc9980447 100644
--- a/reactos/base/shell/cmd/parser.c
+++ b/reactos/base/shell/cmd/parser.c
@@ -528,78 +528,14 @@ static PARSED_COMMAND *ParseRem(void)
return NULL;
}
-static PARSED_COMMAND *ParseCommandPart(void)
+static DECLSPEC_NOINLINE PARSED_COMMAND *ParseCommandPart(REDIRECTION *RedirList)
{
TCHAR ParsedLine[CMDLINE_LENGTH];
- TCHAR *Pos;
- DWORD TailOffset;
PARSED_COMMAND *Cmd;
PARSED_COMMAND *(*Func)(void);
- REDIRECTION *RedirList = NULL;
- int Type;
- while (IsSeparator(CurChar))
- {
- if (CurChar == _T('\n'))
- return NULL;
- ParseChar();
- }
-
- if (!CurChar)
- return NULL;
-
- if (CurChar == _T(':'))
- {
- /* "Ignore" the rest of the line.
- * (Line continuations will still be parsed, though.) */
- while (ParseToken(0, NULL) != TOK_END)
- ;
- return NULL;
- }
-
- if (CurChar == _T('@'))
- {
- ParseChar();
- Cmd = cmd_alloc(sizeof(PARSED_COMMAND));
- Cmd->Type = C_QUIET;
- Cmd->Next = NULL;
- /* @ acts like a unary operator with low precedence,
- * so call the top-level parser */
- Cmd->Subcommands = ParseCommandOp(C_OP_LOWEST);
- Cmd->Redirections = NULL;
- return Cmd;
- }
-
- /* Get the head of the command */
- while (1)
- {
- Type = ParseToken(_T('('), STANDARD_SEPS);
- if (Type == TOK_NORMAL)
- {
- Pos = _stpcpy(ParsedLine, CurrentToken) + 1;
- break;
- }
- else if (Type == TOK_REDIRECTION)
- {
- if (!ParseRedirection(&RedirList))
- return NULL;
- }
- else if (Type == TOK_BEGIN_BLOCK)
- {
- return ParseBlock(RedirList);
- }
- else if (Type == TOK_END_BLOCK && !RedirList)
- {
- return NULL;
- }
- else
- {
- ParseError();
- FreeRedirection(RedirList);
- return NULL;
- }
- }
- TailOffset = Pos - ParsedLine;
+ TCHAR *Pos = _stpcpy(ParsedLine, CurrentToken) + 1;
+ DWORD TailOffset = Pos - ParsedLine;
/* Check for special forms */
if ((Func = ParseFor, _tcsicmp(ParsedLine, _T("for")) == 0) ||
@@ -624,7 +560,7 @@ static PARSED_COMMAND *ParseCommandPart(void)
/* Now get the tail */
while (1)
{
- Type = ParseToken(0, NULL);
+ int Type = ParseToken(0, NULL);
if (Type == TOK_NORMAL)
{
if (Pos + _tcslen(CurrentToken) >= &ParsedLine[CMDLINE_LENGTH])
@@ -657,12 +593,68 @@ static PARSED_COMMAND *ParseCommandPart(void)
return Cmd;
}
+static PARSED_COMMAND *ParsePrimary(void)
+{
+ REDIRECTION *RedirList = NULL;
+ int Type;
+
+ while (IsSeparator(CurChar))
+ {
+ if (CurChar == _T('\n'))
+ return NULL;
+ ParseChar();
+ }
+
+ if (!CurChar)
+ return NULL;
+
+ if (CurChar == _T(':'))
+ {
+ /* "Ignore" the rest of the line.
+ * (Line continuations will still be parsed, though.) */
+ while (ParseToken(0, NULL) != TOK_END)
+ ;
+ return NULL;
+ }
+
+ if (CurChar == _T('@'))
+ {
+ ParseChar();
+ PARSED_COMMAND *Cmd = cmd_alloc(sizeof(PARSED_COMMAND));
+ Cmd->Type = C_QUIET;
+ Cmd->Next = NULL;
+ /* @ acts like a unary operator with low precedence,
+ * so call the top-level parser */
+ Cmd->Subcommands = ParseCommandOp(C_OP_LOWEST);
+ Cmd->Redirections = NULL;
+ return Cmd;
+ }
+
+ /* Process leading redirections and get the head of the command */
+ while ((Type = ParseToken(_T('('), STANDARD_SEPS)) == TOK_REDIRECTION)
+ {
+ if (!ParseRedirection(&RedirList))
+ return NULL;
+ }
+
+ if (Type == TOK_NORMAL)
+ return ParseCommandPart(RedirList);
+ else if (Type == TOK_BEGIN_BLOCK)
+ return ParseBlock(RedirList);
+ else if (Type == TOK_END_BLOCK && !RedirList)
+ return NULL;
+
+ ParseError();
+ FreeRedirection(RedirList);
+ return NULL;
+}
+
static PARSED_COMMAND *ParseCommandOp(int OpType)
{
PARSED_COMMAND *Cmd, *Left, *Right;
if (OpType == C_OP_HIGHEST)
- Cmd = ParseCommandPart();
+ Cmd = ParsePrimary();
else
Cmd = ParseCommandOp(OpType + 1);
diff --git a/reactos/base/shell/explorer-new/explorer.rc b/reactos/base/shell/explorer-new/explorer.rc
index 15cfe4a7a1f..ed22ecab9cf 100644
--- a/reactos/base/shell/explorer-new/explorer.rc
+++ b/reactos/base/shell/explorer-new/explorer.rc
@@ -11,6 +11,16 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
IDI_START ICON DISCARDABLE res/start.ico
IDB_STARTMENU BITMAP DISCARDABLE res/logov.bmp
+IDB_TASKBARPROP_AUTOHIDE BITMAP DISCARDABLE res/auto_hide.bmp
+IDB_TASKBARPROP_LOCK_GROUP_NOQL BITMAP DISCARDABLE res/lock_group_noql.bmp
+IDB_TASKBARPROP_LOCK_GROUP_QL BITMAP DISCARDABLE res/lock_group_ql.bmp
+IDB_TASKBARPROP_LOCK_NOGROUP_NOQL BITMAP DISCARDABLE res/lock_nogroup_noql.bmp
+IDB_TASKBARPROP_LOCK_NOGROUP_QL BITMAP DISCARDABLE res/lock_nogroup_ql.bmp
+IDB_TASKBARPROP_NOLOCK_GROUP_NOQL BITMAP DISCARDABLE res/nolock_group_noql.bmp
+IDB_TASKBARPROP_NOLOCK_NOGROUP_NOQL BITMAP DISCARDABLE res/nolock_nogroup_noql.bmp
+IDB_TASKBARPROP_NOLOCK_NOGROUP_QL BITMAP DISCARDABLE res/nolock_nogroup_ql.bmp
+IDB_TASKBARPROP_NOLOCK_GROUP_QL BITMAP DISCARDABLE res/nolock_group_ql.bmp
+
#include "lang/bg-BG.rc"
#include "lang/cs-CZ.rc"
#include "lang/de-DE.rc"
diff --git a/reactos/base/shell/explorer-new/lang/bg-BG.rc b/reactos/base/shell/explorer-new/lang/bg-BG.rc
index 01baa44df0d..53c78ab4749 100644
--- a/reactos/base/shell/explorer-new/lang/bg-BG.rc
+++ b/reactos/base/shell/explorer-new/lang/bg-BG.rc
@@ -4,6 +4,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "& ", ID_LOCKTASKBAR
MENUITEM "&", ID_SHELL_CMD_PROPERTIES
END
@@ -58,3 +61,69 @@ BEGIN
IDS_OPEN_ALL_USERS "& "
IDS_EXPLORE_ALL_USERS "& "
END
+
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Taskbar"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Start Menu"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Notification Area"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Toolbars"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+END
diff --git a/reactos/base/shell/explorer-new/lang/cs-CZ.rc b/reactos/base/shell/explorer-new/lang/cs-CZ.rc
index 3244e159761..c82c31a89a0 100644
--- a/reactos/base/shell/explorer-new/lang/cs-CZ.rc
+++ b/reactos/base/shell/explorer-new/lang/cs-CZ.rc
@@ -1,6 +1,7 @@
-/* FILE: shell/explorer-new/lang/cs-CZ.rc
+/*
+ * FILE: base/shell/explorer-new/lang/cs-CZ.rc
* TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com)
- * UPDATED: 2008-07-27
+ * UPDATED: 2009-07-15
*/
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
@@ -9,6 +10,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Sprvce loh", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "&Uzamknout hlavn panel", ID_LOCKTASKBAR
MENUITEM "Vl&astnosti", ID_SHELL_CMD_PROPERTIES
END
@@ -55,6 +59,67 @@ BEGIN
END
END
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Hlavn panel"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Vzhled hlavnho panelu", IDC_STATIC, 6,6,240,121
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21
+ AUTOCHECKBOX "Uzamknout &hlavn panel", IDC_TASKBARPROP_LOCK, 13,45,200,10
+ AUTOCHECKBOX "&Automaticky sktvat hlavn panel", IDC_TASKBARPROP_HIDE, 13,58,200,10
+ AUTOCHECKBOX "&Zobrazit hlavn panel nad ostatnmi okny", IDC_TASKBARPROP_ONTOP, 13,71,200,10
+ AUTOCHECKBOX "&Seskupovat podobn tlatka hlavnho panelu", IDC_TASKBARPROP_GROUP, 13,84,200,10
+ AUTOCHECKBOX "Zobrazit &panel Snadn sputn", IDC_TASKBARPROP_SHOWQL, 13,97,200,10
+ AUTOCHECKBOX "Zobrazit &nhledy oken", IDC_TASKBARPROP_WNDPREV, 13,110,200,10
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Start Menu"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "Start &menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "Tento styl menu umouje snadn pstup ke slokm, oblbenm programm a vyhledvn.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Upravit...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "&Klasick Start menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "Tento styl menu umouje pouvat klasick vzhled a funkce",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "Up&ravit...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Soukrom",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Uloit a zobrazit seznam naposledy otevench &soubor", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Uloit a zobrazit seznam naposledy sputnch &program",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Oznamovac oblast"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Ikony", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "Pehledost oznamovac oblasti lze zachovat pomoc skryt nepouvanch ikon.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "Sk&rt neaktivn ikony", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Upravit...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "Systmov ikony", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Vyberte systmov ikony, kter se maj vdy zobrazit.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Hodiny", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "H&lasitost", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "S&", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Napjen", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Panely nstroj"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Vyberte panely nstroj, kter maj bt pdny na hlavn panel.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
STRINGTABLE DISCARDABLE
BEGIN
IDS_START "Start"
@@ -62,3 +127,8 @@ BEGIN
IDS_OPEN_ALL_USERS "Ote&vt sloku All Users"
IDS_EXPLORE_ALL_USERS "Pro&chzet sloku All Users"
END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Vlastnosti hlavnho panelu a Start menu"
+END
diff --git a/reactos/base/shell/explorer-new/lang/de-DE.rc b/reactos/base/shell/explorer-new/lang/de-DE.rc
index 4e3d4aa223b..4cad078e045 100644
--- a/reactos/base/shell/explorer-new/lang/de-DE.rc
+++ b/reactos/base/shell/explorer-new/lang/de-DE.rc
@@ -4,6 +4,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "Taskbar fi&xieren", ID_LOCKTASKBAR
MENUITEM "E&igenschaften", ID_SHELL_CMD_PROPERTIES
END
@@ -50,6 +53,67 @@ BEGIN
END
END
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Taskbar"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Start Menu"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Notification Area"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Toolbars"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
STRINGTABLE DISCARDABLE
BEGIN
IDS_START "Start"
@@ -57,3 +121,8 @@ BEGIN
IDS_OPEN_ALL_USERS "ffnen &Alle Benutzer"
IDS_EXPLORE_ALL_USERS "Explorer A&lle Benutzer"
END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+END
diff --git a/reactos/base/shell/explorer-new/lang/en-US.rc b/reactos/base/shell/explorer-new/lang/en-US.rc
index 925640b9fd3..9e1d6876fde 100644
--- a/reactos/base/shell/explorer-new/lang/en-US.rc
+++ b/reactos/base/shell/explorer-new/lang/en-US.rc
@@ -4,6 +4,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "&Lock the Taskbar", ID_LOCKTASKBAR
MENUITEM "P&roperties", ID_SHELL_CMD_PROPERTIES
END
@@ -50,6 +53,67 @@ BEGIN
END
END
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Taskbar"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21
+ AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10
+ AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10
+ AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10
+ AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10
+ AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10
+ AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Start Menu"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Notification Area"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Toolbars"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
STRINGTABLE DISCARDABLE
BEGIN
IDS_START "Start"
@@ -57,3 +121,8 @@ BEGIN
IDS_OPEN_ALL_USERS "O&pen All Users"
IDS_EXPLORE_ALL_USERS "E&xplore All Users"
END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+END
diff --git a/reactos/base/shell/explorer-new/lang/es-ES.rc b/reactos/base/shell/explorer-new/lang/es-ES.rc
index 4f992280ced..4aee2ec8839 100644
--- a/reactos/base/shell/explorer-new/lang/es-ES.rc
+++ b/reactos/base/shell/explorer-new/lang/es-ES.rc
@@ -4,6 +4,7 @@
* FILE: base/shell/explorer-new/lang/es-ES.rc
* PURPOSE: Spanish Language File for ReactOS Explorer
* TRANSLATOR: 2007 Marc Piulachs (marc [dot] piulachs [at] codexchange [dot] net)
+ * updated July 2009: Gabriel ilardi gabrielilardi [at] hotmail [dot] it
*/
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
@@ -12,6 +13,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Administrador de tareas", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "&Bloquear la barra de tareas", ID_LOCKTASKBAR
MENUITEM "P&ropiedades", ID_SHELL_CMD_PROPERTIES
END
@@ -65,3 +69,69 @@ BEGIN
IDS_OPEN_ALL_USERS "A&brir todos los usuarios"
IDS_EXPLORE_ALL_USERS "E&xplorar todos los usuarios"
END
+
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Taskbar"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Apariencia de la Barra de tareas", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Bloquear la barra de tareas", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "E&sconder automaticamente la barra", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Mantener la barra de tareas en primer plano", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Agrupar botones similares", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Mostrar &Inicio rpido", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "M&ostrar vista previa de las ventanas (miniaturas)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Men inicio"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Men inicio", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "Este estilo de men te da un acceso fcil a tus carpetas, programas favoritos, y bsqueda.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Personalizar...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Men Inicio &clsico", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "Este estilo de men te da la apariencia y funcionalidad clsicas",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "P&ersonalizar...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Privacidad",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Guardar y mostrar una lista de los &ficheros abiertos recientemente", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Guardar y mostrar una lista de los &programas abiertos recientemente",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Area de notificacin"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Iconos", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "Puedes mantener libre el rea de notifacin escondiendo iconos que no has usado recientemente.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Esconder inconos inactivos", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Personalizar...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "Iconos de sistema", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Elije que iconos de sistema mostrar siempre.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "Relo&j", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volumen", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Red", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Alimentacin", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Toolbars"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Elije que barra de herramientas agregar a la Barra de tareas.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Propiedades de la Barra de tareas y del Men inicio"
+END
diff --git a/reactos/base/shell/explorer-new/lang/fr-FR.rc b/reactos/base/shell/explorer-new/lang/fr-FR.rc
index ef7e5b7c6bf..7b1ac5a0df3 100644
--- a/reactos/base/shell/explorer-new/lang/fr-FR.rc
+++ b/reactos/base/shell/explorer-new/lang/fr-FR.rc
@@ -4,6 +4,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "Vroui&ller la barre de tches", ID_LOCKTASKBAR
MENUITEM "P&roprits", ID_SHELL_CMD_PROPERTIES
END
@@ -57,3 +60,69 @@ BEGIN
IDS_OPEN_ALL_USERS "Ouvrir tous les utilisateurs"
IDS_EXPLORE_ALL_USERS "E&xplorer tous les utilisateurs"
END
+
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Taskbar"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Start Menu"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Notification Area"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Toolbars"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+END
diff --git a/reactos/base/shell/explorer-new/lang/it-IT.rc b/reactos/base/shell/explorer-new/lang/it-IT.rc
index 30688b3572b..224691c753f 100644
--- a/reactos/base/shell/explorer-new/lang/it-IT.rc
+++ b/reactos/base/shell/explorer-new/lang/it-IT.rc
@@ -4,7 +4,10 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
- MENUITEM "&Blocca la barra dei task", ID_LOCKTASKBAR
+ MENUITEM SEPARATOR
+ MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
+ MENUITEM "&Blocca la Barra delle applicazioni", ID_LOCKTASKBAR
MENUITEM "&Propriet", ID_SHELL_CMD_PROPERTIES
END
END
@@ -57,3 +60,69 @@ BEGIN
IDS_OPEN_ALL_USERS "&Apri tutti gli utenti"
IDS_EXPLORE_ALL_USERS "&Esplora tutti gli utenti"
END
+
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Barra delle applicazioni"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Aspetto della Barra delle applicazioni", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Bloccare la Barra delle applicazioni", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "N&ascondere automaticamente", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Mantenere la Barra delle applicazioni in &primo piano", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Raggruppare pulsanti simili", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Mostrare Avvio &veloce", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Mostrare anteprima delle finestre (miniature)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Men avvio"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Men avvio", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Personalizzare...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Men avvio &classico", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Area di notifica"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Icone", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "Puoi tenere libera l'area di notifica nascondendo icone non usate recentemente.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Nascondere icone inattive", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Personalizzare...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "Icone di sistema", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Scegli che icone di sistema mostrare sempre.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "Orolog&io", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Rete", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Alimentazione", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Barre degli strumenti"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Scegliere che barre degli strumenti aggiungere alla Barra delle applicazioni.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Propriet della Barra delle applicazioni e del Men di avvio"
+END
diff --git a/reactos/base/shell/explorer-new/lang/ja-JP.rc b/reactos/base/shell/explorer-new/lang/ja-JP.rc
index 637c62aa218..485680aa8a3 100644
--- a/reactos/base/shell/explorer-new/lang/ja-JP.rc
+++ b/reactos/base/shell/explorer-new/lang/ja-JP.rc
@@ -4,6 +4,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "^XN o[Œ肷(&L)", ID_LOCKTASKBAR
MENUITEM "vpeB(R)", ID_SHELL_CMD_PROPERTIES
END
@@ -57,3 +60,69 @@ BEGIN
IDS_OPEN_ALL_USERS "J - All Users(&P)"
IDS_EXPLORE_ALL_USERS "GNXv[ - All Users(&E)"
END
+
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Taskbar"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Start Menu"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Notification Area"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Toolbars"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+END
diff --git a/reactos/base/shell/explorer-new/lang/ko-KR.rc b/reactos/base/shell/explorer-new/lang/ko-KR.rc
index c54f4808b5b..36427238fdd 100644
--- a/reactos/base/shell/explorer-new/lang/ko-KR.rc
+++ b/reactos/base/shell/explorer-new/lang/ko-KR.rc
@@ -8,6 +8,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "۾ ǥ ױ(&L)", ID_LOCKTASKBAR
MENUITEM "Ӽ(&R)", ID_SHELL_CMD_PROPERTIES
END
@@ -61,3 +64,69 @@ BEGIN
IDS_OPEN_ALL_USERS " - All Users(&P)"
IDS_EXPLORE_ALL_USERS "Ž - All Users(&X)"
END
+
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Taskbar"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Start Menu"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Notification Area"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Toolbars"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+END
diff --git a/reactos/base/shell/explorer-new/lang/lt-LT.rc b/reactos/base/shell/explorer-new/lang/lt-LT.rc
index 0f03b69069a..a6e944b2798 100644
--- a/reactos/base/shell/explorer-new/lang/lt-LT.rc
+++ b/reactos/base/shell/explorer-new/lang/lt-LT.rc
@@ -9,6 +9,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "&Urakinti uduoi juost", ID_LOCKTASKBAR
MENUITEM "&Parametrai", ID_SHELL_CMD_PROPERTIES
END
@@ -62,3 +65,69 @@ BEGIN
IDS_OPEN_ALL_USERS "&Atverti visus vartotojus"
IDS_EXPLORE_ALL_USERS "&Naryti visus vartotojus"
END
+
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Taskbar"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Start Menu"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Notification Area"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Toolbars"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+END
diff --git a/reactos/base/shell/explorer-new/lang/nl-NL.rc b/reactos/base/shell/explorer-new/lang/nl-NL.rc
index 6d2f7d322dd..d94cde17719 100644
--- a/reactos/base/shell/explorer-new/lang/nl-NL.rc
+++ b/reactos/base/shell/explorer-new/lang/nl-NL.rc
@@ -4,6 +4,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "&Takenbalk vergrendelen", ID_LOCKTASKBAR
MENUITEM "&Eigenschappen", ID_SHELL_CMD_PROPERTIES
END
@@ -57,3 +60,69 @@ BEGIN
IDS_OPEN_ALL_USERS "&Open Alle Gebruikers"
IDS_EXPLORE_ALL_USERS "&Alle Gebruikers V&erkennen"
END
+
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Taskbar"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Start Menu"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Notification Area"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Toolbars"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+END
diff --git a/reactos/base/shell/explorer-new/lang/no-NO.rc b/reactos/base/shell/explorer-new/lang/no-NO.rc
index fc835755520..f6ec7a910c8 100644
--- a/reactos/base/shell/explorer-new/lang/no-NO.rc
+++ b/reactos/base/shell/explorer-new/lang/no-NO.rc
@@ -4,6 +4,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Oppgavebehandler", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "&Ls oppgavelinjen", ID_LOCKTASKBAR
MENUITEM "E&genskaper", ID_SHELL_CMD_PROPERTIES
END
@@ -32,14 +35,14 @@ BEGIN
MENUITEM "", -1, MFT_SEPARATOR
MENUITEM "&Sikkerhet...", IDM_SECURITY, MFT_STRING, MFS_ENABLED
MENUITEM "&Nettverk tilkoblinger", IDM_NETWORKCONNECTIONS, MFT_STRING, MFS_ENABLED
- MENUITEM "&Printere og Fakser", IDM_PRINTERSANDFAXES, MFT_STRING, MFS_ENABLED
- MENUITEM "&Oppgavelinje og Start meny", IDM_TASKBARANDSTARTMENU, MFT_STRING, MFS_ENABLED
+ MENUITEM "&Skrivere og fakser", IDM_PRINTERSANDFAXES, MFT_STRING, MFS_ENABLED
+ MENUITEM "&Oppgavelinje og Startmeny", IDM_TASKBARANDSTARTMENU, MFT_STRING, MFS_ENABLED
END
POPUP "S&k", IDM_SEARCH
BEGIN
MENUITEM "", -1, MFT_SEPARATOR
END
- MENUITEM "&Hjelp og Sttte", IDM_HELPANDSUPPORT, MFT_STRING, MFS_ENABLED
+ MENUITEM "&Hjelp og sttte", IDM_HELPANDSUPPORT, MFT_STRING, MFS_ENABLED
MENUITEM "&Kjr...", IDM_RUN, MFT_STRING, MFS_ENABLED
MENUITEM "", 450, MFT_SEPARATOR, MFS_ENABLED
MENUITEM "S&ynkroniser", IDM_SYNCHRONIZE, MFT_STRING, MFS_ENABLED
@@ -50,6 +53,67 @@ BEGIN
END
END
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Oppgavelinje"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Oppgavelinjens egenskaper", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Ls oppgavelinjen", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Skjul oppgavelinjen automatisk", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Behold &oppgavelinjen p toppen over andre vinduer", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Grupper og lignende knapper p oppgavelinjen", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Vis &hurtigstart", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Vis vinduforhndvisning (miniaturbilde)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Startmeny"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Startmeny", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "Denne meny stilen gir deg enkelt tilgang til dine mapper, favoritt programmer, og sk.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Tilpass...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Klassisk Start&meny", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "Denne menystilen gir deg en klassisk utsende og funksjoner",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Tilpass...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Personvern",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Lagre og vis en liste av sist pnet &filer", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Lagre og vis en liste av sist pnet &programmer",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Systemstatusfelt"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Ikoner", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "Du kan beholde systemfeltet ryddig ved skjule ikoner som du ikke har brukt s ofte.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Skjul inaktive ikoner", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Tilpass...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "Systemikoner", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Velg hvilken systemikoner som skal vises.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Klokke", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volum", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Nettverk", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Strm", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Verktylinje"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Velg hvilken av verktylinjene som skal legges til p oppgavelinjen.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
STRINGTABLE DISCARDABLE
BEGIN
IDS_START "Start"
@@ -57,3 +121,8 @@ BEGIN
IDS_OPEN_ALL_USERS "&pne alle brukere"
IDS_EXPLORE_ALL_USERS "U&tforsk alle brukere"
END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Egenskaper for oppgavelinjen og startmeny"
+END
diff --git a/reactos/base/shell/explorer-new/lang/pl-PL.rc b/reactos/base/shell/explorer-new/lang/pl-PL.rc
index 05a3da9f046..d750fd17772 100644
--- a/reactos/base/shell/explorer-new/lang/pl-PL.rc
+++ b/reactos/base/shell/explorer-new/lang/pl-PL.rc
@@ -1,4 +1,5 @@
//Polish translation by Caemyr - Olaf Siejka (caemyr@gmail.com) June, 2007
+// updated by niski - Maciej Bialas (bjauy@o2.pl), July 2009
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
@@ -6,6 +7,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Meneder zada", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "&Zablokuj Pasek zada", ID_LOCKTASKBAR
MENUITEM "&Waciwoci", ID_SHELL_CMD_PROPERTIES
END
@@ -47,11 +51,72 @@ BEGIN
MENUITEM "S&ynchronizuj", IDM_SYNCHRONIZE, MFT_STRING, MFS_ENABLED
MENUITEM "&Wyloguj %s...", IDM_LOGOFF, MFT_STRING, MFS_ENABLED
MENUITEM "&Rozcz...", IDM_DISCONNECT, MFT_STRING, MFS_ENABLED
- MENUITEM "Wydokuj &komputer", IDM_UNDOCKCOMPUTER, MFT_STRING, MFS_ENABLED
+ MENUITEM "Oddokuj &komputer", IDM_UNDOCKCOMPUTER, MFT_STRING, MFS_ENABLED
MENUITEM "&Zamknij system...", IDM_SHUTDOWN, MFT_STRING, MFS_ENABLED
END
END
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Pasek zada"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Wygld paska zada", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Zablokuj pasek zada", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "A&utomatyczne ukrywanie paska zada", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Zawsze &na wierzchu", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Grupuj programy w pasku zada", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Poka pasek &Szybkiego uruchamiania", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Poka podgld okien (miniaturki)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Menu Start"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Menu Start", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "Ten styl menu daje Tobie atwy dostp do Twoich folderw, ulubionych programw i wyszukiwania.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Dostosuj...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "&Klasyczne Menu Start", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "Ten styl menu zawiera klasyczny wygld i funkcjonalno",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Dostosuj...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Prywatno",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Zachowaj i wywietl list niedawno &otwartych plikw", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Zachowaj i wywietl list niedawno otwartych &programw",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Obszar powiadomie"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Ikony", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "Moesz uporzdkowa obszar powiadomie poprzez ukrycie rzadko uywanych ikon.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Ukryj nieaktywne ikony", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Dostosuj...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "Ikony systemowe", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Wybierz zawsze widoczne ikony systemowe.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Zegar", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Gono", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Sie", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "Z&arzdzanie energi", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Paski narzdzi"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Wybierz paski narzdzi, ktre chcesz doda do paska zada.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
STRINGTABLE DISCARDABLE
BEGIN
IDS_START "Start"
@@ -59,3 +124,8 @@ BEGIN
IDS_OPEN_ALL_USERS "&Otwrz - wszyscy uytkownicy"
IDS_EXPLORE_ALL_USERS "&Eksploruj - wszyscy uytkownicy"
END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Waciwoci paska zada i Menu Start"
+END
diff --git a/reactos/base/shell/explorer-new/lang/ro-RO.rc b/reactos/base/shell/explorer-new/lang/ro-RO.rc
index cea201e2fbf..aa8a81fa107 100644
--- a/reactos/base/shell/explorer-new/lang/ro-RO.rc
+++ b/reactos/base/shell/explorer-new/lang/ro-RO.rc
@@ -4,6 +4,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "&Blocare bar de activiti", ID_LOCKTASKBAR
MENUITEM "P&roprieti", ID_SHELL_CMD_PROPERTIES
END
@@ -18,7 +21,7 @@ BEGIN
BEGIN
MENUITEM "(Gol)", -1, MFT_STRING, MFS_GRAYED
END
- POPUP "F&avoritee", IDM_FAVORITES
+ POPUP "F&avorite", IDM_FAVORITES
BEGIN
MENUITEM "(Gol)", -1, MFT_STRING, MFS_GRAYED
END
@@ -45,8 +48,8 @@ BEGIN
MENUITEM "S&incronizare", IDM_SYNCHRONIZE, MFT_STRING, MFS_ENABLED
MENUITEM "&Ieire din %s...", IDM_LOGOFF, MFT_STRING, MFS_ENABLED
MENUITEM "D&econectare...", IDM_DISCONNECT, MFT_STRING, MFS_ENABLED
- MENUITEM "Undock calcula&tor", IDM_UNDOCKCOMPUTER, MFT_STRING, MFS_ENABLED
- MENUITEM "n&chidere calculator", IDM_SHUTDOWN, MFT_STRING, MFS_ENABLED
+ MENUITEM "Deconectare compu&ter", IDM_UNDOCKCOMPUTER, MFT_STRING, MFS_ENABLED
+ MENUITEM "n&chidere computer", IDM_SHUTDOWN, MFT_STRING, MFS_ENABLED
END
END
@@ -57,3 +60,69 @@ BEGIN
IDS_OPEN_ALL_USERS "Deschidere& Toi Utilizatorii"
IDS_EXPLORE_ALL_USERS "E&xplorare Toi Utilizatorii"
END
+
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Taskbar"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Start Menu"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Notification Area"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Toolbars"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+END
diff --git a/reactos/base/shell/explorer-new/lang/ru-RU.rc b/reactos/base/shell/explorer-new/lang/ru-RU.rc
index ec874784b2e..59c41a77b40 100644
--- a/reactos/base/shell/explorer-new/lang/ru-RU.rc
+++ b/reactos/base/shell/explorer-new/lang/ru-RU.rc
@@ -1,4 +1,4 @@
-// Russian language resource file (Lentin, 2007-06-10)
+// Russian language resource file (Lentin, 2007-06-10 tower 2009 jul 14)
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
@@ -6,6 +6,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM " ", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "& ", ID_LOCKTASKBAR
MENUITEM "&", ID_SHELL_CMD_PROPERTIES
END
@@ -52,6 +55,67 @@ BEGIN
END
END
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION " "
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX " ", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "& ", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "& ", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "& ", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "& ", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX " & ", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "& ()", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION " """""
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "& """"", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT " , .", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "& """"", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT " """".",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "",IDC_STATIC, 7,100,238,50
+ AUTOCHECKBOX " &", IDC_TASKBARPROP_RECENTFILES, 14,114,227,10, WS_DISABLED
+ AUTOCHECKBOX " &",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,17, WS_DISABLED | BS_MULTILINE
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION " "
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT " , , .", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "& ", IDC_TASKBARPROP_HIDEICONS, 13,70,140,10, WS_DISABLED
+ PUSHBUTTON "&...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX " ", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT " .", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "&", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION " "
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT " , .", IDC_STATIC, 7,7,238,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
STRINGTABLE DISCARDABLE
BEGIN
IDS_START ""
@@ -59,3 +123,8 @@ BEGIN
IDS_OPEN_ALL_USERS "& "
IDS_EXPLORE_ALL_USERS "& "
END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION " "
+END
diff --git a/reactos/base/shell/explorer-new/lang/sk-SK.rc b/reactos/base/shell/explorer-new/lang/sk-SK.rc
index eeb46c10b8f..285012a8944 100644
--- a/reactos/base/shell/explorer-new/lang/sk-SK.rc
+++ b/reactos/base/shell/explorer-new/lang/sk-SK.rc
@@ -4,6 +4,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "Za&mkn panel loh", ID_LOCKTASKBAR
MENUITEM "&Vlastnosti", ID_SHELL_CMD_PROPERTIES
END
@@ -57,3 +60,69 @@ BEGIN
IDS_OPEN_ALL_USERS "&Otvori profil All Users"
IDS_EXPLORE_ALL_USERS "&Preskma profil All Users"
END
+
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Taskbar"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Start Menu"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Notification Area"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Toolbars"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+END
diff --git a/reactos/base/shell/explorer-new/lang/uk-UA.rc b/reactos/base/shell/explorer-new/lang/uk-UA.rc
index 7148f0b9a50..db4944b294c 100644
--- a/reactos/base/shell/explorer-new/lang/uk-UA.rc
+++ b/reactos/base/shell/explorer-new/lang/uk-UA.rc
@@ -12,6 +12,9 @@ IDM_TRAYWND MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM SEPARATOR
MENUITEM "& ", ID_LOCKTASKBAR
MENUITEM "&", ID_SHELL_CMD_PROPERTIES
END
@@ -65,3 +68,69 @@ BEGIN
IDS_OPEN_ALL_USERS "& "
IDS_EXPLORE_ALL_USERS "& "
END
+
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Taskbar"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
+ AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Start Menu"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Notification Area"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Toolbars"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+END
diff --git a/reactos/base/shell/explorer-new/res/auto_hide.bmp b/reactos/base/shell/explorer-new/res/auto_hide.bmp
new file mode 100644
index 00000000000..5780ab5ff1b
Binary files /dev/null and b/reactos/base/shell/explorer-new/res/auto_hide.bmp differ
diff --git a/reactos/base/shell/explorer-new/res/lock_group_noql.bmp b/reactos/base/shell/explorer-new/res/lock_group_noql.bmp
new file mode 100644
index 00000000000..d9bd1e754ef
Binary files /dev/null and b/reactos/base/shell/explorer-new/res/lock_group_noql.bmp differ
diff --git a/reactos/base/shell/explorer-new/res/lock_group_ql.bmp b/reactos/base/shell/explorer-new/res/lock_group_ql.bmp
new file mode 100644
index 00000000000..82b085af0d1
Binary files /dev/null and b/reactos/base/shell/explorer-new/res/lock_group_ql.bmp differ
diff --git a/reactos/base/shell/explorer-new/res/lock_nogroup_noql.bmp b/reactos/base/shell/explorer-new/res/lock_nogroup_noql.bmp
new file mode 100644
index 00000000000..d12309f830a
Binary files /dev/null and b/reactos/base/shell/explorer-new/res/lock_nogroup_noql.bmp differ
diff --git a/reactos/base/shell/explorer-new/res/lock_nogroup_ql.bmp b/reactos/base/shell/explorer-new/res/lock_nogroup_ql.bmp
new file mode 100644
index 00000000000..56c2c2ab6af
Binary files /dev/null and b/reactos/base/shell/explorer-new/res/lock_nogroup_ql.bmp differ
diff --git a/reactos/base/shell/explorer-new/res/nolock_group_noql.bmp b/reactos/base/shell/explorer-new/res/nolock_group_noql.bmp
new file mode 100644
index 00000000000..6f9164439a2
Binary files /dev/null and b/reactos/base/shell/explorer-new/res/nolock_group_noql.bmp differ
diff --git a/reactos/base/shell/explorer-new/res/nolock_group_ql.bmp b/reactos/base/shell/explorer-new/res/nolock_group_ql.bmp
new file mode 100644
index 00000000000..f4546f18fb8
Binary files /dev/null and b/reactos/base/shell/explorer-new/res/nolock_group_ql.bmp differ
diff --git a/reactos/base/shell/explorer-new/res/nolock_nogroup_noql.bmp b/reactos/base/shell/explorer-new/res/nolock_nogroup_noql.bmp
new file mode 100644
index 00000000000..3461e443ab8
Binary files /dev/null and b/reactos/base/shell/explorer-new/res/nolock_nogroup_noql.bmp differ
diff --git a/reactos/base/shell/explorer-new/res/nolock_nogroup_ql.bmp b/reactos/base/shell/explorer-new/res/nolock_nogroup_ql.bmp
new file mode 100644
index 00000000000..c559ca8a6d2
Binary files /dev/null and b/reactos/base/shell/explorer-new/res/nolock_nogroup_ql.bmp differ
diff --git a/reactos/base/shell/explorer-new/resource.h b/reactos/base/shell/explorer-new/resource.h
index 51702212ba6..aeed8061345 100644
--- a/reactos/base/shell/explorer-new/resource.h
+++ b/reactos/base/shell/explorer-new/resource.h
@@ -1,6 +1,8 @@
#ifndef __RESOURCE_H
#define __RESOURCE_H
+#define IDC_STATIC -1
+
#define IDI_START 101
#define IDS_START 101
@@ -21,6 +23,7 @@
#define ID_SHELL_CMD_OPEN_ALL_USERS (ID_SHELL_CMD_LAST + 2)
#define ID_SHELL_CMD_EXPLORE_ALL_USERS (ID_SHELL_CMD_LAST + 3)
#define ID_LOCKTASKBAR (ID_SHELL_CMD_LAST + 4)
+#define ID_SHELL_CMD_OPEN_TASKMGR (ID_SHELL_CMD_LAST + 5)
/* NOTE: The following constants may *NOT* be changed because
they're hardcoded and need to be the exact values
@@ -44,4 +47,56 @@
#define IDM_SHUTDOWN 506
#define IDM_LASTSTARTMENU_SEPARATOR 450
+/* Taskbar resources */
+#define IDD_TASKBARPAGE 2000
+#define IDC_TASKBAR_BITMAP 2001
+#define IDD_STARTMENUPAGE 2001
+#define IDD_NOTIFICATIONPAGE 2002
+#define IDD_TOOLBARSPAGE 2003
+
+/* Taskbar properties, taskbar */
+#define IDD_TASKBARPROP_TASKBAR 2000
+#define IDC_TASKBARPROP_TASKBARBITMAP 2001
+#define IDC_TASKBARPROP_LOCK 2002
+#define IDC_TASKBARPROP_HIDE 2003
+#define IDC_TASKBARPROP_ONTOP 2004
+#define IDC_TASKBARPROP_GROUP 2005
+#define IDC_TASKBARPROP_SHOWQL 2006
+#define IDC_TASKBARPROP_WNDPREV 2007
+
+#define IDB_TASKBARPROP_AUTOHIDE 2050
+#define IDB_TASKBARPROP_LOCK_GROUP_NOQL 2051
+#define IDB_TASKBARPROP_LOCK_GROUP_QL 2052
+#define IDB_TASKBARPROP_LOCK_NOGROUP_NOQL 2053
+#define IDB_TASKBARPROP_LOCK_NOGROUP_QL 2054
+#define IDB_TASKBARPROP_NOLOCK_GROUP_NOQL 2055
+#define IDB_TASKBARPROP_NOLOCK_NOGROUP_NOQL 2056
+#define IDB_TASKBARPROP_NOLOCK_NOGROUP_QL 2057
+#define IDB_TASKBARPROP_NOLOCK_GROUP_QL 2058
+
+/* Taskbar properties, startmenu*/
+#define IDD_TASKBARPROP_STARTMENU 2100
+#define IDC_TASKBARPROP_STARTMENU 2101
+#define IDC_TASKBARPROP_STARTMENUCUST 2102
+#define IDC_TASKBARPROP_STARTMENUCLASSIC 2103
+#define IDC_TASKBARPROP_STARTMENUCLASSICCUST 2104
+#define IDC_TASKBARPROP_RECENTFILES 2105
+#define IDC_TASKBARPROP_RECENTFOLDERS 2106
+
+/* Taskbar properties, notification */
+#define IDD_TASKBARPROP_NOTIFICATION 2200
+#define IDC_TASKBARPROP_NOTIFICATIONBITMAP 2201
+#define IDC_TASKBARPROP_HIDEICONS 2202
+#define IDC_TASKBARPROP_ICONCUST 2203
+#define IDC_TASKBARPROP_CLOCK 2204
+#define IDC_TASKBARPROP_VOLUME 2205
+#define IDC_TASKBARPROP_NETWORK 2206
+#define IDC_TASKBARPROP_POWER 2207
+
+/* Taskbar properties, toolbars */
+#define IDD_TASKBARPROP_TOOLBARS 2300
+#define IDC_TASKBARPROP_DESKBANDLIST 2301
+
+#define IDS_TASKBAR_STARTMENU_PROP_CAPTION 2200
+
#endif /* __RESOURCE_H */
diff --git a/reactos/base/shell/explorer-new/taskswnd.c b/reactos/base/shell/explorer-new/taskswnd.c
index e1e578d36b4..85829561a03 100644
--- a/reactos/base/shell/explorer-new/taskswnd.c
+++ b/reactos/base/shell/explorer-new/taskswnd.c
@@ -1028,6 +1028,21 @@ TaskSwitchWnd_AddTask(IN OUT PTASK_SWITCH_WND This,
return TaskItem != NULL;
}
+static BOOL
+TaskSwitchWnd_ActivateTaskItem(IN OUT PTASK_SWITCH_WND This,
+ IN OUT PTASK_ITEM TaskItem OPTIONAL)
+{
+ if (TaskItem != NULL)
+ {
+ DbgPrint("Activate window 0x%p on button %d\n", TaskItem->hWnd, TaskItem->Index);
+ }
+
+ TaskSwitchWnd_CheckActivateTaskItem(This,
+ TaskItem);
+
+ return FALSE;
+}
+
static BOOL
TaskSwitchWnd_ActivateTask(IN OUT PTASK_SWITCH_WND This,
IN HWND hWnd)
@@ -1041,20 +1056,14 @@ TaskSwitchWnd_ActivateTask(IN OUT PTASK_SWITCH_WND This,
TaskItem = TaskSwitchWnd_FindOtherTaskItem(This,
hWnd);
}
-
- if (TaskItem != NULL)
- {
- DbgPrint("Activate window 0x%p on button %d\n", hWnd, TaskItem->Index);
- }
- else
+
+ if (TaskItem == NULL)
{
DbgPrint("Activate window 0x%p, could not find task\n", hWnd);
}
- TaskSwitchWnd_CheckActivateTaskItem(This,
- TaskItem);
-
- return FALSE;
+ return TaskSwitchWnd_ActivateTaskItem(This,
+ TaskItem);
}
static BOOL
@@ -1634,6 +1643,78 @@ TaskSwitchWnd_EnableGrouping(IN OUT PTASK_SWITCH_WND This,
FALSE);
}
+static VOID
+TaskSwitchWnd_HandleTaskItemClick(IN OUT PTASK_SWITCH_WND This,
+ IN OUT PTASK_ITEM TaskItem)
+{
+ BOOL bIsMinimized;
+ BOOL bIsActive;
+
+ if (IsWindow(TaskItem->hWnd))
+ {
+ bIsMinimized = IsIconic(TaskItem->hWnd);
+ bIsActive = (TaskItem == This->ActiveTaskItem);
+
+ if (!bIsMinimized && bIsActive)
+ {
+ PostMessage(TaskItem->hWnd,
+ WM_SYSCOMMAND,
+ SC_MINIMIZE,
+ 0);
+ }
+ else
+ {
+ if (bIsMinimized)
+ {
+ PostMessage(TaskItem->hWnd,
+ WM_SYSCOMMAND,
+ SC_RESTORE,
+ 0);
+ }
+
+ SetForegroundWindow(TaskItem->hWnd);
+ }
+ }
+}
+
+static VOID
+TaskSwitchWnd_HandleTaskGroupClick(IN OUT PTASK_SWITCH_WND This,
+ IN OUT PTASK_GROUP TaskGroup)
+{
+ /* TODO: Show task group menu */
+}
+
+static BOOL
+TaskSwitchWnd_HandleButtonClick(IN OUT PTASK_SWITCH_WND This,
+ IN WORD wIndex)
+{
+ PTASK_ITEM TaskItem;
+ PTASK_GROUP TaskGroup;
+
+ if (This->IsGroupingEnabled)
+ {
+ TaskGroup = FindTaskGroupByIndex(This,
+ (INT)wIndex);
+ if (TaskGroup != NULL && TaskGroup->IsCollapsed)
+ {
+ TaskSwitchWnd_HandleTaskGroupClick(This,
+ TaskGroup);
+ return TRUE;
+ }
+ }
+
+ TaskItem = FindTaskItemByIndex(This,
+ (INT)wIndex);
+ if (TaskItem != NULL)
+ {
+ TaskSwitchWnd_HandleTaskItemClick(This,
+ TaskItem);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static LRESULT
TaskSwichWnd_HandleItemPaint(IN OUT PTASK_SWITCH_WND This,
IN OUT NMTBCUSTOMDRAW *nmtbcd)
@@ -1860,7 +1941,8 @@ TaskSwitchWndProc(IN HWND hwnd,
{
if (lParam != 0 && (HWND)lParam == This->hWndToolbar)
{
- DbgPrint("WM_COMMAND %u:%u (%u)\n", (UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (UINT)wParam);
+ TaskSwitchWnd_HandleButtonClick(This,
+ LOWORD(wParam));
}
break;
}
diff --git a/reactos/base/shell/explorer-new/trayprop.c b/reactos/base/shell/explorer-new/trayprop.c
index d412bef8dc5..c9d81d5b208 100644
--- a/reactos/base/shell/explorer-new/trayprop.c
+++ b/reactos/base/shell/explorer-new/trayprop.c
@@ -20,10 +20,342 @@
#include
+typedef struct _PROPSHEET_INFO
+{
+ HWND hTaskbarWnd;
+ HWND hStartWnd;
+ HWND hNotiWnd;
+ HWND hToolWnd;
+
+ HBITMAP hTaskbarBitmap;
+} PROPSHEET_INFO, *PPROPSHEET_INFO;
+
+
+static BOOL
+UpdateTaskbarBitmap(PPROPSHEET_INFO pPropInfo)
+{
+ HWND hwndLock, hwndHide, hwndGroup, hwndShowQL;
+ HWND hwndBitmap;
+ BOOL bLock, bHide, bGroup, bShowQL;
+ LPTSTR lpImageName = NULL;
+ BOOL bRet = FALSE;
+
+ hwndLock = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_LOCK);
+ hwndHide = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_HIDE);
+ hwndGroup = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_GROUP);
+ hwndShowQL = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_SHOWQL);
+
+ if (hwndLock && hwndHide && hwndGroup && hwndShowQL)
+ {
+ bLock = (SendMessage(hwndLock, BM_GETCHECK, 0, 0) == BST_CHECKED);
+ bHide = (SendMessage(hwndHide, BM_GETCHECK, 0, 0) == BST_CHECKED);
+ bGroup = (SendMessage(hwndGroup, BM_GETCHECK, 0, 0) == BST_CHECKED);
+ bShowQL = (SendMessage(hwndShowQL, BM_GETCHECK, 0, 0) == BST_CHECKED);
+
+ if (bHide)
+ lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_AUTOHIDE);
+ else if (bLock && bGroup && bShowQL)
+ lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_LOCK_GROUP_QL);
+ else if (bLock && !bGroup && !bShowQL)
+ lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_LOCK_NOGROUP_NOQL);
+ else if (bLock && bGroup && !bShowQL)
+ lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_LOCK_GROUP_NOQL);
+ else if (bLock && !bGroup && bShowQL)
+ lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_LOCK_NOGROUP_QL);
+ else if (!bLock && !bGroup && !bShowQL)
+ lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_NOLOCK_NOGROUP_NOQL);
+ else if (!bLock && bGroup && !bShowQL)
+ lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_NOLOCK_GROUP_NOQL);
+ else if (!bLock && !bGroup && bShowQL)
+ lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_NOLOCK_NOGROUP_QL);
+ else if (!bLock && bGroup && bShowQL)
+ lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_NOLOCK_GROUP_QL);
+
+ if (lpImageName)
+ {
+ if (pPropInfo->hTaskbarBitmap)
+ {
+ DeleteObject(pPropInfo->hTaskbarBitmap);
+ }
+
+ pPropInfo->hTaskbarBitmap = LoadImage(hExplorerInstance,
+ lpImageName,
+ IMAGE_BITMAP,
+ 0,
+ 0,
+ LR_DEFAULTCOLOR);
+ if (pPropInfo->hTaskbarBitmap)
+ {
+ hwndBitmap = GetDlgItem(pPropInfo->hTaskbarWnd,
+ IDC_TASKBARPROP_TASKBARBITMAP);
+ if (hwndBitmap)
+ {
+ SendMessage(hwndBitmap,
+ STM_SETIMAGE,
+ IMAGE_BITMAP,
+ (LPARAM)pPropInfo->hTaskbarBitmap);
+ }
+ }
+ }
+ }
+
+ return bRet;
+}
+
+static VOID
+OnCreateTaskbarPage(HWND hwnd,
+ PPROPSHEET_INFO pPropInfo)
+{
+ SetWindowLongPtr(hwnd,
+ GWLP_USERDATA,
+ (LONG_PTR)pPropInfo);
+
+ pPropInfo->hTaskbarWnd = hwnd;
+
+ // FIXME: check buttons
+
+ UpdateTaskbarBitmap(pPropInfo);
+}
+
+INT_PTR CALLBACK
+TaskbarPageProc(HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ PPROPSHEET_INFO pPropInfo;
+
+ /* Get the window context */
+ pPropInfo = (PPROPSHEET_INFO)GetWindowLongPtrW(hwndDlg,
+ GWLP_USERDATA);
+ if (pPropInfo == NULL && uMsg != WM_INITDIALOG)
+ {
+ goto HandleDefaultMessage;
+ }
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ OnCreateTaskbarPage(hwndDlg, (PPROPSHEET_INFO)lParam);
+ break;
+
+ case WM_COMMAND:
+ switch(LOWORD(wParam))
+ {
+ case IDC_TASKBARPROP_LOCK:
+ case IDC_TASKBARPROP_HIDE:
+ case IDC_TASKBARPROP_GROUP:
+ case IDC_TASKBARPROP_SHOWQL:
+ if (HIWORD(wParam) == BN_CLICKED)
+ {
+ UpdateTaskbarBitmap(pPropInfo);
+
+ /* Enable the 'Apply' button */
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+ }
+ break;
+ }
+ break;
+
+ case WM_NOTIFY:
+ {
+ LPNMHDR pnmh = (LPNMHDR)lParam;
+
+ switch(pnmh->code)
+ {
+ case PSN_SETACTIVE:
+ break;
+
+ case PSN_APPLY:
+ break;
+ }
+
+ break;
+ }
+
+ case WM_DESTROY:
+ if (pPropInfo->hTaskbarBitmap)
+ {
+ DeleteObject(pPropInfo->hTaskbarBitmap);
+ }
+ break;
+
+HandleDefaultMessage:
+ default:
+ return FALSE;
+ }
+
+ return FALSE;
+}
+
+
+INT_PTR CALLBACK
+StartMenuPageProc(HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ break;
+
+ case WM_DESTROY:
+ break;
+
+ case WM_NOTIFY:
+ {
+ LPNMHDR pnmh = (LPNMHDR)lParam;
+
+ switch(pnmh->code)
+ {
+ case PSN_SETACTIVE:
+ break;
+
+ case PSN_APPLY:
+ break;
+ }
+
+ break;
+ }
+ }
+
+ return FALSE;
+}
+
+
+INT_PTR CALLBACK
+NotificationPageProc(HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ break;
+
+ case WM_DESTROY:
+ break;
+
+ case WM_NOTIFY:
+ {
+ LPNMHDR pnmh = (LPNMHDR)lParam;
+
+ switch(pnmh->code)
+ {
+ case PSN_SETACTIVE:
+ break;
+
+ case PSN_APPLY:
+ break;
+ }
+
+ break;
+ }
+ }
+
+ return FALSE;
+}
+
+
+INT_PTR CALLBACK
+ToolbarsPageProc(HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ break;
+
+ case WM_DESTROY:
+ break;
+
+ case WM_NOTIFY:
+ {
+ LPNMHDR pnmh = (LPNMHDR)lParam;
+
+ switch(pnmh->code)
+ {
+ case PSN_SETACTIVE:
+ break;
+
+ case PSN_APPLY:
+ break;
+ }
+
+ break;
+ }
+ }
+
+ return FALSE;
+}
+
+
+static VOID
+InitPropSheetPage(PROPSHEETPAGE *psp,
+ WORD idDlg,
+ DLGPROC DlgProc,
+ LPARAM lParam)
+{
+ ZeroMemory(psp, sizeof(PROPSHEETPAGE));
+ psp->dwSize = sizeof(PROPSHEETPAGE);
+ psp->dwFlags = PSP_DEFAULT;
+ psp->hInstance = hExplorerInstance;
+ psp->pszTemplate = MAKEINTRESOURCE(idDlg);
+ psp->lParam = lParam;
+ psp->pfnDlgProc = DlgProc;
+}
+
+
HWND
DisplayTrayProperties(ITrayWindow *Tray)
{
- DbgPrint("DisplayTrayProperties() not implemented!\n");
- MessageBox(NULL, _T("Not implemented"), NULL, 0);
+ PPROPSHEET_INFO pPropInfo;
+ PROPSHEETHEADER psh;
+ PROPSHEETPAGE psp[4];
+ TCHAR szCaption[256];
+
+ pPropInfo = (PPROPSHEET_INFO)HeapAlloc(hProcessHeap,
+ HEAP_ZERO_MEMORY,
+ sizeof(PROPSHEET_INFO));
+ if (!pPropInfo)
+ {
+ return NULL;
+ }
+
+ if (!LoadString(hExplorerInstance,
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION,
+ szCaption,
+ sizeof(szCaption) / sizeof(szCaption[0])))
+ {
+ return NULL;
+ }
+
+ ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
+ psh.dwSize = sizeof(PROPSHEETHEADER);
+ psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE;
+ psh.hwndParent = NULL;
+ psh.hInstance = hExplorerInstance;
+ psh.hIcon = NULL;
+ psh.pszCaption = szCaption;
+ psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
+ psh.nStartPage = 0;
+ psh.ppsp = psp;
+
+ InitPropSheetPage(&psp[0], IDD_TASKBARPROP_TASKBAR, (DLGPROC)TaskbarPageProc, (LPARAM)pPropInfo);
+ InitPropSheetPage(&psp[1], IDD_TASKBARPROP_STARTMENU, (DLGPROC)StartMenuPageProc, (LPARAM)pPropInfo);
+ InitPropSheetPage(&psp[2], IDD_TASKBARPROP_NOTIFICATION, (DLGPROC)NotificationPageProc, (LPARAM)pPropInfo);
+ InitPropSheetPage(&psp[3], IDD_TASKBARPROP_TOOLBARS, (DLGPROC)ToolbarsPageProc, (LPARAM)pPropInfo);
+
+ PropertySheet(&psh);
+
+ HeapFree(hProcessHeap,
+ 0,
+ pPropInfo);
+
+ // FIXME: return the HWND
return NULL;
}
diff --git a/reactos/base/shell/explorer-new/traywnd.c b/reactos/base/shell/explorer-new/traywnd.c
index 4e8438fa941..7af0c06d2aa 100644
--- a/reactos/base/shell/explorer-new/traywnd.c
+++ b/reactos/base/shell/explorer-new/traywnd.c
@@ -1697,6 +1697,17 @@ OpenCommonStartMenuDirectory(IN HWND hWndOwner,
}
}
+static VOID
+OpenTaskManager(IN HWND hWndOwner)
+{
+ ShellExecute(hWndOwner,
+ TEXT("open"),
+ TEXT("taskmgr.exe"),
+ NULL,
+ NULL,
+ SW_SHOWNORMAL);
+}
+
static BOOL STDMETHODCALLTYPE
ITrayWindowImpl_ExecContextMenuCmd(IN OUT ITrayWindow *iface,
IN UINT uiCmd)
@@ -1728,6 +1739,11 @@ ITrayWindowImpl_ExecContextMenuCmd(IN OUT ITrayWindow *iface,
}
break;
+ case ID_SHELL_CMD_OPEN_TASKMGR:
+ OpenTaskManager(This->hWnd);
+ break;
+
+
default:
DbgPrint("ITrayWindow::ExecContextMenuCmd(%u): Unhandled Command ID!\n", uiCmd);
bHandled = FALSE;
diff --git a/reactos/base/shell/explorer/explorer-jp.rc b/reactos/base/shell/explorer/explorer-jp.rc
index 1358b503fb2..a87722fa19f 100644
--- a/reactos/base/shell/explorer/explorer-jp.rc
+++ b/reactos/base/shell/explorer/explorer-jp.rc
@@ -254,7 +254,7 @@ BEGIN
PUSHBUTTON "LZ(&C)",IDCANCEL,151,153,50,14
END
-IDD_MDI_SDI DIALOGEX 0, 0, 194, 138
+IDD_MDI_SDI DIALOGEX 0, 0, 194, 157
STYLE DS_SHELLFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "GNXv[̃EBhE [h̑I"
@@ -327,10 +327,10 @@ END
STRINGTABLE DISCARDABLE
BEGIN
IDS_TITLE "ReactOS Explorer"
- IDS_START ""
+ IDS_START "X^[g"
IDS_LOGOFF "OIt..."
IDS_SHUTDOWN "Vbg_E..."
- IDS_RESTART "Restart..."
+ IDS_RESTART "ċN..."
IDS_LAUNCH "t@Cw肵Ďs..."
IDS_START_HELP "wv"
IDS_SEARCH_FILES "t@CtH_..."
@@ -381,9 +381,9 @@ BEGIN
IDS_DESKTOPBAR_SETTINGS "fXNgbv̐ݒ"
IDS_DESKTOP "fXNgbv"
IDS_TASKBAR "^XNo["
- IDS_NAMECOLUMN "Name"
- IDS_PATHCOLUMN "Path"
- IDS_MENUCOLUMN "Menu path"
+ IDS_NAMECOLUMN "O"
+ IDS_PATHCOLUMN "pX"
+ IDS_MENUCOLUMN "j[pX"
END
#endif // Japanese resources
diff --git a/reactos/base/shell/explorer/explorer-ro.rc b/reactos/base/shell/explorer/explorer-ro.rc
index 993f0ee460b..c16bba4c475 100644
--- a/reactos/base/shell/explorer/explorer-ro.rc
+++ b/reactos/base/shell/explorer/explorer-ro.rc
@@ -7,10 +7,7 @@
//
// Generated from the TEXTINCLUDE 2 resource.
//
-#include "resource.h"
-#define APSTUDIO_HIDDEN_SYMBOLS
-#include "windows.h"
-#undef APSTUDIO_HIDDEN_SYMBOLS
+#include
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
@@ -20,8 +17,8 @@
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ROM)
#ifdef _WIN32
-LANGUAGE LANG_ROMANIAN, SUBLANG_DEFAULT
-#pragma code_page(1250)
+LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
@@ -31,72 +28,105 @@ LANGUAGE LANG_ROMANIAN, SUBLANG_DEFAULT
IDM_MDIFRAME MENU DISCARDABLE
BEGIN
- POPUP "&Fiier"
+ POPUP "&Fișier"
BEGIN
- MENUITEM "&Execute...", ID_EXECUTE
+ MENUITEM "&Executare...", ID_EXECUTE
MENUITEM SEPARATOR
- MENUITEM "&Ieire", ID_FILE_EXIT
+ MENUITEM "&Ieșire", ID_FILE_EXIT
END
POPUP "&Prezentare"
BEGIN
MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR
MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR
MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR
+ MENUITEM "&Bară laterală", ID_VIEW_SIDE_BAR
MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR
- MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR
MENUITEM SEPARATOR
MENUITEM "&Resetare\tF5", ID_REFRESH
- MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "E&cran întreg\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
MENUITEM "&SDI", ID_VIEW_SDI
END
- POPUP "&Fereastr"
+ POPUP "&Fereastră"
BEGIN
- MENUITEM "&Fereastr Nou", ID_WINDOW_NEW
- MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE
- MENUITEM "Aliniaz &Orizontal", ID_WINDOW_TILE_HORZ
- MENUITEM "Aliniaz &Vertical\tShift+F4", ID_WINDOW_TILE_VERT
- MENUITEM "Aranjeaz automat", ID_WINDOW_AUTOSORT
- MENUITEM "Aranjeaz &Simbolurile", ID_WINDOW_ARRANGE
+ MENUITEM "&Fereastră Nouă", ID_WINDOW_NEW
+ MENUITEM "În cascadă\tShift+F5", ID_WINDOW_CASCADE
+ MENUITEM "Aliniere &orizontală", ID_WINDOW_TILE_HORZ
+ MENUITEM "Aliniere &verticală\tShift+F4", ID_WINDOW_TILE_VERT
+ MENUITEM "Aranjare automată", ID_WINDOW_AUTOSORT
+ MENUITEM "Aranjare &simboluri", ID_WINDOW_ARRANGE
END
- POPUP "&Tools"
+ POPUP "&Unelte"
BEGIN
- MENUITEM "&Options", ID_TOOLS_OPTIONS
+ MENUITEM "&Opțiuni", ID_TOOLS_OPTIONS
END
POPUP "&Ajutor"
BEGIN
- MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "Întrebări frecvente...", ID_EXPLORER_FAQ
MENUITEM "&Despre Explorer...", ID_ABOUT_EXPLORER
- MENUITEM "Despre &OS...", ID_ABOUT_WINDOWS
+ MENUITEM "Despre &SO...", ID_ABOUT_WINDOWS
+ END
+END
+
+IDM_DESKTOPBAR MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Settings...", ID_DESKTOPBAR_SETTINGS
+ MENUITEM "&Task Manager...", ID_TASKMGR
+ MENUITEM SEPARATOR
+ MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_VOLUME MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Open Volume Control", ID_TRAY_VOLUME
+ MENUITEM "Adjust Audio Properties", ID_VOLUME_PROPERTIES
+ END
+END
+
+IDM_NOTIFYAREA MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Show Hidden Icons", ID_SHOW_HIDDEN_ICONS
+ MENUITEM "Show Icon &Button", ID_SHOW_ICON_BUTTON
+ MENUITEM "&Configure Notifications...", ID_CONFIG_NOTIFYAREA
+ MENUITEM "Adjust Date/&Time...", ID_CONFIG_TIME
+ MENUITEM SEPARATOR
+ MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER
END
END
IDM_SDIFRAME MENU DISCARDABLE
BEGIN
- POPUP "&Fiier"
+ POPUP "&Fișier"
BEGIN
- MENUITEM "&Execute...", ID_EXECUTE
+ MENUITEM "&Executare...", ID_EXECUTE
MENUITEM SEPARATOR
- MENUITEM "&Ieire", ID_FILE_EXIT
+ MENUITEM "&Ieșire", ID_FILE_EXIT
END
POPUP "&Prezentare"
BEGIN
MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR
- MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR, GRAYED
- MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR
+ MENUITEM "&Bară laterală", ID_VIEW_SIDE_BAR, GRAYED
+ MENUITEM "&Bară de stare", ID_VIEW_STATUSBAR
MENUITEM SEPARATOR
MENUITEM "&Resetare\tF5", ID_REFRESH
- MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "E&cran întreg\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
MENUITEM "&MDI", ID_VIEW_MDI
END
- POPUP "&Tools"
+ POPUP "&Unelte"
BEGIN
- MENUITEM "&Options", ID_TOOLS_OPTIONS
+ MENUITEM "&Opțiuni", ID_TOOLS_OPTIONS
END
POPUP "&Ajutor"
BEGIN
- MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "Întrebări frecvente...", ID_EXPLORER_FAQ
MENUITEM "&Despre Explorer...", ID_ABOUT_EXPLORER
- MENUITEM "Despre &OS...", ID_ABOUT_WINDOWS
+ MENUITEM "Despre &SO...", ID_ABOUT_WINDOWS
END
END
@@ -108,20 +138,186 @@ END
IDD_EXECUTE DIALOGEX DISCARDABLE 15, 13, 210, 63
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Execute"
+CAPTION "Executare"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10
CONTROL "&Comanda:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,
18,60,10
EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL
- CONTROL "Ca &Simbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,
+ CONTROL "Ca &simbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,
45,71,12
DEFPUSHBUTTON "&OK",1,158,6,47,14
PUSHBUTTON "A&nulare",2,158,23,47,14
PUSHBUTTON "&Ajutor",254,158,43,47,14
END
+IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65
+STYLE DS_SHELLFONT | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Search Program in Startmenu"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "&Filter:",IDC_STATIC,7,9,18,8
+ EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL
+ CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT |
+ LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER |
+ WS_TABSTOP,7,25,186,33
+ PUSHBUTTON "&Check Entries",IDC_CHECK_ENTRIES,143,7,50,14
+END
+
+IDD_DESKBAR_DESKTOP DIALOGEX DISCARDABLE 0, 0, 212, 194
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Desktop Properties"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Please select your preferred icon alignment algorithm:",
+ IDC_STATIC,7,7,166,8
+ CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,25,46,44
+ CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,25,46,44
+ CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,25,46,44
+ CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,25,46,44
+ CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,73,46,44
+ CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,73,46,44
+ CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,73,46,44
+ CONTROL "rig./bot. up",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,73,46,44
+ CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,121,46,44
+ CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,121,46,44
+ CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,121,46,44
+ CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM |
+ WS_TABSTOP,159,121,46,44
+// CONTROL "Display &Version Number",ID_DESKTOP_VERSION,"Button",
+// BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10
+END
+
+IDD_DESKBAR_TASKBAR DIALOGEX DISCARDABLE 0, 0, 210, 194
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Taskbar Properties"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "Show &clock",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,152,52,10
+ CONTROL "&Hide inactive notification icons",
+ ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,174,111,10
+ PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14
+END
+
+IDD_DESKBAR_STARTMENU DIALOGEX DISCARDABLE 0, 0, 210, 194
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Start Menu Properties"
+FONT 8, "MS Shell Dlg"
+BEGIN
+END
+
+IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174
+STYLE DS_SHELLFONT | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Configure Notification Icons"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES |
+ TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31
+ LTEXT "&Tooltip Text:",IDC_LABEL1,7,44,40,8
+ EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL
+ LTEXT "W&indow Title:",IDC_LABEL2,7,63,44,8
+ EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL
+ LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8
+ EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL
+ GROUPBOX "&Display Mode",IDC_LABEL4,7,96,157,28
+ CONTROL "&show",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON |
+ WS_TABSTOP,15,108,33,10
+ CONTROL "&hide",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66,
+ 108,29,10
+ CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button",
+ BS_AUTORADIOBUTTON,112,108,43,10
+ ICON "",IDC_PICTURE,173,101,21,20
+ LTEXT "&Last Change:",IDC_LABEL6,7,132,43,8
+ EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL |
+ ES_READONLY
+ CONTROL "sho&w hidden",ID_SHOW_HIDDEN_ICONS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10
+ DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP
+ PUSHBUTTON "&Cancel",IDCANCEL,151,153,50,14
+END
+
+IDD_MDI_SDI DIALOGEX 0, 0, 194, 157
+STYLE DS_SHELLFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Choose Explorer window mode"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Please select your preferred Explorer user interface:",
+ IDC_STATIC,7,7,160,8
+ CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button",
+ BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10
+ CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button",
+ BS_AUTORADIOBUTTON,7,62,118,10
+ CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13
+ CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13
+ CONTROL "Open Subfolders in s&eparate windows",
+ IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,90,135,10
+ LTEXT "This setting will be used as default for all Explorer windows in the future.",
+ IDC_STATIC,7,111,174,22
+ DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP
+ PUSHBUTTON "&Cancel",IDCANCEL,106,136,50,14
+END
+
+IDD_ABOUT_EXPLORER DIALOGEX DISCARDABLE 0, 0, 199, 106
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "About ReactOS Explorer"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11
+ LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8
+ LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8
+ LTEXT "",IDC_WIN_VERSION,91,58,98,22
+ LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129,
+ 8
+ CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP,
+ 154,90,38,12
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "#include \r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
/////////////////////////////////////////////////////////////////////////////
//
@@ -131,17 +327,17 @@ END
STRINGTABLE DISCARDABLE
BEGIN
IDS_TITLE "ReactOS Explorer"
- IDS_START "ncepe"
- IDS_LOGOFF "nchidere sesiune ..."
- IDS_SHUTDOWN "nchidere computer ..."
+ IDS_START "Începe"
+ IDS_LOGOFF "Închidere sesiune ..."
+ IDS_SHUTDOWN "Închidere computer ..."
IDS_RESTART "Repornire computer..."
IDS_LAUNCH "Lansare program ..."
IDS_START_HELP "Ajutor"
- IDS_SEARCH_FILES "Cutare fiier..."
+ IDS_SEARCH_FILES "Căutare fișier..."
IDS_DOCUMENTS "Documente"
- IDS_FAVORITES "Preferine"
+ IDS_FAVORITES "Preferințe"
IDS_PROGRAMS "Programe"
- IDS_SETTINGS "Setri"
+ IDS_SETTINGS "Setări"
IDS_EXPLORE "Explorare"
IDS_EMPTY "(gol)"
IDS_RECENT "Documente Recente"
@@ -150,41 +346,41 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_STARTMENU "Startmenu"
- IDS_MINIMIZE_ALL "mimimize all windows"
- IDS_DESKTOP_NUM "Desktop %d"
- IDS_VOLUME "Volume"
- IDS_ITEMS_CUR "current items"
- IDS_ITEMS_CONFIGURED "configuration"
- IDS_ITEMS_VISIBLE "visible"
- IDS_ITEMS_HIDDEN "hidden"
- IDS_NOTIFY_SHOW "show"
- IDS_NOTIFY_HIDE "hide"
- IDS_NOTIFY_AUTOHIDE "autohide"
- IDS_SHOW_HIDDEN_ICONS "Show hidden icons"
- IDS_HIDE_ICONS "Hide icons"
- IDS_TERMINATE "nchide sesiunea"
+ IDS_STARTMENU "Meniu Începe"
+ IDS_MINIMIZE_ALL "Minimizare totală"
+ IDS_DESKTOP_NUM "Spațiu de lucru %d"
+ IDS_VOLUME "Volum"
+ IDS_ITEMS_CUR "elemente curent"
+ IDS_ITEMS_CONFIGURED "configurare"
+ IDS_ITEMS_VISIBLE "vizibile"
+ IDS_ITEMS_HIDDEN "ascunse"
+ IDS_NOTIFY_SHOW "afișare"
+ IDS_NOTIFY_HIDE "ascundere"
+ IDS_NOTIFY_AUTOHIDE "autoascundere"
+ IDS_SHOW_HIDDEN_ICONS "Afișare pictograme ascunse"
+ IDS_HIDE_ICONS "Ascundere pictograme"
+ IDS_TERMINATE "Închide sesiunea"
END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_NETWORK "Reea"
+ IDS_NETWORK "Rețea"
IDS_CONNECTIONS "Conexuni"
IDS_DRIVES "Discuri"
- IDS_SEARCH_COMPUTER "Cutare computer..."
- IDS_SETTINGS_MENU "Meniu setri"
+ IDS_SEARCH_COMPUTER "Căutare computer..."
+ IDS_SETTINGS_MENU "Meniu setări"
IDS_CONTROL_PANEL "Panou de control"
IDS_PRINTERS "Imprimante"
- IDS_BROWSE "Rsfoire prin fiiere"
- IDS_SEARCH_PRG "Cutare program..."
- IDS_ALL_USERS "Toi utilizatorii\\"
- IDS_SEARCH "Cutare..."
+ IDS_BROWSE "Răsfoire prin fișiere"
+ IDS_SEARCH_PRG "Căutare program..."
+ IDS_ALL_USERS "Toți utilizatorii\\"
+ IDS_SEARCH "Căutare..."
IDS_ABOUT_EXPLORER "&Despre Explorer..."
IDS_LAUNCH_MANY_PROGRAMS
- "You have selected more than one program.\nAre you sure you want to launch all of them?"
- IDS_DESKTOPBAR_SETTINGS "Setri spaiu de lucru"
- IDS_DESKTOP "Spaiu de lucru"
- IDS_TASKBAR "Bar de activiti"
+ "Ați ales mai mult de un program.\nSigur vreți să le porniți pe toate?"
+ IDS_DESKTOPBAR_SETTINGS "Setări spațiu de lucru"
+ IDS_DESKTOP "Spațiu de lucru"
+ IDS_TASKBAR "Bară de activități"
IDS_NAMECOLUMN "Nume"
IDS_PATHCOLUMN "Cale"
IDS_MENUCOLUMN "Cale meniu"
@@ -194,47 +390,6 @@ END
/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-// Romanian resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
-#ifdef _WIN32
-LANGUAGE LANG_ROMANIAN, SUBLANG_DEFAULT
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE DISCARDABLE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE DISCARDABLE
-BEGIN
- "#include ""resource.h""\r\n"
- "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
- "#include ""windows.h""\r\n"
- "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE DISCARDABLE
-BEGIN
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-#endif // Romanian resources
-/////////////////////////////////////////////////////////////////////////////
-
-
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
@@ -245,6 +400,3 @@ END
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
-
-
-
diff --git a/reactos/base/shell/explorer/utility/xmlstorage.cpp b/reactos/base/shell/explorer/utility/xmlstorage.cpp
index 1e7f28b1d45..0be330e114c 100644
--- a/reactos/base/shell/explorer/utility/xmlstorage.cpp
+++ b/reactos/base/shell/explorer/utility/xmlstorage.cpp
@@ -305,13 +305,14 @@ int XMLNode::count(XPath::const_iterator from, const XPath::const_iterator& to)
int n = 0;
for(XMLNode::Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
- if (elem.matches(**it, n))
+ if (elem.matches(**it, n)) {
if (from != to)
// iterate deeper
cnt += (*it)->count(from, to);
else
// increment match counter
++cnt;
+ }
return cnt;
}
@@ -863,7 +864,7 @@ void XMLReaderBase::StartElementHandler(const XS_String& name, const XMLNode::At
if (!isspace((unsigned char)p[-1]))
break;
- if (p != s)
+ if (p != s) {
if (_pos->_children.empty()) { // no children in last node?
if (_last_tag == TAG_START)
_pos->_content.append(s, p-s);
@@ -873,6 +874,7 @@ void XMLReaderBase::StartElementHandler(const XS_String& name, const XMLNode::At
p = s;
} else
_pos->_children.back()->_trailing.append(s, p-s);
+ }
std::string leading;
@@ -914,13 +916,14 @@ void XMLReaderBase::EndElementHandler()
_pos->_cdata_content = false;
}
- if (p != s)
+ if (p != s) {
if (_pos->_children.empty()) // no children in current node?
_pos->_content.append(s, p-s);
else if (_last_tag == TAG_START)
_pos->_content.append(s, p-s);
else
_pos->_children.back()->_trailing.append(s, p-s);
+ }
if (p != e)
_pos->_end_leading.assign(p, e-p);
@@ -989,9 +992,10 @@ void XMLWriter::write_pre(StackEntry& entry)
if (_format._pretty >= PRETTY_LINEFEED)
_out << _format._endl;
- if (_format._pretty == PRETTY_INDENT)
+ if (_format._pretty == PRETTY_INDENT) {
for(size_t i=_stack.size(); --i>0; )
_out << XML_INDENT_SPACE;
+ }
_out << '<' << EncodeXMLString(entry._node_name);
//entry._state = PRE;
@@ -1020,9 +1024,10 @@ void XMLWriter::write_post(StackEntry& entry)
if (_format._pretty>=PRETTY_LINEFEED && entry._content.empty())
_out << _format._endl;
- if (_format._pretty==PRETTY_INDENT && entry._content.empty())
+ if (_format._pretty==PRETTY_INDENT && entry._content.empty()) {
for(size_t i=_stack.size(); --i>0; )
_out << XML_INDENT_SPACE;
+ }
_out << "" << EncodeXMLString(entry._node_name) << ">";
} else {
diff --git a/reactos/base/system/msiexec/msiexec.ico b/reactos/base/system/msiexec/msiexec.ico
index 65b3b05dd5d..530f089eeb6 100644
Binary files a/reactos/base/system/msiexec/msiexec.ico and b/reactos/base/system/msiexec/msiexec.ico differ
diff --git a/reactos/base/system/smss/smapi.c b/reactos/base/system/smss/smapi.c
index df9e0c777bb..37abfc5c38b 100644
--- a/reactos/base/system/smss/smapi.c
+++ b/reactos/base/system/smss/smapi.c
@@ -20,9 +20,9 @@ static HANDLE SmApiPort = INVALID_HANDLE_VALUE;
SMAPI(SmInvalid)
{
- DPRINT("SM: %s called\n",__FUNCTION__);
- Request->SmHeader.Status = STATUS_NOT_IMPLEMENTED;
- return STATUS_SUCCESS;
+ DPRINT("SM: %s called\n",__FUNCTION__);
+ Request->SmHeader.Status = STATUS_NOT_IMPLEMENTED;
+ return STATUS_SUCCESS;
}
/* SM API Table */
@@ -30,20 +30,20 @@ typedef NTSTATUS (FASTCALL * SM_PORT_API)(PSM_PORT_MESSAGE);
SM_PORT_API SmApi [] =
{
- SmInvalid, /* unused */
- SmCompSes, /* smapicomp.c */
- SmInvalid, /* obsolete */
- SmInvalid, /* unknown */
- SmExecPgm, /* smapiexec.c */
- SmQryInfo /* smapyqry.c */
+ SmInvalid, /* unused */
+ SmCompSes, /* smapicomp.c */
+ SmInvalid, /* obsolete */
+ SmInvalid, /* unknown */
+ SmExecPgm, /* smapiexec.c */
+ SmQryInfo /* smapyqry.c */
};
/* TODO: optimize this address computation (it should be done
* with a macro) */
PSM_CONNECT_DATA FASTCALL SmpGetConnectData (PSM_PORT_MESSAGE Request)
{
- PPORT_MESSAGE PortMessage = (PPORT_MESSAGE) Request;
- return (PSM_CONNECT_DATA)(PortMessage + 1);
+ PPORT_MESSAGE PortMessage = (PPORT_MESSAGE) Request;
+ return (PSM_CONNECT_DATA)(PortMessage + 1);
}
NTSTATUS NTAPI
@@ -60,46 +60,46 @@ SmpHandleConnectionRequest (PSM_PORT_MESSAGE Request);
*/
static NTSTATUS
SmpCallbackServer (PSM_PORT_MESSAGE Request,
- PSM_CLIENT_DATA ClientData)
+ PSM_CLIENT_DATA ClientData)
{
- NTSTATUS Status = STATUS_SUCCESS;
- PSM_CONNECT_DATA ConnectData = SmpGetConnectData (Request);
- UNICODE_STRING CallbackPortName;
- ULONG CallbackPortNameLength = SM_SB_NAME_MAX_LENGTH; /* TODO: compute length */
- SB_CONNECT_DATA SbConnectData;
- ULONG SbConnectDataLength = sizeof SbConnectData;
- SECURITY_QUALITY_OF_SERVICE SecurityQos;
+ NTSTATUS Status = STATUS_SUCCESS;
+ PSM_CONNECT_DATA ConnectData = SmpGetConnectData (Request);
+ UNICODE_STRING CallbackPortName;
+ ULONG CallbackPortNameLength = SM_SB_NAME_MAX_LENGTH; /* TODO: compute length */
+ SB_CONNECT_DATA SbConnectData;
+ ULONG SbConnectDataLength = sizeof SbConnectData;
+ SECURITY_QUALITY_OF_SERVICE SecurityQos;
- DPRINT("SM: %s called\n", __FUNCTION__);
+ DPRINT("SM: %s called\n", __FUNCTION__);
- if ( ((USHORT)-1 == ConnectData->SubSystemId) ||
- (IMAGE_SUBSYSTEM_NATIVE == ConnectData->SubSystemId))
- {
- DPRINT("SM: %s: we do not need calling back SM!\n",
- __FUNCTION__);
- return STATUS_SUCCESS;
- }
- RtlCopyMemory (ClientData->SbApiPortName,
- ConnectData->SbName,
- CallbackPortNameLength);
- RtlInitUnicodeString (& CallbackPortName,
- ClientData->SbApiPortName);
+ if ( ((USHORT)-1 == ConnectData->SubSystemId) ||
+ (IMAGE_SUBSYSTEM_NATIVE == ConnectData->SubSystemId))
+ {
+ DPRINT("SM: %s: we do not need calling back SM!\n",
+ __FUNCTION__);
+ return STATUS_SUCCESS;
+ }
+ RtlCopyMemory (ClientData->SbApiPortName,
+ ConnectData->SbName,
+ CallbackPortNameLength);
+ RtlInitUnicodeString (& CallbackPortName,
+ ClientData->SbApiPortName);
SecurityQos.Length = sizeof (SecurityQos);
SecurityQos.ImpersonationLevel = SecurityIdentification;
SecurityQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
SecurityQos.EffectiveOnly = TRUE;
- SbConnectData.SmApiMax = (sizeof SmApi / sizeof SmApi[0]);
- Status = NtConnectPort (& ClientData->SbApiPort,
- & CallbackPortName,
- &SecurityQos,
- NULL,
- NULL,
- NULL,
- & SbConnectData,
- & SbConnectDataLength);
- return Status;
+ SbConnectData.SmApiMax = (sizeof SmApi / sizeof SmApi[0]);
+ Status = NtConnectPort (& ClientData->SbApiPort,
+ & CallbackPortName,
+ &SecurityQos,
+ NULL,
+ NULL,
+ NULL,
+ & SbConnectData,
+ & SbConnectDataLength);
+ return Status;
}
/**********************************************************************
@@ -112,62 +112,62 @@ SmpCallbackServer (PSM_PORT_MESSAGE Request,
VOID NTAPI
SmpApiConnectedThread(PVOID pConnectedPort)
{
- NTSTATUS Status = STATUS_SUCCESS;
- PPORT_MESSAGE Reply = NULL;
- SM_PORT_MESSAGE Request;
- HANDLE ConnectedPort = * (PHANDLE) pConnectedPort;
+ NTSTATUS Status = STATUS_SUCCESS;
+ PPORT_MESSAGE Reply = NULL;
+ SM_PORT_MESSAGE Request;
+ HANDLE ConnectedPort = * (PHANDLE) pConnectedPort;
- DPRINT("SM: %s called\n", __FUNCTION__);
- RtlZeroMemory(&Request, sizeof(SM_PORT_MESSAGE));
+ DPRINT("SM: %s called\n", __FUNCTION__);
+ RtlZeroMemory(&Request, sizeof(SM_PORT_MESSAGE));
- while (TRUE)
- {
- DPRINT("SM: %s: waiting for message\n",__FUNCTION__);
+ while (TRUE)
+ {
+ DPRINT("SM: %s: waiting for message\n",__FUNCTION__);
- Status = NtReplyWaitReceivePort(ConnectedPort,
- NULL,
- Reply,
- (PPORT_MESSAGE) & Request);
- if (NT_SUCCESS(Status))
- {
- DPRINT("SM: %s: message received (type=%d)\n",
- __FUNCTION__,
- Request.Header.u2.s2.Type);
+ Status = NtReplyWaitReceivePort(ConnectedPort,
+ NULL,
+ Reply,
+ (PPORT_MESSAGE) & Request);
+ if (NT_SUCCESS(Status))
+ {
+ DPRINT("SM: %s: message received (type=%d)\n",
+ __FUNCTION__,
+ Request.Header.u2.s2.Type);
- switch (Request.Header.u2.s2.Type)
- {
- case LPC_CONNECTION_REQUEST:
- SmpHandleConnectionRequest (&Request);
- Reply = NULL;
- break;
- case LPC_DEBUG_EVENT:
+ switch (Request.Header.u2.s2.Type)
+ {
+ case LPC_CONNECTION_REQUEST:
+ SmpHandleConnectionRequest (&Request);
+ Reply = NULL;
+ break;
+ case LPC_DEBUG_EVENT:
// DbgSsHandleKmApiMsg (&Request, 0);
- Reply = NULL;
- break;
- case LPC_PORT_CLOSED:
- Reply = NULL;
- continue;
- default:
- if ((Request.SmHeader.ApiIndex) &&
- (Request.SmHeader.ApiIndex < (sizeof SmApi / sizeof SmApi[0])))
- {
- Status = SmApi[Request.SmHeader.ApiIndex](&Request);
- Reply = (PPORT_MESSAGE) & Request;
- } else {
- Request.SmHeader.Status = STATUS_NOT_IMPLEMENTED;
- Reply = (PPORT_MESSAGE) & Request;
- }
- }
- } else {
- /* LPC failed */
- DPRINT1("SM: %s: NtReplyWaitReceivePort() failed (Status=0x%08lx)\n",
- __FUNCTION__, Status);
- break;
- }
- }
- NtClose (ConnectedPort);
- DPRINT("SM: %s done\n", __FUNCTION__);
- NtTerminateThread (NtCurrentThread(), Status);
+ Reply = NULL;
+ break;
+ case LPC_PORT_CLOSED:
+ Reply = NULL;
+ continue;
+ default:
+ if ((Request.SmHeader.ApiIndex) &&
+ (Request.SmHeader.ApiIndex < (sizeof SmApi / sizeof SmApi[0])))
+ {
+ Status = SmApi[Request.SmHeader.ApiIndex](&Request);
+ Reply = (PPORT_MESSAGE) & Request;
+ } else {
+ Request.SmHeader.Status = STATUS_NOT_IMPLEMENTED;
+ Reply = (PPORT_MESSAGE) & Request;
+ }
+ }
+ } else {
+ /* LPC failed */
+ DPRINT1("SM: %s: NtReplyWaitReceivePort() failed (Status=0x%08lx)\n",
+ __FUNCTION__, Status);
+ break;
+ }
+ }
+ NtClose (ConnectedPort);
+ DPRINT("SM: %s done\n", __FUNCTION__);
+ NtTerminateThread (NtCurrentThread(), Status);
}
/**********************************************************************
@@ -183,151 +183,108 @@ SmpApiConnectedThread(PVOID pConnectedPort)
NTSTATUS NTAPI
SmpHandleConnectionRequest (PSM_PORT_MESSAGE Request)
{
- PSM_CONNECT_DATA ConnectData = SmpGetConnectData (Request);
- NTSTATUS Status = STATUS_SUCCESS;
- BOOL Accept = FALSE;
- PSM_CLIENT_DATA ClientData = NULL;
- HANDLE hClientDataApiPort = (HANDLE) 0;
- PHANDLE ClientDataApiPort = & hClientDataApiPort;
- HANDLE hClientDataApiPortThread = (HANDLE) 0;
- PHANDLE ClientDataApiPortThread = & hClientDataApiPortThread;
- PVOID Context = NULL;
+ PSM_CONNECT_DATA ConnectData = SmpGetConnectData (Request);
+ NTSTATUS Status = STATUS_SUCCESS;
+ BOOL Accept = FALSE;
+ PSM_CLIENT_DATA ClientData = NULL;
+ HANDLE hClientDataApiPort = (HANDLE) 0;
+ PHANDLE ClientDataApiPort = & hClientDataApiPort;
+ HANDLE hClientDataApiPortThread = (HANDLE) 0;
+ PHANDLE ClientDataApiPortThread = & hClientDataApiPortThread;
+ PVOID Context = NULL;
- DPRINT("SM: %s called:\n SubSystemID=%d\n SbName=\"%S\"\n",
- __FUNCTION__, ConnectData->SubSystemId, ConnectData->SbName);
+ DPRINT("SM: %s called:\n SubSystemID=%d\n SbName=\"%S\"\n",
+ __FUNCTION__, ConnectData->SubSystemId, ConnectData->SbName);
- if(sizeof (SM_CONNECT_DATA) == Request->Header.u1.s1.DataLength)
- {
- if(IMAGE_SUBSYSTEM_UNKNOWN == ConnectData->SubSystemId)
- {
- /*
- * This is not a call to register an image set,
- * but a simple connection request from a process
- * that will use the SM API.
- */
- DPRINT("SM: %s: simple request\n", __FUNCTION__);
- ClientDataApiPort = & hClientDataApiPort;
- ClientDataApiPortThread = & hClientDataApiPortThread;
- Accept = TRUE;
- } else {
- DPRINT("SM: %s: request to register an image set\n", __FUNCTION__);
- /*
- * Reject GUIs classes: only odd subsystem IDs are
- * allowed to register here (tty mode images).
- */
- if(1 == (ConnectData->SubSystemId % 2))
- {
- DPRINT("SM: %s: id = %d\n", __FUNCTION__, ConnectData->SubSystemId);
- /*
- * SmBeginClientInitialization/2 will succeed only if there
- * is a candidate client ready.
- */
- Status = SmBeginClientInitialization (Request, & ClientData);
- if(STATUS_SUCCESS == Status)
- {
- DPRINT("SM: %s: ClientData = %p\n",
- __FUNCTION__, ClientData);
- /*
- * OK: the client is an environment subsystem
- * willing to manage a free image type.
- */
- ClientDataApiPort = & ClientData->ApiPort;
- ClientDataApiPortThread = & ClientData->ApiPortThread;
- /*
- * Call back the candidate environment subsystem
- * server (use the port name sent in in the
- * connection request message).
- */
- Status = SmpCallbackServer (Request, ClientData);
- if(NT_SUCCESS(Status))
- {
- DPRINT("SM: %s: SmpCallbackServer OK\n",
- __FUNCTION__);
- Accept = TRUE;
- } else {
- DPRINT("SM: %s: SmpCallbackServer failed (Status=%08lx)\n",
- __FUNCTION__, Status);
- Status = SmDestroyClient (ConnectData->SubSystemId);
- }
- }
- }
- }
- }
- DPRINT("SM: %s: before NtAcceptConnectPort\n", __FUNCTION__);
+ if(sizeof (SM_CONNECT_DATA) == Request->Header.u1.s1.DataLength)
+ {
+ if(IMAGE_SUBSYSTEM_UNKNOWN == ConnectData->SubSystemId)
+ {
+ /*
+ * This is not a call to register an image set,
+ * but a simple connection request from a process
+ * that will use the SM API.
+ */
+ DPRINT("SM: %s: simple request\n", __FUNCTION__);
+ ClientDataApiPort = & hClientDataApiPort;
+ ClientDataApiPortThread = & hClientDataApiPortThread;
+ Accept = TRUE;
+ } else {
+ DPRINT("SM: %s: request to register an image set\n", __FUNCTION__);
+ /*
+ * Reject GUIs classes: only odd subsystem IDs are
+ * allowed to register here (tty mode images).
+ */
+ if(1 == (ConnectData->SubSystemId % 2))
+ {
+ DPRINT("SM: %s: id = %d\n", __FUNCTION__, ConnectData->SubSystemId);
+ /*
+ * SmBeginClientInitialization/2 will succeed only if there
+ * is a candidate client ready.
+ */
+ Status = SmBeginClientInitialization (Request, & ClientData);
+ if(STATUS_SUCCESS == Status)
+ {
+ DPRINT("SM: %s: ClientData = %p\n",
+ __FUNCTION__, ClientData);
+ /*
+ * OK: the client is an environment subsystem
+ * willing to manage a free image type.
+ */
+ ClientDataApiPort = & ClientData->ApiPort;
+ ClientDataApiPortThread = & ClientData->ApiPortThread;
+ /*
+ * Call back the candidate environment subsystem
+ * server (use the port name sent in in the
+ * connection request message).
+ */
+ Status = SmpCallbackServer (Request, ClientData);
+ if(NT_SUCCESS(Status))
+ {
+ DPRINT("SM: %s: SmpCallbackServer OK\n",
+ __FUNCTION__);
+ Accept = TRUE;
+ } else {
+ DPRINT("SM: %s: SmpCallbackServer failed (Status=%08lx)\n",
+ __FUNCTION__, Status);
+ Status = SmDestroyClient (ConnectData->SubSystemId);
+ }
+ }
+ }
+ }
+ }
+ DPRINT("SM: %s: before NtAcceptConnectPort\n", __FUNCTION__);
- Status = NtAcceptConnectPort (ClientDataApiPort,
- Context,
- (PPORT_MESSAGE) Request,
- Accept,
- NULL,
- NULL);
+ Status = NtAcceptConnectPort (ClientDataApiPort,
+ Context,
+ (PPORT_MESSAGE) Request,
+ Accept,
+ NULL,
+ NULL);
- if(Accept)
- {
- if(!NT_SUCCESS(Status))
- {
- DPRINT1("SM: %s: NtAcceptConnectPort() failed (Status=0x%08lx)\n",
- __FUNCTION__, Status);
- return Status;
- } else {
- DPRINT("SM: %s: completing connection request\n", __FUNCTION__);
- Status = NtCompleteConnectPort (*ClientDataApiPort);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("SM: %s: NtCompleteConnectPort() failed (Status=0x%08lx)\n",
- __FUNCTION__, Status);
- return Status;
- }
- }
- Status = STATUS_SUCCESS;
- }
- DPRINT("SM: %s done\n", __FUNCTION__);
- return Status;
+ if(Accept)
+ {
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: %s: NtAcceptConnectPort() failed (Status=0x%08lx)\n",
+ __FUNCTION__, Status);
+ return Status;
+ } else {
+ DPRINT("SM: %s: completing connection request\n", __FUNCTION__);
+ Status = NtCompleteConnectPort (*ClientDataApiPort);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: %s: NtCompleteConnectPort() failed (Status=0x%08lx)\n",
+ __FUNCTION__, Status);
+ return Status;
+ }
+ }
+ Status = STATUS_SUCCESS;
+ }
+ DPRINT("SM: %s done\n", __FUNCTION__);
+ return Status;
}
-/**********************************************************************
- * NAME
- * SmpApiThread/1
- *
- * DECRIPTION
- * Due to differences in LPC implementation between NT and ROS,
- * we need a thread to listen to for connection request that
- * creates a new thread for each connected port. This is not
- * necessary in NT LPC, because server side connected ports are
- * never used to receive requests.
- */
-#if 0
-VOID NTAPI
-SmpApiThread (HANDLE ListeningPort)
-{
- NTSTATUS Status = STATUS_SUCCESS;
- SM_PORT_MESSAGE Request;
-
- DPRINT("SM: %s called\n", __FUNCTION__);
- RtlZeroMemory(&Request, sizeof(PORT_MESSAGE));
-
- while (TRUE)
- {
- Status = NtListenPort (ListeningPort, & Request.Header);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("SM: %s: NtListenPort() failed! (Status==x%08lx)\n", __FUNCTION__, Status);
- break;
- }
- Status = SmpHandleConnectionRequest (& Request);
- if(!NT_SUCCESS(Status))
- {
- DPRINT1("SM: %s: SmpHandleConnectionRequest failed (Status=0x%08lx)\n",
- __FUNCTION__, Status);
- break;
- }
- }
- /* Cleanup */
- NtClose(ListeningPort);
- /* DIE */
- NtTerminateThread(NtCurrentThread(), Status);
-}
-#endif
/* LPC PORT INITIALIZATION **************************************************/
@@ -346,41 +303,42 @@ SmCreateApiPort(VOID)
NTSTATUS Status = STATUS_SUCCESS;
InitializeObjectAttributes(&ObjectAttributes,
- &UnicodeString,
- 0,
- NULL,
- NULL);
+ &UnicodeString,
+ 0,
+ NULL,
+ NULL);
Status = NtCreatePort(&SmApiPort,
- &ObjectAttributes,
- sizeof(SM_CONNECT_DATA),
- sizeof(SM_PORT_MESSAGE),
- 0);
+ &ObjectAttributes,
+ sizeof(SM_CONNECT_DATA),
+ sizeof(SM_PORT_MESSAGE),
+ 0);
if (!NT_SUCCESS(Status))
{
return(Status);
}
+
/*
* Create one thread for the named LPC
* port \SmApiPort
*/
RtlCreateUserThread(NtCurrentProcess(),
- NULL,
- FALSE,
- 0,
- 0,
- 0,
- (PTHREAD_START_ROUTINE)SmpApiConnectedThread,
- &SmApiPort,
- NULL,
- NULL);
+ NULL,
+ FALSE,
+ 0,
+ 0,
+ 0,
+ (PTHREAD_START_ROUTINE)SmpApiConnectedThread,
+ &SmApiPort,
+ NULL,
+ NULL);
- //
- // On NT LPC, we need a second thread to handle incoming connections
- // generated by incoming requests, otherwise the thread handling
- // the request will be busy sending the LPC message, without any other
- // thread being busy to receive the LPC message.
- //
+ /*
+ * On NT LPC, we need a second thread to handle incoming connections
+ * generated by incoming requests, otherwise the thread handling
+ * the request will be busy sending the LPC message, without any other
+ * thread being busy to receive the LPC message.
+ */
Status = RtlCreateUserThread(NtCurrentProcess(),
NULL,
FALSE,
diff --git a/reactos/base/system/userinit/userinit.c b/reactos/base/system/userinit/userinit.c
index e9b3e6480c8..f1bc33933e6 100644
--- a/reactos/base/system/userinit/userinit.c
+++ b/reactos/base/system/userinit/userinit.c
@@ -401,99 +401,10 @@ VOID SetUserSysColors(VOID)
RegCloseKey(hKey);
}
-static
-VOID LoadUserFontSetting(
- IN LPWSTR lpValueName,
- OUT PLOGFONTW pFont)
-{
- HKEY hKey;
- LOGFONTW lfTemp;
- DWORD Type, Size;
- LONG rc;
+DWORD
+WINAPI
+UpdatePerUserSystemParameters(DWORD dw1, BOOL bEnable);
- TRACE("(%s, %p)\n", debugstr_w(lpValueName), pFont);
-
- Size = sizeof(LOGFONTW);
- rc = RegOpenKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_METRICS,
- 0, KEY_QUERY_VALUE, &hKey);
- if (rc != ERROR_SUCCESS)
- {
- WARN("RegOpenKeyEx() failed with error %lu\n", rc);
- return;
- }
- rc = RegQueryValueEx(hKey, lpValueName, NULL, &Type, (LPBYTE)&lfTemp, &Size);
- if (rc != ERROR_SUCCESS || Type != REG_BINARY)
- {
- WARN("RegQueryValueEx() failed with error %lu\n", rc);
- return;
- }
- RegCloseKey(hKey);
- /* FIXME: Check if lfTemp is a valid font */
- *pFont = lfTemp;
-}
-
-static
-VOID LoadUserMetricSetting(
- IN LPWSTR lpValueName,
- OUT INT *pValue)
-{
- HKEY hKey;
- DWORD Type, Size;
- WCHAR strValue[8];
- LONG rc;
-
- TRACE("(%s, %p)\n", debugstr_w(lpValueName), pValue);
-
- Size = sizeof(strValue);
- rc = RegOpenKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_METRICS,
- 0, KEY_QUERY_VALUE, &hKey);
- if (rc != ERROR_SUCCESS)
- {
- WARN("RegOpenKeyEx() failed with error %lu\n", rc);
- return;
- }
- rc = RegQueryValueEx(hKey, lpValueName, NULL, &Type, (LPBYTE)&strValue, &Size);
- if (rc != ERROR_SUCCESS || Type != REG_SZ)
- {
- WARN("RegQueryValueEx() failed with error %lu\n", rc);
- return;
- }
- RegCloseKey(hKey);
- *pValue = StrToInt(strValue);
-}
-
-static
-VOID SetUserMetrics(VOID)
-{
- NONCLIENTMETRICSW ncmetrics;
- MINIMIZEDMETRICS mmmetrics;
-
- TRACE("()\n");
-
- ncmetrics.cbSize = sizeof(NONCLIENTMETRICSW);
- mmmetrics.cbSize = sizeof(MINIMIZEDMETRICS);
- SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &ncmetrics, 0);
- SystemParametersInfoW(SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &mmmetrics, 0);
-
- LoadUserFontSetting(L"CaptionFont", &ncmetrics.lfCaptionFont);
- LoadUserFontSetting(L"SmCaptionFont", &ncmetrics.lfSmCaptionFont);
- LoadUserFontSetting(L"MenuFont", &ncmetrics.lfMenuFont);
- LoadUserFontSetting(L"StatusFont", &ncmetrics.lfStatusFont);
- LoadUserFontSetting(L"MessageFont", &ncmetrics.lfMessageFont);
- /* FIXME: load icon font ? */
-
- LoadUserMetricSetting(L"BorderWidth", &ncmetrics.iBorderWidth);
- LoadUserMetricSetting(L"ScrollWidth", &ncmetrics.iScrollWidth);
- LoadUserMetricSetting(L"ScrollHeight", &ncmetrics.iScrollHeight);
- LoadUserMetricSetting(L"CaptionWidth", &ncmetrics.iCaptionWidth);
- LoadUserMetricSetting(L"CaptionHeight", &ncmetrics.iCaptionHeight);
- LoadUserMetricSetting(L"SmCaptionWidth", &ncmetrics.iSmCaptionWidth);
- LoadUserMetricSetting(L"SmCaptionHeight", &ncmetrics.iSmCaptionHeight);
- LoadUserMetricSetting(L"Menuwidth", &ncmetrics.iMenuWidth);
- LoadUserMetricSetting(L"MenuHeight", &ncmetrics.iMenuHeight);
-
- SystemParametersInfoW(SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &ncmetrics, 0);
-}
static
VOID SetUserWallpaper(VOID)
@@ -536,115 +447,14 @@ VOID SetUserWallpaper(VOID)
WARN("RegOpenKeyEx() failed with error %lu\n", rc);
}
-static VOID SetUserPreference(UINT uiAction,BOOL bValue,UINT fWinIni)
-{
- DWORD dwvalue = bValue;
- SystemParametersInfo(uiAction, 0, (PVOID)&dwvalue, fWinIni);
-}
-
-static VOID SetUserPreferences(VOID)
-{
- HKEY hKey;
- DWORD Type, Size;
- LONG rc;
- USERPREFERENCESMASK Preferences;
-
- TRACE("()\n");
-
- rc = RegOpenKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_DESKTOP,
- 0, KEY_QUERY_VALUE, &hKey);
- if (rc == ERROR_SUCCESS)
- {
- Size = sizeof(USERPREFERENCESMASK);
- ERR("USERPREFERENCESMASK size: %d\n",Size);
-
- rc = RegQueryValueEx(hKey,
- L"UserPreferencesMask",
- NULL,
- &Type,
- (LPBYTE)&Preferences,
- &Size);
- if (rc == ERROR_SUCCESS && Type == REG_BINARY)
- {
- SetUserPreference(SPI_SETUIEFFECTS, Preferences.bUiEffects, SPIF_SENDCHANGE);
- SetUserPreference(SPI_SETACTIVEWINDOWTRACKING, Preferences.bActiveWindowTracking, SPIF_SENDCHANGE);
- SetUserPreference(SPI_SETMENUANIMATION, Preferences.bMenuAnimation, SPIF_SENDCHANGE);
- SetUserPreference(SPI_SETCOMBOBOXANIMATION, Preferences.bComboBoxAnimation, SPIF_SENDCHANGE);
- SetUserPreference(SPI_SETLISTBOXSMOOTHSCROLLING, Preferences.bListBoxSmoothScrolling, SPIF_SENDCHANGE);
- SetUserPreference(SPI_SETGRADIENTCAPTIONS, Preferences.bGradientCaptions, SPIF_SENDCHANGE);
- SetUserPreference(SPI_SETKEYBOARDCUES, Preferences.bKeyboardCues, SPIF_SENDCHANGE);
- SetUserPreference(SPI_SETACTIVEWNDTRKZORDER, Preferences.bActiveWndTrkZorder, SPIF_SENDCHANGE);
- SetUserPreference(SPI_SETHOTTRACKING, Preferences.bHotTracking, SPIF_SENDCHANGE);
- SetUserPreference(SPI_SETMENUFADE, Preferences.bMenuFade, SPIF_SENDCHANGE);
- SetUserPreference(SPI_SETSELECTIONFADE, Preferences.bSelectionFade, SPIF_SENDCHANGE);
- SetUserPreference(SPI_SETTOOLTIPANIMATION, Preferences.bTooltipAnimation, SPIF_SENDCHANGE);
- SetUserPreference(SPI_SETTOOLTIPFADE, Preferences.bTooltipFade, SPIF_SENDCHANGE);
- SetUserPreference(SPI_SETCURSORSHADOW, Preferences.bCursorShadow, SPIF_SENDCHANGE);
- }
- else
- {
- ERR("No User Preferences set in registry or incorrect type (error %lu)\n", rc);
- }
- RegCloseKey(hKey);
- }
- else
- WARN("RegOpenKeyEx() failed with error %lu\n", rc);
-}
-
-static VOID
-PlayLogonSound()
-{
- HKEY hKey;
- WCHAR szBuffer[MAX_PATH] = {0};
- WCHAR szDest[MAX_PATH];
- DWORD dwSize = sizeof(szBuffer);
- HMODULE hLibrary;
- typedef BOOL WINAPI (*PLAYSOUNDW)(LPCWSTR,HMODULE,DWORD);
- PLAYSOUNDW Play;
-
- if (RegOpenKeyExW(HKEY_CURRENT_USER, L"AppEvents\\Schemes\\Apps\\.Default\\WindowsLogon\\.Current", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
- {
- return;
- }
-
- if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)szBuffer, &dwSize) != ERROR_SUCCESS)
- {
- RegCloseKey(hKey);
- return;
- }
-
-
- RegCloseKey(hKey);
-
- if (!szBuffer[0])
- return;
-
-
- szBuffer[MAX_PATH-1] = L'\0';
- if (ExpandEnvironmentStringsW(szBuffer, szDest, MAX_PATH))
- {
- hLibrary = LoadLibraryW(L"winmm.dll");
- if (hLibrary)
- {
- Play = (PLAYSOUNDW)GetProcAddress(hLibrary, "PlaySoundW");
- if (Play)
- {
- Play(szDest, NULL, SND_FILENAME);
- }
- FreeLibrary(hLibrary);
- }
- }
-}
-
static
VOID SetUserSettings(VOID)
{
TRACE("()\n");
+ UpdatePerUserSystemParameters(1, TRUE);
SetUserSysColors();
- SetUserMetrics();
SetUserWallpaper();
- SetUserPreferences();
}
typedef DWORD (WINAPI *PCMP_REPORT_LOGON)(DWORD, DWORD);
@@ -685,7 +495,6 @@ wWinMain(IN HINSTANCE hInst,
SetUserSettings();
StartShell();
NotifyLogon();
- PlayLogonSound();
return 0;
}
diff --git a/reactos/base/system/winlogon/lang/ro-RO.rc b/reactos/base/system/winlogon/lang/ro-RO.rc
index ccf72106cf5..5e754d609f7 100644
--- a/reactos/base/system/winlogon/lang/ro-RO.rc
+++ b/reactos/base/system/winlogon/lang/ro-RO.rc
@@ -1,41 +1,43 @@
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
IDD_SHUTDOWNCOMPUTER DIALOGEX 45, 22, 164, 52
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Oprire computer"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Acum putei nchide computerul n siguran.", IDC_SHUTDOWNCOMPUTER, 31, 13, 132, 8
+ LTEXT "Acum puteți închide computerul în siguranță.", IDC_SHUTDOWNCOMPUTER, 31, 13, 132, 8
ICON IDI_WINLOGON, IDC_SHTDOWNICON, 6, 7, 18, 20
DEFPUSHBUTTON "&Repornire", IDC_BTNSHTDOWNCOMPUTER, 62, 32, 40, 14
END
IDD_GINALOADFAILED DIALOGEX 58, 83, 231, 119
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Eroare interfa de utilizator"
+CAPTION "Eroare interfață de utilizator"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Fiierul DLL al interfeei %s nu a putut fi ncrcat.", IDC_GINALOADFAILED, 39, 16, 156, 24
- LTEXT "Reinstalai ReactOS pentru a rezolva aceast problem.", IDC_GINALOADFAILEDCONTACT, 39, 53, 151, 25
+ LTEXT "Fișierul DLL al interfeței %s nu a putut fi încărcat.", IDC_GINALOADFAILED, 39, 16, 156, 24
+ LTEXT "Reinstalați ReactOS pentru a rezolva această problemă.", IDC_GINALOADFAILEDCONTACT, 39, 53, 151, 25
DEFPUSHBUTTON "&Repornire", 1, 80, 91, 68, 14
END
STRINGTABLE
BEGIN
- IDS_PREPARENETWORKCONNECTIONS "Se pregtesc conexiunile la reea..."
- IDS_APPLYINGCOMPUTERSETTINGS "Se aplic setrile generale..."
- IDS_RUNNINGSTARTUPSCRIPTS "Se execut operaiile de pornire..."
- IDS_RUNNINGSHUTDOWNSCRIPTS "Se execut operaiile de oprire..."
- IDS_APPLYINGYOURPERSONALSETTINGS "Se aplic setrile personale..."
- IDS_RUNNINGLOGOFFSCRIPTS "Se execut operaiile de ieire..."
- IDS_RUNNINGLOGONSCRIPTS "Se execut operaiile de ieire..."
- IDS_LOADINGYOURPERSONALSETTINGS "Se ncarc setrile personale..."
- IDS_CLOSINGNETWORKCONNECTIONS "Se nchid conexiunile la reea..."
- IDS_REACTOSISSHUTTINGDOWN "ReactOS se nchide..."
- IDS_PREPARETOSTANDBY "Pregtire pentru stare de veghe..."
- IDS_PREPARETOHIBERNATE "Pregtire pentru hibernare..."
- IDS_SAVEYOURSETTINGS "Salvare setri..."
- IDS_REACTOSISSTARTINGUP "ReactOS pornete..."
+ IDS_PREPARENETWORKCONNECTIONS "Se pregătesc conexiunile la rețea..."
+ IDS_APPLYINGCOMPUTERSETTINGS "Se aplică setările generale..."
+ IDS_RUNNINGSTARTUPSCRIPTS "Se execută operațiile de pornire..."
+ IDS_RUNNINGSHUTDOWNSCRIPTS "Se execută operațiile de oprire..."
+ IDS_APPLYINGYOURPERSONALSETTINGS "Se aplică setările personale..."
+ IDS_RUNNINGLOGOFFSCRIPTS "Se execută operațiile de ieșire..."
+ IDS_RUNNINGLOGONSCRIPTS "Se execută operațiile de ieșire..."
+ IDS_LOADINGYOURPERSONALSETTINGS "Se încarcă setările personale..."
+ IDS_CLOSINGNETWORKCONNECTIONS "Se închid conexiunile la rețea..."
+ IDS_REACTOSISSHUTTINGDOWN "ReactOS se închide..."
+ IDS_PREPARETOSTANDBY "Pregătire pentru stare de veghe..."
+ IDS_PREPARETOHIBERNATE "Pregătire pentru hibernare..."
+ IDS_SAVEYOURSETTINGS "Salvare setări..."
+ IDS_REACTOSISSTARTINGUP "ReactOS pornește..."
END
STRINGTABLE
@@ -43,3 +45,4 @@ BEGIN
IDS_FAILEDACTIVATEUSERSHELL "Winlogon nu a putut porni nucleul sistemului!"
END
+#pragma code_page(default)
diff --git a/reactos/base/system/winlogon/winlogon.c b/reactos/base/system/winlogon/winlogon.c
index 199c01b6f11..7a10e904c12 100644
--- a/reactos/base/system/winlogon/winlogon.c
+++ b/reactos/base/system/winlogon/winlogon.c
@@ -23,6 +23,94 @@ PWLSESSION WLSession = NULL;
/* FUNCTIONS *****************************************************************/
+DWORD
+WINAPI
+PlayLogonSoundThread(
+ IN LPVOID lpParameter)
+{
+ HKEY hKey;
+ WCHAR szBuffer[MAX_PATH] = {0};
+ WCHAR szDest[MAX_PATH];
+ DWORD dwSize = sizeof(szBuffer);
+ HMODULE hLibrary;
+ SERVICE_STATUS_PROCESS Info;
+ typedef BOOL WINAPI (*PLAYSOUNDW)(LPCWSTR,HMODULE,DWORD);
+ PLAYSOUNDW Play;
+ ULONG Index = 0;
+
+ if (RegOpenKeyExW(HKEY_CURRENT_USER, L"AppEvents\\Schemes\\Apps\\.Default\\WindowsLogon\\.Current", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
+ {
+ ExitThread(0);
+ }
+
+ if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)szBuffer, &dwSize) != ERROR_SUCCESS)
+ {
+ RegCloseKey(hKey);
+ ExitThread(0);
+ }
+
+
+ RegCloseKey(hKey);
+
+ if (!szBuffer[0])
+ ExitThread(0);
+
+
+ szBuffer[MAX_PATH-1] = L'\0';
+ if (ExpandEnvironmentStringsW(szBuffer, szDest, MAX_PATH))
+ {
+ SC_HANDLE hSCManager, hService;
+
+ hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
+ if (!hSCManager)
+ ExitThread(0);;
+
+ hService = OpenServiceW(hSCManager, L"sysaudio", GENERIC_READ);
+ if (!hService)
+ {
+ CloseServiceHandle(hSCManager);
+ TRACE("WL: failed to open sysaudio Status %x", GetLastError());
+ ExitThread(0);
+ }
+
+ do
+ {
+ if (!QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&Info, sizeof(SERVICE_STATUS_PROCESS), &dwSize))
+ {
+ TRACE("WL: QueryServiceStatusEx failed %x\n", GetLastError());
+ break;
+ }
+
+ if (Info.dwCurrentState == SERVICE_RUNNING)
+ break;
+
+ Sleep(1000);
+
+ }while(Index++ < 20);
+
+ CloseServiceHandle(hService);
+ CloseServiceHandle(hSCManager);
+
+ if (Info.dwCurrentState != SERVICE_RUNNING)
+ ExitThread(0);
+
+
+ hLibrary = LoadLibraryW(L"winmm.dll");
+ if (hLibrary)
+ {
+ Play = (PLAYSOUNDW)GetProcAddress(hLibrary, "PlaySoundW");
+ if (Play)
+ {
+ Play(szDest, NULL, SND_FILENAME);
+ }
+ FreeLibrary(hLibrary);
+ }
+ }
+ ExitThread(0);
+}
+
+
+
static BOOL
StartServicesManager(VOID)
{
@@ -201,6 +289,7 @@ WinMain(
#endif
ULONG HardErrorResponse;
MSG Msg;
+ HANDLE hThread;
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
@@ -317,6 +406,13 @@ WinMain(
else
PostMessageW(WLSession->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_TIMEOUT, 0);
+ /* Play logon sound */
+ hThread = CreateThread(NULL, 0, PlayLogonSoundThread, NULL, 0, NULL);
+ if (hThread)
+ {
+ CloseHandle(hThread);
+ }
+
/* Tell kernel that CurrentControlSet is good (needed
* to support Last good known configuration boot) */
NtInitializeRegistry(CM_BOOT_FLAG_ACCEPTED);
diff --git a/reactos/base/system/winlogon/wlx.c b/reactos/base/system/winlogon/wlx.c
index 9e8bce8876f..04a7ef0c755 100644
--- a/reactos/base/system/winlogon/wlx.c
+++ b/reactos/base/system/winlogon/wlx.c
@@ -16,6 +16,20 @@
WINE_DEFAULT_DEBUG_CHANNEL(winlogon);
+#define DESKTOP_ALL (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | \
+ DESKTOP_CREATEMENU | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | \
+ DESKTOP_JOURNALPLAYBACK | DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | \
+ DESKTOP_SWITCHDESKTOP | STANDARD_RIGHTS_REQUIRED)
+
+#define WINSTA_ALL (WINSTA_ENUMDESKTOPS | WINSTA_READATTRIBUTES | \
+ WINSTA_ACCESSCLIPBOARD | WINSTA_CREATEDESKTOP | \
+ WINSTA_WRITEATTRIBUTES | WINSTA_ACCESSGLOBALATOMS | \
+ WINSTA_EXITWINDOWS | WINSTA_ENUMERATE | WINSTA_READSCREEN | \
+ STANDARD_RIGHTS_REQUIRED)
+
+#define GENERIC_ACCESS (GENERIC_READ | GENERIC_WRITE | \
+ GENERIC_EXECUTE | GENERIC_ALL)
+
/* GLOBALS ******************************************************************/
static DLGPROC PreviousWindowProc;
@@ -757,6 +771,185 @@ GinaInit(
&Session->Gina.Context);
}
+BOOL
+AddAceToWindowStation(
+ IN HWINSTA WinSta,
+ IN PSID Sid)
+{
+ DWORD AclSize;
+ SECURITY_INFORMATION SecurityInformation;
+ PACL pDefaultAcl = NULL;
+ PSECURITY_DESCRIPTOR WinstaSd = NULL;
+ PACCESS_ALLOWED_ACE Ace = NULL;
+ BOOL Ret = FALSE;
+
+ /* Allocate space for an ACL */
+ AclSize = sizeof(ACL)
+ + 2 * (FIELD_OFFSET(ACCESS_ALLOWED_ACE, SidStart) + GetLengthSid(Sid));
+ pDefaultAcl = HeapAlloc(GetProcessHeap(), 0, AclSize);
+ if (!pDefaultAcl)
+ {
+ ERR("WL: HeapAlloc() failed\n");
+ goto cleanup;
+ }
+
+ /* Initialize it */
+ if (!InitializeAcl(pDefaultAcl, AclSize, ACL_REVISION))
+ {
+ ERR("WL: InitializeAcl() failed (error %lu)\n", GetLastError());
+ goto cleanup;
+ }
+
+ /* Initialize new security descriptor */
+ WinstaSd = HeapAlloc(GetProcessHeap(), 0, SECURITY_DESCRIPTOR_MIN_LENGTH);
+ if (!InitializeSecurityDescriptor(WinstaSd, SECURITY_DESCRIPTOR_REVISION))
+ {
+ ERR("WL: InitializeSecurityDescriptor() failed (error %lu)\n", GetLastError());
+ goto cleanup;
+ }
+
+ /* Allocate memory for access allowed ACE */
+ Ace = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ACCESS_ALLOWED_ACE)+
+ GetLengthSid(Sid) - sizeof(DWORD));
+
+ /* Create the first ACE for the window station */
+ Ace->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
+ Ace->Header.AceFlags = CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE | OBJECT_INHERIT_ACE;
+ Ace->Header.AceSize = sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(Sid) - sizeof(DWORD);
+ Ace->Mask = GENERIC_ACCESS;
+
+ /* Copy the sid */
+ if (!CopySid(GetLengthSid(Sid), &Ace->SidStart, Sid))
+ {
+ ERR("WL: CopySid() failed (error %lu)\n", GetLastError());
+ goto cleanup;
+ }
+
+ /* Add the first ACE */
+ if (!AddAce(pDefaultAcl, ACL_REVISION, MAXDWORD, (LPVOID)Ace, Ace->Header.AceSize))
+ {
+ ERR("WL: AddAce() failed (error %lu)\n", GetLastError());
+ goto cleanup;
+ }
+
+ /* Add the second ACE to the end of ACL */
+ Ace->Header.AceFlags = NO_PROPAGATE_INHERIT_ACE;
+ Ace->Mask = WINSTA_ALL;
+ if (!AddAce(pDefaultAcl, ACL_REVISION, MAXDWORD, (LPVOID)Ace, Ace->Header.AceSize))
+ {
+ ERR("WL: AddAce() failed (error %lu)\n", GetLastError());
+ goto cleanup;
+ }
+
+ /* Add ACL to winsta's security descriptor */
+ if (!SetSecurityDescriptorDacl(WinstaSd, TRUE, pDefaultAcl, FALSE))
+ {
+ ERR("WL: SetSecurityDescriptorDacl() failed (error %lu)\n", GetLastError());
+ goto cleanup;
+ }
+
+ /* Apply security to the window station */
+ SecurityInformation = DACL_SECURITY_INFORMATION;
+ if (!SetUserObjectSecurity(WinSta, &SecurityInformation, WinstaSd))
+ {
+ ERR("WL: SetUserObjectSecurity() failed (error %lu)\n", GetLastError());
+ goto cleanup;
+ }
+
+ /* Indicate success */
+ Ret = TRUE;
+
+cleanup:
+ /* Free allocated stuff */
+ if (pDefaultAcl) HeapFree(GetProcessHeap(), 0, pDefaultAcl);
+ if (WinstaSd) HeapFree(GetProcessHeap(), 0, WinstaSd);
+ if (Ace) HeapFree(GetProcessHeap(), 0, Ace);
+
+ return Ret;
+}
+
+BOOL
+AddAceToDesktop(
+ IN HDESK Desktop,
+ IN PSID WinlogonSid,
+ IN PSID UserSid)
+{
+ DWORD AclSize;
+ SECURITY_INFORMATION SecurityInformation;
+ PACL Acl = NULL;
+ PSECURITY_DESCRIPTOR DesktopSd = NULL;
+ BOOL Ret = FALSE;
+
+ /* Allocate ACL */
+ AclSize = sizeof(ACL)
+ + FIELD_OFFSET(ACCESS_ALLOWED_ACE, SidStart) + GetLengthSid(WinlogonSid);
+
+ /* Take user's sid into account */
+ if (UserSid)
+ AclSize += FIELD_OFFSET(ACCESS_ALLOWED_ACE, SidStart) + GetLengthSid(UserSid);
+
+ Acl = HeapAlloc(GetProcessHeap(), 0, AclSize);
+ if (!Acl)
+ {
+ ERR("WL: HeapAlloc() failed\n");
+ goto cleanup;
+ }
+
+ /* Initialize ACL */
+ if (!InitializeAcl(Acl, AclSize, ACL_REVISION))
+ {
+ ERR("WL: InitializeAcl() failed (error %lu)\n", GetLastError());
+ goto cleanup;
+ }
+
+ /* Add full desktop access ACE for winlogon */
+ if (!AddAccessAllowedAce(Acl, ACL_REVISION, DESKTOP_ALL, WinlogonSid))
+ {
+ ERR("WL: AddAccessAllowedAce() failed (error %lu)\n", GetLastError());
+ goto cleanup;
+ }
+
+ /* Add full desktop access ACE for a user (if provided) */
+ if (UserSid && !AddAccessAllowedAce(Acl, ACL_REVISION, DESKTOP_ALL, UserSid))
+ {
+ ERR("WL: AddAccessAllowedAce() failed (error %lu)\n", GetLastError());
+ goto cleanup;
+ }
+
+ /* Initialize new security descriptor */
+ DesktopSd = HeapAlloc(GetProcessHeap(), 0, SECURITY_DESCRIPTOR_MIN_LENGTH);
+ if (!InitializeSecurityDescriptor(DesktopSd, SECURITY_DESCRIPTOR_REVISION))
+ {
+ ERR("WL: InitializeSecurityDescriptor() failed (error %lu)\n", GetLastError());
+ goto cleanup;
+ }
+
+ /* Add ACL to the security descriptor */
+ if (!SetSecurityDescriptorDacl(DesktopSd, TRUE, Acl, FALSE))
+ {
+ ERR("WL: SetSecurityDescriptorDacl() failed (error %lu)\n", GetLastError());
+ goto cleanup;
+ }
+
+ /* Apply security to the window station */
+ SecurityInformation = DACL_SECURITY_INFORMATION;
+ if (!SetUserObjectSecurity(Desktop, &SecurityInformation, DesktopSd))
+ {
+ ERR("WL: SetUserObjectSecurity() failed (error %lu)\n", GetLastError());
+ goto cleanup;
+ }
+
+ /* Indicate success */
+ Ret = TRUE;
+
+cleanup:
+ /* Free allocated stuff */
+ if (Acl) HeapFree(GetProcessHeap(), 0, Acl);
+ if (DesktopSd) HeapFree(GetProcessHeap(), 0, DesktopSd);
+
+ return Ret;
+}
+
BOOL
CreateWindowStationAndDesktops(
IN OUT PWLSESSION Session)
diff --git a/reactos/baseaddress.rbuild b/reactos/baseaddress.rbuild
index 4c3190bdffa..b68e4a567c4 100644
--- a/reactos/baseaddress.rbuild
+++ b/reactos/baseaddress.rbuild
@@ -143,6 +143,7 @@
+
diff --git a/reactos/boot/bootdata/hivedef_arm.inf b/reactos/boot/bootdata/hivedef_arm.inf
index 31841026c5e..5cdbcd9761c 100644
--- a/reactos/boot/bootdata/hivedef_arm.inf
+++ b/reactos/boot/bootdata/hivedef_arm.inf
@@ -4,6 +4,7 @@ Signature="$ReactOS$
[AddReg]
HKCU,"Control Panel",,0x00000012
+HKCU,"Control Panel\Accessibility",,0x00000012
HKCU,"Control Panel\Appearance",,0x00000012
HKCU,"Control Panel\Mouse","MouseTrails",0x00010001,0x00000000
HKCU,"Control Panel\Mouse","SnapToDefaultButton",0x00010001,0x00000000
@@ -50,10 +51,10 @@ HKCU,"Control Panel\PowerCfg\PowerPolicies\0","Policies",0x00000001,01,00,00,00,
HKCU,"Control Panel\Current","Color Schemes",0x00020000,"ReactOS Standard"
HKCU,"Control Panel\Appearance","Current",0x00020000,"ReactOS Standard"
HKCU,"Control Panel\Appearance","NewCurrent",0x00020000,"ReactOS Standard"
+HKCU,"Control Panel\Appearance\New Schemes","SelectedSize",0x00020000,"0"
HKCU,"Control Panel\Appearance\New Schemes","SelectedStyle",0x00020000,"0"
; ReactOS Standard
HKCU,"Control Panel\Appearance\New Schemes\0","DisplayName",0x00020000,"@themeui.dll,-883"
-HKCU,"Control Panel\Appearance\New Schemes\0","SelectedSize",0x00020000,"0"
HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Flat Menus",0x00010001,0x00000000
HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
@@ -113,130 +114,8 @@ HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #29",0x00010001,0x0
HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #30",0x00010001,0x00c8d0d4
HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Contrast",0x00010001,0x00000000
HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","LegacyName",0x00020000,"ReactOS Standard"
-; Green Olive
-HKCU,"Control Panel\Appearance\New Schemes\4","DisplayName",0x00020000,"@themeui.dll,-877"
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Flat Menus",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #0",0x00010001,0x02d3e3d0
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #1",0x00010001,0x00213f21
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #2",0x00010001,0x00649759
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #3",0x00010001,0x00808080
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #4",0x00010001,0x00a9c8a2
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #5",0x00010001,0x02ffffff
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #6",0x00010001,0x02000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #7",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #8",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #9",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #10",0x00010001,0x02a9c8a2
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #11",0x00010001,0x02a9c8a2
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #12",0x00010001,0x02d3e3d0
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #13",0x00010001,0x00649759
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #14",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #15",0x00010001,0x02a9c8a2
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #16",0x00010001,0x02649759
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #17",0x00010001,0x02649759
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #18",0x00010001,0x02000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #19",0x00010001,0x00d3e3d0
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #20",0x00010001,0x02d3e3d0
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #21",0x00010001,0x02000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #22",0x00010001,0x02a9c8a2
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #23",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #24",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #25",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #26",0x00010001,0x02649759
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #27",0x00010001,0x00e8c898
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #28",0x00010001,0x00b0cca8
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #29",0x00010001,0x00649759
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #30",0x00010001,0x00a9c8a2
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Contrast",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","LegacyName",0x00020000,"Green Olive"
-; Plum
-HKCU,"Control Panel\Appearance\New Schemes\3","DisplayName",0x00020000,"@themeui.dll,-869"
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Flat Menus",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #0",0x00010001,0x00c8d0d8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #1",0x00010001,0x00402840
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #2",0x00010001,0x00604048
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #3",0x00010001,0x00586078
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #4",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #5",0x00010001,0x00c8d0d8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #6",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #7",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #8",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #9",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #10",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #11",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #12",0x00010001,0x005a6374
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #13",0x00010001,0x00808000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #14",0x00010001,0x00c8d0d8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #15",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #16",0x00010001,0x00586078
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #17",0x00010001,0x00586078
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #18",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #19",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #20",0x00010001,0x00c8d0d8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #21",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #22",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #23",0x00010001,0x00580030
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #24",0x00010001,0x00c8ccd5
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #25",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #26",0x00010001,0x00604048
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #27",0x00010001,0x00b884a0
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #28",0x00010001,0x007898a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #29",0x00010001,0x00808000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #30",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Contrast",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","LegacyName",0x00020000,"Plum"
-; ReactOS Classic
-HKCU,"Control Panel\Appearance\New Schemes\1","DisplayName",0x00020000,"@themeui.dll,-880"
+; Brick
+HKCU,"Control Panel\Appearance\New Schemes\1","DisplayName",0x00020000,"@themeui.dll,-851"
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Flat Menus",0x00010001,0x00000000
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
@@ -263,40 +142,40 @@ HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #5",0x00000001,f5,ff
00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #0",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #1",0x00010001,0x00a56e3a
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #2",0x00010001,0x00800000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #3",0x00010001,0x00808080
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #4",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #0",0x00010001,0x02d2e0e1
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #1",0x00010001,0x00000042
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #2",0x00010001,0x00000080
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #3",0x00010001,0x0061898d
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #4",0x00010001,0x00a5bfc2
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #5",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #6",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #6",0x00010001,0x02000000
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #7",0x00010001,0x00000000
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #8",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #9",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #10",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #11",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #12",0x00010001,0x00808080
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #13",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #9",0x00010001,0x00d2e0e1
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #10",0x00010001,0x00a5bfc2
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #11",0x00010001,0x00a5bfc2
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #12",0x00010001,0x00d2e0e1
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #13",0x00010001,0x0061898d
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #14",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #15",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #16",0x00010001,0x00808080
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #17",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #15",0x00010001,0x00a5bfc2
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #16",0x00010001,0x0261898d
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #17",0x00010001,0x0261898d
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #18",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #19",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #20",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #21",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #22",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #23",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #24",0x00010001,0x00e1ffff
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #19",0x00010001,0x00d2e0e1
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #20",0x00010001,0x02d2e0e1
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #22",0x00010001,0x02a5bfc2
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #23",0x00010001,0x00000080
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #24",0x00010001,0x00d2e0e1
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #25",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #26",0x00010001,0x00800000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #27",0x00010001,0x00d08410
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #28",0x00010001,0x00b5b5b5
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #29",0x00010001,0x00800000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #30",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #26",0x00010001,0x02000080
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #27",0x00010001,0x004074b0
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #28",0x00010001,0x0070b8c8
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #29",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #30",0x00010001,0x00a5bfc2
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Contrast",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","LegacyName",0x00020000,"ReactOS Classic"
-; Sand
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","LegacyName",0x00020000,"Brick"
+; Eggplant
HKCU,"Control Panel\Appearance\New Schemes\2","DisplayName",0x00020000,"@themeui.dll,-851"
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Flat Menus",0x00010001,0x00000000
@@ -324,39 +203,1198 @@ HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #5",0x00000001,f5,ff
00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #0",0x00010001,0x02dde6ea
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #1",0x00010001,0x02688da2
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #2",0x00010001,0x00808000
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #3",0x00010001,0x00688da2
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #4",0x00010001,0x00bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #0",0x00010001,0x02a8b090
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #1",0x00010001,0x00400040
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #2",0x00010001,0x00788058
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #3",0x00010001,0x00a8b090
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #4",0x00010001,0x00a8b090
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #5",0x00010001,0x02ffffff
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #6",0x00010001,0x02000000
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #7",0x00010001,0x00000000
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #8",0x00010001,0x00000000
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #9",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #10",0x00010001,0x02bbccd5
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #11",0x00010001,0x02bbccd5
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #12",0x00010001,0x02688da2
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #13",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #10",0x00010001,0x02a8b090
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #11",0x00010001,0x02a8b090
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #12",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #13",0x00010001,0x00788058
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #14",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #15",0x00010001,0x02bbccd5
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #16",0x00010001,0x02688da2
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #17",0x00010001,0x02688da2
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #15",0x00010001,0x02a8b090
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #16",0x00010001,0x02788058
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #17",0x00010001,0x02788058
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #18",0x00010001,0x02000000
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #19",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #20",0x00010001,0x02dde6ea
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #19",0x00010001,0x00788058
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #20",0x00010001,0x02d8d8c8
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #21",0x00010001,0x02000000
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #22",0x00010001,0x02bbccd5
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #22",0x00010001,0x02a8b090
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #23",0x00010001,0x00800080
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #24",0x00010001,0x00ffffff
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #25",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #26",0x00010001,0x02808000
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #27",0x00010001,0x00aabd84
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #28",0x00010001,0x0080d0e8
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #29",0x00010001,0x00808000
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #30",0x00010001,0x00bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #26",0x00010001,0x02788058
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #27",0x00010001,0x00834b83
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #28",0x00010001,0x00d2bdcb
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #29",0x00010001,0x00788058
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #30",0x00010001,0x00a8b090
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Contrast",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","LegacyName",0x00020000,"Sand"
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","LegacyName",0x00020000,"Eggplant"
+; Green Olive
+HKCU,"Control Panel\Appearance\New Schemes\3","DisplayName",0x00020000,"@themeui.dll,-877"
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #0",0x00010001,0x02d3e3d0
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #1",0x00010001,0x00213f21
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #2",0x00010001,0x00649759
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #4",0x00010001,0x00a9c8a2
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #10",0x00010001,0x02a9c8a2
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #11",0x00010001,0x02a9c8a2
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #12",0x00010001,0x02d3e3d0
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #13",0x00010001,0x00649759
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #15",0x00010001,0x02a9c8a2
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #16",0x00010001,0x02649759
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #17",0x00010001,0x02649759
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #19",0x00010001,0x00d3e3d0
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #20",0x00010001,0x02d3e3d0
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #22",0x00010001,0x02a9c8a2
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #26",0x00010001,0x02649759
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #27",0x00010001,0x00e8c898
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #28",0x00010001,0x00b0cca8
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #29",0x00010001,0x00649759
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #30",0x00010001,0x00a9c8a2
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","LegacyName",0x00020000,"Green Olive"
+; High Contrast 1
+HKCU,"Control Panel\Appearance\New Schemes\4","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #0",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #2",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #3",0x00010001,0x00ffff00
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #4",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #5",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #6",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #7",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #8",0x00010001,0x0000ffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #10",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #11",0x00010001,0x00ffff00
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #12",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #13",0x00010001,0x00008000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #15",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #16",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #17",0x00010001,0x0200ff00
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #18",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #19",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #20",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #21",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #22",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #23",0x00010001,0x0000ffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #24",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #26",0x00010001,0x02800080
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #27",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #28",0x00010001,0x00ffff00
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #29",0x00010001,0x00008000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #30",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","LegacyName",0x00020000,"High Contrast 1"
+; High Contrast 2
+HKCU,"Control Panel\Appearance\New Schemes\5","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #0",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #2",0x00010001,0x00ffff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #3",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #4",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #5",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #6",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #7",0x00010001,0x0000ff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #8",0x00010001,0x0000ff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #9",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #10",0x00010001,0x00ffff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #11",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #12",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #13",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #15",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #16",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #17",0x00010001,0x0200ff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #18",0x00010001,0x0000ff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #19",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #20",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #21",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #22",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #24",0x00010001,0x0000ffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #26",0x00010001,0x02800080
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #27",0x00010001,0x00ffff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #28",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #29",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #30",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","LegacyName",0x00020000,"High Contrast 2"
+; High Contrast Black
+HKCU,"Control Panel\Appearance\New Schemes\6","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #0",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #2",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #3",0x00010001,0x00008000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #4",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #5",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #6",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #7",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #8",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #10",0x00010001,0x0200ffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #11",0x00010001,0x02008000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #12",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #13",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #15",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #16",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #17",0x00010001,0x0200ff00
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #18",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #19",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #20",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #21",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #22",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #23",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #24",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #26",0x00010001,0x02800080
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #27",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #28",0x00010001,0x00008000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #29",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #30",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","LegacyName",0x00020000,"High Contrast Black"
+; High Contrast White
+HKCU,"Control Panel\Appearance\New Schemes\7","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #0",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #1",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #2",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #3",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #4",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #10",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #11",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #12",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #13",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #15",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #16",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #17",0x00010001,0x0200ff00
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #19",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #20",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #22",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #26",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #27",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #28",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #29",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #30",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","LegacyName",0x00020000,"High Contrast White"
+; Lilac
+HKCU,"Control Panel\Appearance\New Schemes\8","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #0",0x00010001,0x02d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #2",0x00010001,0x00b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #4",0x00010001,0x00d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #10",0x00010001,0x02d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #11",0x00010001,0x02d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #12",0x00010001,0x02b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #13",0x00010001,0x00b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #15",0x00010001,0x02d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #16",0x00010001,0x02b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #17",0x00010001,0x02b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #19",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #20",0x00010001,0x02ecd5d8
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #22",0x00010001,0x02d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #26",0x00010001,0x02b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #27",0x00010001,0x00cb8fb6
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #28",0x00010001,0x00d0b4b8
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #29",0x00010001,0x00b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #30",0x00010001,0x00d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","LegacyName",0x00020000,"Lilac"
+; Maple
+HKCU,"Control Panel\Appearance\New Schemes\9","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #0",0x00010001,0x02d7ecf2
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #2",0x00010001,0x00000080
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #3",0x00010001,0x0046a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #4",0x00010001,0x00aed8e6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #10",0x00010001,0x02aed8e6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #11",0x00010001,0x02aed8e6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #12",0x00010001,0x0246a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #13",0x00010001,0x0046a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #14",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #15",0x00010001,0x02aed8e6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #16",0x00010001,0x0246a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #17",0x00010001,0x0246a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #19",0x00010001,0x00d7ecf2
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #20",0x00010001,0x02d7ecf2
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #22",0x00010001,0x02aed8e6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #25",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #26",0x00010001,0x0246a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #27",0x00010001,0x00389cc0
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #28",0x00010001,0x0088c8e0
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #29",0x00010001,0x0046a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #30",0x00010001,0x00aed8e6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","LegacyName",0x00020000,"Maple"
+; Marine
+HKCU,"Control Panel\Appearance\New Schemes\10","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #0",0x00010001,0x02d8e0c8
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #1",0x00010001,0x00474e2c
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #2",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #3",0x00010001,0x00889048
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #4",0x00010001,0x00b8c088
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #5",0x00010001,0x02d8e0c8
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #10",0x00010001,0x02b8c088
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #11",0x00010001,0x02b8c088
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #12",0x00010001,0x00848d4b
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #13",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #15",0x00010001,0x02b8c088
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #16",0x00010001,0x02889048
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #17",0x00010001,0x02889048
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #19",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #20",0x00010001,0x02d8e0c8
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #22",0x00010001,0x02b8c088
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #24",0x00010001,0x00d8e0c8
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #26",0x00010001,0x02800000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #27",0x00010001,0x00c0b418
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #28",0x00010001,0x00d8cc78
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #29",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #30",0x00010001,0x00b8c088
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","LegacyName",0x00020000,"Marine"
+; Plum
+HKCU,"Control Panel\Appearance\New Schemes\11","DisplayName",0x00020000,"@themeui.dll,-869"
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #0",0x00010001,0x00c8d0d8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #1",0x00010001,0x00402840
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #2",0x00010001,0x00604048
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #3",0x00010001,0x00586078
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #4",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #5",0x00010001,0x00c8d0d8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #6",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #10",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #11",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #12",0x00010001,0x005a6374
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #13",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #14",0x00010001,0x00c8d0d8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #15",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #16",0x00010001,0x00586078
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #17",0x00010001,0x00586078
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #18",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #19",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #20",0x00010001,0x00c8d0d8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #21",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #22",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #23",0x00010001,0x00580030
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #24",0x00010001,0x00c8ccd5
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #26",0x00010001,0x00604048
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #27",0x00010001,0x00b884a0
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #28",0x00010001,0x007898a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #29",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #30",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","LegacyName",0x00020000,"Plum"
+; Pumpkin
+HKCU,"Control Panel\Appearance\New Schemes\12","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #0",0x00010001,0x02cfeaf5
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #1",0x00010001,0x00420042
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #2",0x00010001,0x002fa5d7
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #3",0x00010001,0x00a4a0a0
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #4",0x00010001,0x009dd5ec
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #10",0x00010001,0x029dd5ec
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #11",0x00010001,0x029dd5ec
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #12",0x00010001,0x02cfeaf5
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #13",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #15",0x00010001,0x029dd5ec
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #16",0x00010001,0x022fa5d7
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #17",0x00010001,0x022fa5d7
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #19",0x00010001,0x00cfeaf5
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #20",0x00010001,0x02cfeaf5
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #22",0x00010001,0x029dd5ec
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #23",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #26",0x00010001,0x022fa5d7
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #27",0x00010001,0x0088cce0
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #28",0x00010001,0x0090ccd0
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #29",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #30",0x00010001,0x009dd5ec
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","LegacyName",0x00020000,"Pumpkin"
+; Rainy Day
+HKCU,"Control Panel\Appearance\New Schemes\13","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #0",0x00010001,0x02d9ccc1
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #2",0x00010001,0x007d654f
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #4",0x00010001,0x00b19983
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #10",0x00010001,0x02b19983
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #11",0x00010001,0x02b19983
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #12",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #13",0x00010001,0x007d654f
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #15",0x00010001,0x02b19983
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #16",0x00010001,0x027d654f
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #17",0x00010001,0x027d654f
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #19",0x00010001,0x00d9ccc1
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #20",0x00010001,0x02d9ccc1
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #22",0x00010001,0x02b19983
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #26",0x00010001,0x027d654f
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #27",0x00010001,0x00d0b480
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #28",0x00010001,0x00d0bcb0
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #29",0x00010001,0x007d654f
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #30",0x00010001,0x00b19983
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","LegacyName",0x00020000,"Rainy Day"
+; ReactOS Classic
+HKCU,"Control Panel\Appearance\New Schemes\14","DisplayName",0x00020000,"@themeui.dll,-880"
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #0",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #1",0x00010001,0x00a56e3a
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #2",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #4",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #5",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #6",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #10",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #11",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #12",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #13",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #15",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #16",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #17",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #18",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #19",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #20",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #21",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #22",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #24",0x00010001,0x00e1ffff
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #26",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #27",0x00010001,0x00d08410
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #28",0x00010001,0x00b5b5b5
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #29",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #30",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","LegacyName",0x00020000,"ReactOS Classic"
+; Rose
+HKCU,"Control Panel\Appearance\New Schemes\15","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #0",0x00010001,0x02b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #1",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #2",0x00010001,0x0070609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #3",0x00010001,0x00a4a0a0
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #4",0x00010001,0x00b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #10",0x00010001,0x02b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #11",0x00010001,0x02b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #12",0x00010001,0x0270609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #13",0x00010001,0x0070609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #15",0x00010001,0x02b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #16",0x00010001,0x0270609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #17",0x00010001,0x0270609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #19",0x00010001,0x007d7d7d
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #20",0x00010001,0x02dcd8e7
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #22",0x00010001,0x02b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #26",0x00010001,0x0270609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #27",0x00010001,0x00d0ccd8
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #28",0x00010001,0x00d0d4d0
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #29",0x00010001,0x0070609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #30",0x00010001,0x00b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","LegacyName",0x00020000,"Rose"
+; Sand
+HKCU,"Control Panel\Appearance\New Schemes\16","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #0",0x00010001,0x02dde6ea
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #1",0x00010001,0x02688da2
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #2",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #3",0x00010001,0x00688da2
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #4",0x00010001,0x00bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #10",0x00010001,0x02bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #11",0x00010001,0x02bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #12",0x00010001,0x02688da2
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #13",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #15",0x00010001,0x02bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #16",0x00010001,0x02688da2
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #17",0x00010001,0x02688da2
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #19",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #20",0x00010001,0x02dde6ea
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #22",0x00010001,0x02bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #26",0x00010001,0x02808000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #27",0x00010001,0x00aabd84
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #28",0x00010001,0x0080d0e8
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #29",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #30",0x00010001,0x00bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","LegacyName",0x00020000,"Sand"
+; Sky (WinXP-like)
+HKCU,"Control Panel\Appearance\New Schemes\17","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #0",0x00010001,0x00c8d0d4
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #1",0x00010001,0x00984e00
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #2",0x00010001,0x00e35400
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #3",0x00010001,0x00df967a
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #4",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #5",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #6",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #10",0x00010001,0x00c8d0d4
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #11",0x00010001,0x00c8d0d4
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #12",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #13",0x00010001,0x00c56a31
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #15",0x00010001,0x00d8e9ec
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #16",0x00010001,0x0099a8ac
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #17",0x00010001,0x0099a8ac
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #18",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #19",0x00010001,0x00f8e4d8
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #20",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #21",0x00010001,0x00646f71
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #22",0x00010001,0x00e2eff1
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #24",0x00010001,0x00e1ffff
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #25",0x00010001,0x00b5b5b5
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #26",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #27",0x00010001,0x00ff953d
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #28",0x00010001,0x00ebb99d
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #29",0x00010001,0x00c56a31
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #30",0x00010001,0x00d8e9ec
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","LegacyName",0x00020000,"Sky"
+; Slate
+HKCU,"Control Panel\Appearance\New Schemes\18","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #0",0x00010001,0x02e3dcce
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #1",0x00010001,0x00414141
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #2",0x00010001,0x00978055
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #4",0x00010001,0x00c8b99d
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #10",0x00010001,0x02c8b99d
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #11",0x00010001,0x02c8b99d
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #12",0x00010001,0x00424242
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #13",0x00010001,0x00978055
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #15",0x00010001,0x02c8b99d
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #16",0x00010001,0x02978055
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #17",0x00010001,0x02978055
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #19",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #20",0x00010001,0x02e3dcce
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #22",0x00010001,0x02c8b99d
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #26",0x00010001,0x02978055
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #27",0x00010001,0x00d8b888
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #28",0x00010001,0x00c8bca0
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #29",0x00010001,0x00978055
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #30",0x00010001,0x00c8b99d
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","LegacyName",0x00020000,"Slate"
+; Storm
+HKCU,"Control Panel\Appearance\New Schemes\19","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #0",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #2",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #4",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #10",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #11",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #12",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #13",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #15",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #16",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #17",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #19",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #20",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #22",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #23",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #26",0x00010001,0x02800080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #27",0x00010001,0x00b08c38
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #28",0x00010001,0x00a8aca8
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #29",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #30",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","LegacyName",0x00020000,"Storm"
+; Teal
+HKCU,"Control Panel\Appearance\New Schemes\20","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #0",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #1",0x00010001,0x00404000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #2",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #4",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #10",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #11",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #12",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #13",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #15",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #16",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #17",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #19",0x00010001,0x00f0fbff
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #20",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #22",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #26",0x00010001,0x02808000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #27",0x00010001,0x00d8cc00
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #28",0x00010001,0x00b8c898
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #29",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #30",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","LegacyName",0x00020000,"Teal"
+; Wheat
+HKCU,"Control Panel\Appearance\New Schemes\21","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #0",0x00010001,0x02d0eeee
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #1",0x00010001,0x021d4000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #2",0x00010001,0x00008080
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #3",0x00010001,0x0041bcbc
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #4",0x00010001,0x00a0dede
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #10",0x00010001,0x02a0dede
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #11",0x00010001,0x02a0dede
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #12",0x00010001,0x0241bcbc
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #13",0x00010001,0x00008080
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #15",0x00010001,0x02a0dede
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #16",0x00010001,0x0241bcbc
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #17",0x00010001,0x0241bcbc
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #19",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #20",0x00010001,0x02d0eeee
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #22",0x00010001,0x02a0dede
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #25",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #26",0x00010001,0x02008080
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #27",0x00010001,0x0048b0c8
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #28",0x00010001,0x0080b8b8
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #29",0x00010001,0x00008080
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #30",0x00010001,0x00a0dede
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","LegacyName",0x00020000,"Wheat"
HKCU,"Environment",,0x00000012
HKCU,"Environment","TEMP",0x00020000,"%USERPROFILE%\Local Settings\Temp"
@@ -456,6 +1494,11 @@ HKCU, "Control Panel\Desktop\WindowMetrics","StatusFont",0x00000001,f5,ff,ff,ff,
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,\
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
+; Accessibility
+HKCU,"Control Panel\Accessibility",,0x00000012
+HKCU,"Control Panel\Accessibility\Keyboard Preference",,0x00000012
+HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0"
+
; Internet Explorer
HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php"
diff --git a/reactos/boot/bootdata/hivedef_i386.inf b/reactos/boot/bootdata/hivedef_i386.inf
index 45d82e05f77..7be1e27bffe 100644
--- a/reactos/boot/bootdata/hivedef_i386.inf
+++ b/reactos/boot/bootdata/hivedef_i386.inf
@@ -4,6 +4,7 @@ Signature="$ReactOS$
[AddReg]
HKCU,"Control Panel",,0x00000012
+HKCU,"Control Panel\Accessibility",,0x00000012
HKCU,"Control Panel\Appearance",,0x00000012
HKCU,"Control Panel\Mouse","MouseTrails",0x00010001,0x00000000
HKCU,"Control Panel\Mouse","SnapToDefaultButton",0x00010001,0x00000000
@@ -68,10 +69,10 @@ HKCU,"Control Panel\PowerCfg\PowerPolicies\0","Policies",0x00000001,01,00,00,00,
HKCU,"Control Panel\Current","Color Schemes",0x00020000,"ReactOS Standard"
HKCU,"Control Panel\Appearance","Current",0x00020000,"ReactOS Standard"
HKCU,"Control Panel\Appearance","NewCurrent",0x00020000,"ReactOS Standard"
+HKCU,"Control Panel\Appearance\New Schemes","SelectedSize",0x00020000,"0"
HKCU,"Control Panel\Appearance\New Schemes","SelectedStyle",0x00020000,"0"
; ReactOS Standard
HKCU,"Control Panel\Appearance\New Schemes\0","DisplayName",0x00020000,"@themeui.dll,-883"
-HKCU,"Control Panel\Appearance\New Schemes\0","SelectedSize",0x00020000,"0"
HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Flat Menus",0x00010001,0x00000000
HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
@@ -131,130 +132,8 @@ HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #29",0x00010001,0x0
HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #30",0x00010001,0x00c8d0d4
HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Contrast",0x00010001,0x00000000
HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","LegacyName",0x00020000,"ReactOS Standard"
-; Green Olive
-HKCU,"Control Panel\Appearance\New Schemes\4","DisplayName",0x00020000,"@themeui.dll,-877"
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Flat Menus",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #0",0x00010001,0x02d3e3d0
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #1",0x00010001,0x00213f21
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #2",0x00010001,0x00649759
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #3",0x00010001,0x00808080
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #4",0x00010001,0x00a9c8a2
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #5",0x00010001,0x02ffffff
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #6",0x00010001,0x02000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #7",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #8",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #9",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #10",0x00010001,0x02a9c8a2
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #11",0x00010001,0x02a9c8a2
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #12",0x00010001,0x02d3e3d0
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #13",0x00010001,0x00649759
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #14",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #15",0x00010001,0x02a9c8a2
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #16",0x00010001,0x02649759
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #17",0x00010001,0x02649759
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #18",0x00010001,0x02000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #19",0x00010001,0x00d3e3d0
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #20",0x00010001,0x02d3e3d0
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #21",0x00010001,0x02000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #22",0x00010001,0x02a9c8a2
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #23",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #24",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #25",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #26",0x00010001,0x02649759
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #27",0x00010001,0x00e8c898
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #28",0x00010001,0x00b0cca8
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #29",0x00010001,0x00649759
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #30",0x00010001,0x00a9c8a2
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Contrast",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","LegacyName",0x00020000,"Green Olive"
-; Plum
-HKCU,"Control Panel\Appearance\New Schemes\3","DisplayName",0x00020000,"@themeui.dll,-869"
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Flat Menus",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
-00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #0",0x00010001,0x00c8d0d8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #1",0x00010001,0x00402840
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #2",0x00010001,0x00604048
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #3",0x00010001,0x00586078
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #4",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #5",0x00010001,0x00c8d0d8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #6",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #7",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #8",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #9",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #10",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #11",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #12",0x00010001,0x005a6374
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #13",0x00010001,0x00808000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #14",0x00010001,0x00c8d0d8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #15",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #16",0x00010001,0x00586078
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #17",0x00010001,0x00586078
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #18",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #19",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #20",0x00010001,0x00c8d0d8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #21",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #22",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #23",0x00010001,0x00580030
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #24",0x00010001,0x00c8ccd5
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #25",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #26",0x00010001,0x00604048
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #27",0x00010001,0x00b884a0
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #28",0x00010001,0x007898a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #29",0x00010001,0x00808000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #30",0x00010001,0x009098a8
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Contrast",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","LegacyName",0x00020000,"Plum"
-; ReactOS Classic
-HKCU,"Control Panel\Appearance\New Schemes\1","DisplayName",0x00020000,"@themeui.dll,-880"
+; Brick
+HKCU,"Control Panel\Appearance\New Schemes\1","DisplayName",0x00020000,"@themeui.dll,-851"
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Flat Menus",0x00010001,0x00000000
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
@@ -281,40 +160,40 @@ HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #5",0x00000001,f5,ff
00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #0",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #1",0x00010001,0x00a56e3a
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #2",0x00010001,0x00800000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #3",0x00010001,0x00808080
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #4",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #0",0x00010001,0x02d2e0e1
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #1",0x00010001,0x00000042
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #2",0x00010001,0x00000080
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #3",0x00010001,0x0061898d
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #4",0x00010001,0x00a5bfc2
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #5",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #6",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #6",0x00010001,0x02000000
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #7",0x00010001,0x00000000
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #8",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #9",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #10",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #11",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #12",0x00010001,0x00808080
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #13",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #9",0x00010001,0x00d2e0e1
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #10",0x00010001,0x00a5bfc2
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #11",0x00010001,0x00a5bfc2
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #12",0x00010001,0x00d2e0e1
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #13",0x00010001,0x0061898d
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #14",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #15",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #16",0x00010001,0x00808080
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #17",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #15",0x00010001,0x00a5bfc2
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #16",0x00010001,0x0261898d
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #17",0x00010001,0x0261898d
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #18",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #19",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #20",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #21",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #22",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #23",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #24",0x00010001,0x00e1ffff
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #19",0x00010001,0x00d2e0e1
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #20",0x00010001,0x02d2e0e1
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #22",0x00010001,0x02a5bfc2
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #23",0x00010001,0x00000080
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #24",0x00010001,0x00d2e0e1
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #25",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #26",0x00010001,0x00800000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #27",0x00010001,0x00d08410
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #28",0x00010001,0x00b5b5b5
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #29",0x00010001,0x00800000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #30",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #26",0x00010001,0x02000080
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #27",0x00010001,0x004074b0
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #28",0x00010001,0x0070b8c8
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #29",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #30",0x00010001,0x00a5bfc2
HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Contrast",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","LegacyName",0x00020000,"ReactOS Classic"
-; Sand
+HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","LegacyName",0x00020000,"Brick"
+; Eggplant
HKCU,"Control Panel\Appearance\New Schemes\2","DisplayName",0x00020000,"@themeui.dll,-851"
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Flat Menus",0x00010001,0x00000000
@@ -342,39 +221,1198 @@ HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #5",0x00000001,f5,ff
00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #0",0x00010001,0x02dde6ea
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #1",0x00010001,0x02688da2
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #2",0x00010001,0x00808000
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #3",0x00010001,0x00688da2
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #4",0x00010001,0x00bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #0",0x00010001,0x02a8b090
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #1",0x00010001,0x00400040
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #2",0x00010001,0x00788058
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #3",0x00010001,0x00a8b090
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #4",0x00010001,0x00a8b090
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #5",0x00010001,0x02ffffff
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #6",0x00010001,0x02000000
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #7",0x00010001,0x00000000
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #8",0x00010001,0x00000000
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #9",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #10",0x00010001,0x02bbccd5
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #11",0x00010001,0x02bbccd5
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #12",0x00010001,0x02688da2
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #13",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #10",0x00010001,0x02a8b090
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #11",0x00010001,0x02a8b090
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #12",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #13",0x00010001,0x00788058
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #14",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #15",0x00010001,0x02bbccd5
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #16",0x00010001,0x02688da2
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #17",0x00010001,0x02688da2
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #15",0x00010001,0x02a8b090
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #16",0x00010001,0x02788058
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #17",0x00010001,0x02788058
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #18",0x00010001,0x02000000
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #19",0x00010001,0x00ffffff
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #20",0x00010001,0x02dde6ea
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #19",0x00010001,0x00788058
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #20",0x00010001,0x02d8d8c8
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #21",0x00010001,0x02000000
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #22",0x00010001,0x02bbccd5
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #22",0x00010001,0x02a8b090
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #23",0x00010001,0x00800080
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #24",0x00010001,0x00ffffff
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #25",0x00010001,0x00c0c0c0
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #26",0x00010001,0x02808000
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #27",0x00010001,0x00aabd84
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #28",0x00010001,0x0080d0e8
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #29",0x00010001,0x00808000
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #30",0x00010001,0x00bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #26",0x00010001,0x02788058
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #27",0x00010001,0x00834b83
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #28",0x00010001,0x00d2bdcb
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #29",0x00010001,0x00788058
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #30",0x00010001,0x00a8b090
HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Contrast",0x00010001,0x00000000
-HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","LegacyName",0x00020000,"Sand"
+HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","LegacyName",0x00020000,"Eggplant"
+; Green Olive
+HKCU,"Control Panel\Appearance\New Schemes\3","DisplayName",0x00020000,"@themeui.dll,-877"
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #0",0x00010001,0x02d3e3d0
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #1",0x00010001,0x00213f21
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #2",0x00010001,0x00649759
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #4",0x00010001,0x00a9c8a2
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #10",0x00010001,0x02a9c8a2
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #11",0x00010001,0x02a9c8a2
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #12",0x00010001,0x02d3e3d0
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #13",0x00010001,0x00649759
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #15",0x00010001,0x02a9c8a2
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #16",0x00010001,0x02649759
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #17",0x00010001,0x02649759
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #19",0x00010001,0x00d3e3d0
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #20",0x00010001,0x02d3e3d0
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #22",0x00010001,0x02a9c8a2
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #26",0x00010001,0x02649759
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #27",0x00010001,0x00e8c898
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #28",0x00010001,0x00b0cca8
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #29",0x00010001,0x00649759
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #30",0x00010001,0x00a9c8a2
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","LegacyName",0x00020000,"Green Olive"
+; High Contrast 1
+HKCU,"Control Panel\Appearance\New Schemes\4","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #0",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #2",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #3",0x00010001,0x00ffff00
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #4",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #5",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #6",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #7",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #8",0x00010001,0x0000ffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #10",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #11",0x00010001,0x00ffff00
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #12",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #13",0x00010001,0x00008000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #15",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #16",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #17",0x00010001,0x0200ff00
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #18",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #19",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #20",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #21",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #22",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #23",0x00010001,0x0000ffff
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #24",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #26",0x00010001,0x02800080
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #27",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #28",0x00010001,0x00ffff00
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #29",0x00010001,0x00008000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #30",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","LegacyName",0x00020000,"High Contrast 1"
+; High Contrast 2
+HKCU,"Control Panel\Appearance\New Schemes\5","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #0",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #2",0x00010001,0x00ffff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #3",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #4",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #5",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #6",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #7",0x00010001,0x0000ff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #8",0x00010001,0x0000ff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #9",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #10",0x00010001,0x00ffff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #11",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #12",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #13",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #15",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #16",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #17",0x00010001,0x0200ff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #18",0x00010001,0x0000ff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #19",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #20",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #21",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #22",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #24",0x00010001,0x0000ffff
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #26",0x00010001,0x02800080
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #27",0x00010001,0x00ffff00
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #28",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #29",0x00010001,0x00ff0000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #30",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","LegacyName",0x00020000,"High Contrast 2"
+; High Contrast Black
+HKCU,"Control Panel\Appearance\New Schemes\6","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #0",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #2",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #3",0x00010001,0x00008000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #4",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #5",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #6",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #7",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #8",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #10",0x00010001,0x0200ffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #11",0x00010001,0x02008000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #12",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #13",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #15",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #16",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #17",0x00010001,0x0200ff00
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #18",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #19",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #20",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #21",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #22",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #23",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #24",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #26",0x00010001,0x02800080
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #27",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #28",0x00010001,0x00008000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #29",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #30",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","LegacyName",0x00020000,"High Contrast Black"
+; High Contrast White
+HKCU,"Control Panel\Appearance\New Schemes\7","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #0",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #1",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #2",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #3",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #4",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #10",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #11",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #12",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #13",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #15",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #16",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #17",0x00010001,0x0200ff00
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #19",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #20",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #22",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #26",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #27",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #28",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #29",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #30",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","LegacyName",0x00020000,"High Contrast White"
+; Lilac
+HKCU,"Control Panel\Appearance\New Schemes\8","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #0",0x00010001,0x02d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #2",0x00010001,0x00b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #4",0x00010001,0x00d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #10",0x00010001,0x02d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #11",0x00010001,0x02d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #12",0x00010001,0x02b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #13",0x00010001,0x00b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #15",0x00010001,0x02d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #16",0x00010001,0x02b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #17",0x00010001,0x02b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #19",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #20",0x00010001,0x02ecd5d8
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #22",0x00010001,0x02d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #26",0x00010001,0x02b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #27",0x00010001,0x00cb8fb6
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #28",0x00010001,0x00d0b4b8
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #29",0x00010001,0x00b14e5a
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #30",0x00010001,0x00d9a8ae
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","LegacyName",0x00020000,"Lilac"
+; Maple
+HKCU,"Control Panel\Appearance\New Schemes\9","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #0",0x00010001,0x02d7ecf2
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #2",0x00010001,0x00000080
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #3",0x00010001,0x0046a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #4",0x00010001,0x00aed8e6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #10",0x00010001,0x02aed8e6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #11",0x00010001,0x02aed8e6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #12",0x00010001,0x0246a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #13",0x00010001,0x0046a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #14",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #15",0x00010001,0x02aed8e6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #16",0x00010001,0x0246a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #17",0x00010001,0x0246a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #19",0x00010001,0x00d7ecf2
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #20",0x00010001,0x02d7ecf2
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #22",0x00010001,0x02aed8e6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #25",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #26",0x00010001,0x0246a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #27",0x00010001,0x00389cc0
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #28",0x00010001,0x0088c8e0
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #29",0x00010001,0x0046a6c6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #30",0x00010001,0x00aed8e6
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","LegacyName",0x00020000,"Maple"
+; Marine
+HKCU,"Control Panel\Appearance\New Schemes\10","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #0",0x00010001,0x02d8e0c8
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #1",0x00010001,0x00474e2c
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #2",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #3",0x00010001,0x00889048
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #4",0x00010001,0x00b8c088
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #5",0x00010001,0x02d8e0c8
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #10",0x00010001,0x02b8c088
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #11",0x00010001,0x02b8c088
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #12",0x00010001,0x00848d4b
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #13",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #15",0x00010001,0x02b8c088
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #16",0x00010001,0x02889048
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #17",0x00010001,0x02889048
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #19",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #20",0x00010001,0x02d8e0c8
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #22",0x00010001,0x02b8c088
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #24",0x00010001,0x00d8e0c8
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #26",0x00010001,0x02800000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #27",0x00010001,0x00c0b418
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #28",0x00010001,0x00d8cc78
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #29",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #30",0x00010001,0x00b8c088
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","LegacyName",0x00020000,"Marine"
+; Plum
+HKCU,"Control Panel\Appearance\New Schemes\11","DisplayName",0x00020000,"@themeui.dll,-869"
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #0",0x00010001,0x00c8d0d8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #1",0x00010001,0x00402840
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #2",0x00010001,0x00604048
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #3",0x00010001,0x00586078
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #4",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #5",0x00010001,0x00c8d0d8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #6",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #10",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #11",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #12",0x00010001,0x005a6374
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #13",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #14",0x00010001,0x00c8d0d8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #15",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #16",0x00010001,0x00586078
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #17",0x00010001,0x00586078
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #18",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #19",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #20",0x00010001,0x00c8d0d8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #21",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #22",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #23",0x00010001,0x00580030
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #24",0x00010001,0x00c8ccd5
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #26",0x00010001,0x00604048
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #27",0x00010001,0x00b884a0
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #28",0x00010001,0x007898a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #29",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #30",0x00010001,0x009098a8
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","LegacyName",0x00020000,"Plum"
+; Pumpkin
+HKCU,"Control Panel\Appearance\New Schemes\12","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #0",0x00010001,0x02cfeaf5
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #1",0x00010001,0x00420042
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #2",0x00010001,0x002fa5d7
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #3",0x00010001,0x00a4a0a0
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #4",0x00010001,0x009dd5ec
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #10",0x00010001,0x029dd5ec
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #11",0x00010001,0x029dd5ec
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #12",0x00010001,0x02cfeaf5
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #13",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #15",0x00010001,0x029dd5ec
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #16",0x00010001,0x022fa5d7
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #17",0x00010001,0x022fa5d7
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #19",0x00010001,0x00cfeaf5
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #20",0x00010001,0x02cfeaf5
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #22",0x00010001,0x029dd5ec
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #23",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #26",0x00010001,0x022fa5d7
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #27",0x00010001,0x0088cce0
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #28",0x00010001,0x0090ccd0
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #29",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #30",0x00010001,0x009dd5ec
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","LegacyName",0x00020000,"Pumpkin"
+; Rainy Day
+HKCU,"Control Panel\Appearance\New Schemes\13","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #0",0x00010001,0x02d9ccc1
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #2",0x00010001,0x007d654f
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #4",0x00010001,0x00b19983
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #10",0x00010001,0x02b19983
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #11",0x00010001,0x02b19983
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #12",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #13",0x00010001,0x007d654f
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #15",0x00010001,0x02b19983
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #16",0x00010001,0x027d654f
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #17",0x00010001,0x027d654f
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #19",0x00010001,0x00d9ccc1
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #20",0x00010001,0x02d9ccc1
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #22",0x00010001,0x02b19983
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #26",0x00010001,0x027d654f
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #27",0x00010001,0x00d0b480
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #28",0x00010001,0x00d0bcb0
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #29",0x00010001,0x007d654f
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #30",0x00010001,0x00b19983
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","LegacyName",0x00020000,"Rainy Day"
+; ReactOS Classic
+HKCU,"Control Panel\Appearance\New Schemes\14","DisplayName",0x00020000,"@themeui.dll,-880"
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #0",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #1",0x00010001,0x00a56e3a
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #2",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #4",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #5",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #6",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #10",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #11",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #12",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #13",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #15",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #16",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #17",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #18",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #19",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #20",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #21",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #22",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #24",0x00010001,0x00e1ffff
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #26",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #27",0x00010001,0x00d08410
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #28",0x00010001,0x00b5b5b5
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #29",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #30",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","LegacyName",0x00020000,"ReactOS Classic"
+; Rose
+HKCU,"Control Panel\Appearance\New Schemes\15","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #0",0x00010001,0x02b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #1",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #2",0x00010001,0x0070609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #3",0x00010001,0x00a4a0a0
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #4",0x00010001,0x00b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #10",0x00010001,0x02b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #11",0x00010001,0x02b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #12",0x00010001,0x0270609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #13",0x00010001,0x0070609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #15",0x00010001,0x02b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #16",0x00010001,0x0270609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #17",0x00010001,0x0270609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #19",0x00010001,0x007d7d7d
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #20",0x00010001,0x02dcd8e7
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #22",0x00010001,0x02b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #26",0x00010001,0x0270609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #27",0x00010001,0x00d0ccd8
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #28",0x00010001,0x00d0d4d0
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #29",0x00010001,0x0070609f
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #30",0x00010001,0x00b7afcf
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","LegacyName",0x00020000,"Rose"
+; Sand
+HKCU,"Control Panel\Appearance\New Schemes\16","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #0",0x00010001,0x02dde6ea
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #1",0x00010001,0x02688da2
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #2",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #3",0x00010001,0x00688da2
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #4",0x00010001,0x00bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #10",0x00010001,0x02bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #11",0x00010001,0x02bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #12",0x00010001,0x02688da2
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #13",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #15",0x00010001,0x02bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #16",0x00010001,0x02688da2
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #17",0x00010001,0x02688da2
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #19",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #20",0x00010001,0x02dde6ea
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #22",0x00010001,0x02bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #26",0x00010001,0x02808000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #27",0x00010001,0x00aabd84
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #28",0x00010001,0x0080d0e8
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #29",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #30",0x00010001,0x00bbccd5
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","LegacyName",0x00020000,"Sand"
+; Sky (WinXP-like)
+HKCU,"Control Panel\Appearance\New Schemes\17","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #0",0x00010001,0x00c8d0d4
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #1",0x00010001,0x00984e00
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #2",0x00010001,0x00e35400
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #3",0x00010001,0x00df967a
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #4",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #5",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #6",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #10",0x00010001,0x00c8d0d4
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #11",0x00010001,0x00c8d0d4
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #12",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #13",0x00010001,0x00c56a31
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #15",0x00010001,0x00d8e9ec
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #16",0x00010001,0x0099a8ac
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #17",0x00010001,0x0099a8ac
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #18",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #19",0x00010001,0x00f8e4d8
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #20",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #21",0x00010001,0x00646f71
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #22",0x00010001,0x00e2eff1
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #24",0x00010001,0x00e1ffff
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #25",0x00010001,0x00b5b5b5
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #26",0x00010001,0x00800000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #27",0x00010001,0x00ff953d
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #28",0x00010001,0x00ebb99d
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #29",0x00010001,0x00c56a31
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #30",0x00010001,0x00d8e9ec
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","LegacyName",0x00020000,"Sky"
+; Slate
+HKCU,"Control Panel\Appearance\New Schemes\18","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #0",0x00010001,0x02e3dcce
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #1",0x00010001,0x00414141
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #2",0x00010001,0x00978055
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #4",0x00010001,0x00c8b99d
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #10",0x00010001,0x02c8b99d
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #11",0x00010001,0x02c8b99d
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #12",0x00010001,0x00424242
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #13",0x00010001,0x00978055
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #15",0x00010001,0x02c8b99d
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #16",0x00010001,0x02978055
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #17",0x00010001,0x02978055
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #19",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #20",0x00010001,0x02e3dcce
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #22",0x00010001,0x02c8b99d
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #26",0x00010001,0x02978055
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #27",0x00010001,0x00d8b888
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #28",0x00010001,0x00c8bca0
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #29",0x00010001,0x00978055
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #30",0x00010001,0x00c8b99d
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","LegacyName",0x00020000,"Slate"
+; Storm
+HKCU,"Control Panel\Appearance\New Schemes\19","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #0",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #1",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #2",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #4",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #10",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #11",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #12",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #13",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #15",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #16",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #17",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #19",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #20",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #22",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #23",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #26",0x00010001,0x02800080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #27",0x00010001,0x00b08c38
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #28",0x00010001,0x00a8aca8
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #29",0x00010001,0x00800080
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #30",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","LegacyName",0x00020000,"Storm"
+; Teal
+HKCU,"Control Panel\Appearance\New Schemes\20","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #0",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #1",0x00010001,0x00404000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #2",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #3",0x00010001,0x00808080
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #4",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #10",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #11",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #12",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #13",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #15",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #16",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #17",0x00010001,0x02808080
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #19",0x00010001,0x00f0fbff
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #20",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #22",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #25",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #26",0x00010001,0x02808000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #27",0x00010001,0x00d8cc00
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #28",0x00010001,0x00b8c898
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #29",0x00010001,0x00808000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #30",0x00010001,0x00c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","LegacyName",0x00020000,"Teal"
+; Wheat
+HKCU,"Control Panel\Appearance\New Schemes\21","DisplayName",0x00020000,"@themeui.dll,-851"
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019"
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Flat Menus",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\
+00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,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,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
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #0",0x00010001,0x02d0eeee
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #1",0x00010001,0x021d4000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #2",0x00010001,0x00008080
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #3",0x00010001,0x0041bcbc
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #4",0x00010001,0x00a0dede
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #5",0x00010001,0x02ffffff
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #6",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #7",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #8",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #9",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #10",0x00010001,0x02a0dede
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #11",0x00010001,0x02a0dede
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #12",0x00010001,0x0241bcbc
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #13",0x00010001,0x00008080
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #14",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #15",0x00010001,0x02a0dede
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #16",0x00010001,0x0241bcbc
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #17",0x00010001,0x0241bcbc
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #18",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #19",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #20",0x00010001,0x02d0eeee
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #21",0x00010001,0x02000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #22",0x00010001,0x02a0dede
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #23",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #24",0x00010001,0x00ffffff
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #25",0x00010001,0x02c0c0c0
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #26",0x00010001,0x02008080
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #27",0x00010001,0x0048b0c8
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #28",0x00010001,0x0080b8b8
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #29",0x00010001,0x00008080
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #30",0x00010001,0x00a0dede
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Contrast",0x00010001,0x00000000
+HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","LegacyName",0x00020000,"Wheat"
HKCU,"Environment",,0x00000012
HKCU,"Environment","TEMP",0x00020000,"%USERPROFILE%\Local Settings\Temp"
@@ -474,6 +1512,11 @@ HKCU, "Control Panel\Desktop\WindowMetrics","StatusFont",0x00000001,f5,ff,ff,ff,
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,\
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
+; Accessibility
+HKCU,"Control Panel\Accessibility",,0x00000012
+HKCU,"Control Panel\Accessibility\Keyboard Preference",,0x00000012
+HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0"
+
; Internet Explorer
HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php"
diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff
index 063627d5a8d..eb969c325d4 100644
--- a/reactos/boot/bootdata/packages/reactos.dff
+++ b/reactos/boot/bootdata/packages/reactos.dff
@@ -92,6 +92,7 @@ Signature = "$ReactOS$"
;base\services\tcpsvcs\quotes 5
;base\services\umpnpmgr\umpnpmgr.exe 1
;base\services\wlansvc\wlansvc.exe 1
+base\services\svchost\svchost.exe 1
;base\setup\setup\setup.exe 1
;base\setup\vmwinst\vmwinst.exe 1
@@ -642,7 +643,22 @@ boot\bootdata\bootcdregtest\regtest.cmd 7 optional
;subsystems\ntvdm\ntvdm.exe 1
;subsystems\win32\win32k\win32k.sys 1
-; Modules
+; Optional/proprietary files
+modules\optional\kvmnet.inf 6 optional
+modules\optional\kvmnet.sys 2 optional
+modules\optional\mfc42.dll 1 optional
+modules\optional\mfc42u.dll 1 optional
+modules\optional\msvbvm50.dll 1 optional
+modules\optional\msvbvm60.dll 1 optional
+modules\optional\msvcirt.dll 1 optional
+modules\optional\Systema.ttf 3 optional
+modules\optional\vmx_fb.dll 1 optional
+modules\optional\vmx_mode.dll 1 optional
+modules\optional\vmx_svga.inf 6 optional
+modules\optional\vmx_svga.sys 2 optional
+modules\optional\wine_gecko-0.9.1.cab 4 optional
+
+; Rosapps
modules\rosapps\applications\screensavers\cylfrac\cylfrac.scr 1 optional
modules\rosapps\applications\screensavers\matrix\matrix.scr 1 optional
modules\rosapps\applications\screensavers\blankscr\scrnsave.scr 1 optional
@@ -709,6 +725,7 @@ modules\rosapps\dflat32\edit.exe 1 o
modules\rosapps\drivers\green\green.sys 2 optional
modules\rosapps\templates\dialog\dialog.exe 1 optional
+; Rostests
modules\rostests\rosautotest\rosautotest.exe 1 optional
modules\rostests\tests\pseh2\pseh2_test.exe 7 optional
modules\rostests\winetests\advapi32\advapi32_winetest.exe 7 optional
@@ -764,15 +781,3 @@ modules\rostests\winetests\wlanapi\wlanapi_winetest.exe 7 o
modules\rostests\winetests\ws2_32\ws2_32_winetest.exe 7 optional
modules\wallpaper\Angelus_02_ROSWP.bmp 4 optional
-
-; Native libraries
-modules\windows\mfc42.dll 1 optional
-modules\windows\vmx_fb.dll 1 optional
-modules\windows\vmx_mode.dll 1 optional
-modules\windows\vmx_svga.sys 2 optional
-modules\windows\vmx_svga.inf 6 optional
-modules\windows\kvmnet.sys 2 optional
-modules\windows\kvmnet.inf 6 optional
-
-; Gecko
-modules\windows\wine_gecko-0.9.1.cab 4 optional
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/hardware.c b/reactos/boot/freeldr/freeldr/arch/amd64/hardware.c
deleted file mode 100644
index f3a890d3b14..00000000000
--- a/reactos/boot/freeldr/freeldr/arch/amd64/hardware.c
+++ /dev/null
@@ -1,1893 +0,0 @@
-/*
- * FreeLoader
- *
- * Copyright (C) 2003, 2004 Eric Kohl
- *
- * 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.
- *
- * This 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include
-
-#define NDEBUG
-#include
-
-#define MILLISEC (10)
-#define PRECISION (8)
-
-#define HZ (100)
-#define CLOCK_TICK_RATE (1193182)
-#define LATCH (CLOCK_TICK_RATE / HZ)
-
-
-/* No Mouse */
-#define MOUSE_TYPE_NONE 0
-/* Microsoft Mouse with 2 buttons */
-#define MOUSE_TYPE_MICROSOFT 1
-/* Logitech Mouse with 3 buttons */
-#define MOUSE_TYPE_LOGITECH 2
-/* Microsoft Wheel Mouse (aka Z Mouse) */
-#define MOUSE_TYPE_WHEELZ 3
-/* Mouse Systems Mouse */
-#define MOUSE_TYPE_MOUSESYSTEMS 4
-
-
-/* PS2 stuff */
-
-/* Controller registers. */
-#define CONTROLLER_REGISTER_STATUS 0x64
-#define CONTROLLER_REGISTER_CONTROL 0x64
-#define CONTROLLER_REGISTER_DATA 0x60
-
-/* Controller commands. */
-#define CONTROLLER_COMMAND_READ_MODE 0x20
-#define CONTROLLER_COMMAND_WRITE_MODE 0x60
-#define CONTROLLER_COMMAND_GET_VERSION 0xA1
-#define CONTROLLER_COMMAND_MOUSE_DISABLE 0xA7
-#define CONTROLLER_COMMAND_MOUSE_ENABLE 0xA8
-#define CONTROLLER_COMMAND_TEST_MOUSE 0xA9
-#define CONTROLLER_COMMAND_SELF_TEST 0xAA
-#define CONTROLLER_COMMAND_KEYBOARD_TEST 0xAB
-#define CONTROLLER_COMMAND_KEYBOARD_DISABLE 0xAD
-#define CONTROLLER_COMMAND_KEYBOARD_ENABLE 0xAE
-#define CONTROLLER_COMMAND_WRITE_MOUSE_OUTPUT_BUFFER 0xD3
-#define CONTROLLER_COMMAND_WRITE_MOUSE 0xD4
-
-/* Controller status */
-#define CONTROLLER_STATUS_OUTPUT_BUFFER_FULL 0x01
-#define CONTROLLER_STATUS_INPUT_BUFFER_FULL 0x02
-#define CONTROLLER_STATUS_SELF_TEST 0x04
-#define CONTROLLER_STATUS_COMMAND 0x08
-#define CONTROLLER_STATUS_UNLOCKED 0x10
-#define CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL 0x20
-#define CONTROLLER_STATUS_GENERAL_TIMEOUT 0x40
-#define CONTROLLER_STATUS_PARITY_ERROR 0x80
-#define AUX_STATUS_OUTPUT_BUFFER_FULL (CONTROLLER_STATUS_OUTPUT_BUFFER_FULL | \
- CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL)
-
-/* Timeout in ms for sending to keyboard controller. */
-#define CONTROLLER_TIMEOUT 250
-
-static CHAR Hex[] = "0123456789abcdef";
-static unsigned int delay_count = 1;
-
-extern ULONG reactos_disk_count;
-extern ARC_DISK_SIGNATURE reactos_arc_disk_info[];
-extern char reactos_arc_strings[32][256];
-
-/* FUNCTIONS ****************************************************************/
-
-
-static VOID
-__StallExecutionProcessor(ULONG Loops)
-{
- volatile register unsigned int i;
- for (i = 0; i < Loops; i++);
-}
-
-
-VOID StallExecutionProcessor(ULONG Microseconds)
-{
- ULONGLONG LoopCount = ((ULONGLONG)delay_count * (ULONGLONG)Microseconds) / 1000ULL;
- __StallExecutionProcessor((ULONG)LoopCount);
-}
-
-
-static ULONG
-Read8254Timer(VOID)
-{
- ULONG Count;
-
- WRITE_PORT_UCHAR((PUCHAR)0x43, 0x00);
- Count = READ_PORT_UCHAR((PUCHAR)0x40);
- Count |= READ_PORT_UCHAR((PUCHAR)0x40) << 8;
-
- return Count;
-}
-
-
-static VOID
-WaitFor8254Wraparound(VOID)
-{
- ULONG CurCount;
- ULONG PrevCount = ~0;
- LONG Delta;
-
- CurCount = Read8254Timer();
-
- do
- {
- PrevCount = CurCount;
- CurCount = Read8254Timer();
- Delta = CurCount - PrevCount;
-
- /*
- * This limit for delta seems arbitrary, but it isn't, it's
- * slightly above the level of error a buggy Mercury/Neptune
- * chipset timer can cause.
- */
- }
- while (Delta < 300);
-}
-
-
-VOID
-HalpCalibrateStallExecution(VOID)
-{
- ULONG i;
- ULONG calib_bit;
- ULONG CurCount;
-
- /* Initialise timer interrupt with MILLISECOND ms interval */
- WRITE_PORT_UCHAR((PUCHAR)0x43, 0x34); /* binary, mode 2, LSB/MSB, ch 0 */
- WRITE_PORT_UCHAR((PUCHAR)0x40, LATCH & 0xff); /* LSB */
- WRITE_PORT_UCHAR((PUCHAR)0x40, LATCH >> 8); /* MSB */
-
- /* Stage 1: Coarse calibration */
-
- WaitFor8254Wraparound();
-
- delay_count = 1;
-
- do {
- delay_count <<= 1; /* Next delay count to try */
-
- WaitFor8254Wraparound();
-
- __StallExecutionProcessor(delay_count); /* Do the delay */
-
- CurCount = Read8254Timer();
- } while (CurCount > LATCH / 2);
-
- delay_count >>= 1; /* Get bottom value for delay */
-
- /* Stage 2: Fine calibration */
-
- calib_bit = delay_count; /* Which bit are we going to test */
-
- for(i=0;i>= 1; /* Next bit to calibrate */
- if(!calib_bit) break; /* If we have done all bits, stop */
-
- delay_count |= calib_bit; /* Set the bit in delay_count */
-
- WaitFor8254Wraparound();
-
- __StallExecutionProcessor(delay_count); /* Do the delay */
-
- CurCount = Read8254Timer();
- if (CurCount <= LATCH / 2) /* If a tick has passed, turn the */
- delay_count &= ~calib_bit; /* calibrated bit back off */
- }
-
- /* We're finished: Do the finishing touches */
- delay_count /= (MILLISEC / 2); /* Calculate delay_count for 1ms */
-}
-
-static VOID
-DetectPnpBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
-{
- PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
- PCM_PNP_BIOS_DEVICE_NODE DeviceNode;
- PCM_PNP_BIOS_INSTALLATION_CHECK InstData;
- PCONFIGURATION_COMPONENT_DATA BusKey;
- ULONG x;
- ULONG NodeSize = 0;
- ULONG NodeCount = 0;
- UCHAR NodeNumber;
- ULONG FoundNodeCount;
- int i;
- ULONG PnpBufferSize;
- ULONG Size;
- char *Ptr;
-
- InstData = (PCM_PNP_BIOS_INSTALLATION_CHECK)PnpBiosSupported();
- if (InstData == NULL || strncmp((CHAR*)InstData->Signature, "$PnP", 4))
- {
- DbgPrint((DPRINT_HWDETECT, "PnP-BIOS not supported\n"));
- return;
- }
- DbgPrint((DPRINT_HWDETECT, "Signature '%c%c%c%c'\n",
- InstData->Signature[0], InstData->Signature[1],
- InstData->Signature[2], InstData->Signature[3]));
-
-
- x = PnpBiosGetDeviceNodeCount(&NodeSize, &NodeCount);
- NodeCount &= 0xFF; // needed since some fscked up BIOSes return
- // wrong info (e.g. Mac Virtual PC)
- // e.g. look: http://my.execpc.com/~geezer/osd/pnp/pnp16.c
- if (x != 0 || NodeSize == 0 || NodeCount == 0)
- {
- DbgPrint((DPRINT_HWDETECT, "PnP-BIOS failed to enumerate device nodes\n"));
- return;
- }
- DbgPrint((DPRINT_HWDETECT, "PnP-BIOS supported\n"));
- DbgPrint((DPRINT_HWDETECT, "MaxNodeSize %u NodeCount %u\n", NodeSize, NodeCount));
- DbgPrint((DPRINT_HWDETECT, "Estimated buffer size %u\n", NodeSize * NodeCount));
-
- /* Create component key */
- FldrCreateComponentKey(SystemKey,
- L"MultifunctionAdapter",
- *BusNumber,
- AdapterClass,
- MultiFunctionAdapter,
- &BusKey);
- (*BusNumber)++;
-
- /* Set the component information */
- FldrSetComponentInformation(BusKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
- /* Set the identifier */
- FldrSetIdentifier(BusKey, "PNP BIOS");
-
- /* Set 'Configuration Data' value */
- Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + (NodeSize * NodeCount);
- PartialResourceList = MmHeapAlloc(Size);
- if (PartialResourceList == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- return;
- }
- memset(PartialResourceList, 0, Size);
-
- /* Initialize resource descriptor */
- PartialResourceList->Version = 1;
- PartialResourceList->Revision = 1;
- PartialResourceList->Count = 1;
- PartialResourceList->PartialDescriptors[0].Type =
- CmResourceTypeDeviceSpecific;
- PartialResourceList->PartialDescriptors[0].ShareDisposition =
- CmResourceShareUndetermined;
-
- Ptr = (char *)(((ULONG_PTR)&PartialResourceList->PartialDescriptors[0]) +
- sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
-
- /* Set instalation check data */
- memcpy (Ptr, InstData, sizeof(CM_PNP_BIOS_INSTALLATION_CHECK));
- Ptr += sizeof(CM_PNP_BIOS_INSTALLATION_CHECK);
-
- /* Copy device nodes */
- FoundNodeCount = 0;
- PnpBufferSize = sizeof(CM_PNP_BIOS_INSTALLATION_CHECK);
- for (i = 0; i < 0xFF; i++)
- {
- NodeNumber = (UCHAR)i;
-
- x = PnpBiosGetDeviceNode(&NodeNumber, (PVOID)DISKREADBUFFER);
- if (x == 0)
- {
- DeviceNode = (PCM_PNP_BIOS_DEVICE_NODE)DISKREADBUFFER;
-
- DbgPrint((DPRINT_HWDETECT,
- "Node: %u Size %u (0x%x)\n",
- DeviceNode->Node,
- DeviceNode->Size,
- DeviceNode->Size));
-
- memcpy (Ptr,
- DeviceNode,
- DeviceNode->Size);
-
- Ptr += DeviceNode->Size;
- PnpBufferSize += DeviceNode->Size;
-
- FoundNodeCount++;
- if (FoundNodeCount >= NodeCount)
- break;
- }
- }
-
- /* Set real data size */
- PartialResourceList->PartialDescriptors[0].u.DeviceSpecificData.DataSize =
- PnpBufferSize;
- Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + PnpBufferSize;
-
- DbgPrint((DPRINT_HWDETECT, "Real buffer size: %u\n", PnpBufferSize));
- DbgPrint((DPRINT_HWDETECT, "Resource size: %u\n", Size));
-
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
-}
-
-
-
-static VOID
-SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey,
- ULONG DriveNumber)
-{
- PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
- PCM_DISK_GEOMETRY_DEVICE_DATA DiskGeometry;
- EXTENDED_GEOMETRY ExtGeometry;
- GEOMETRY Geometry;
- ULONG Size;
-
- /* Set 'Configuration Data' value */
- Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
- sizeof(CM_DISK_GEOMETRY_DEVICE_DATA);
- PartialResourceList = MmHeapAlloc(Size);
- if (PartialResourceList == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate a full resource descriptor\n"));
- return;
- }
-
- memset(PartialResourceList, 0, Size);
- PartialResourceList->Version = 1;
- PartialResourceList->Revision = 1;
- PartialResourceList->Count = 1;
- PartialResourceList->PartialDescriptors[0].Type =
- CmResourceTypeDeviceSpecific;
-// PartialResourceList->PartialDescriptors[0].ShareDisposition =
-// PartialResourceList->PartialDescriptors[0].Flags =
- PartialResourceList->PartialDescriptors[0].u.DeviceSpecificData.DataSize =
- sizeof(CM_DISK_GEOMETRY_DEVICE_DATA);
-
- /* Get pointer to geometry data */
- DiskGeometry = (PVOID)(((ULONG_PTR)PartialResourceList) + sizeof(CM_PARTIAL_RESOURCE_LIST));
-
- /* Get the disk geometry */
- ExtGeometry.Size = sizeof(EXTENDED_GEOMETRY);
- if (DiskGetExtendedDriveParameters(DriveNumber, &ExtGeometry, ExtGeometry.Size))
- {
- DiskGeometry->BytesPerSector = ExtGeometry.BytesPerSector;
- DiskGeometry->NumberOfCylinders = ExtGeometry.Cylinders;
- DiskGeometry->SectorsPerTrack = ExtGeometry.SectorsPerTrack;
- DiskGeometry->NumberOfHeads = ExtGeometry.Heads;
- }
- else if(MachDiskGetDriveGeometry(DriveNumber, &Geometry))
- {
- DiskGeometry->BytesPerSector = Geometry.BytesPerSector;
- DiskGeometry->NumberOfCylinders = Geometry.Cylinders;
- DiskGeometry->SectorsPerTrack = Geometry.Sectors;
- DiskGeometry->NumberOfHeads = Geometry.Heads;
- }
- else
- {
- DbgPrint((DPRINT_HWDETECT, "Reading disk geometry failed\n"));
- MmHeapFree(PartialResourceList);
- return;
- }
- DbgPrint((DPRINT_HWDETECT,
- "Disk %x: %u Cylinders %u Heads %u Sectors %u Bytes\n",
- DriveNumber,
- DiskGeometry->NumberOfCylinders,
- DiskGeometry->NumberOfHeads,
- DiskGeometry->SectorsPerTrack,
- DiskGeometry->BytesPerSector));
-
- FldrSetConfigurationData(DiskKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
-}
-
-
-static VOID
-SetHarddiskIdentifier(PCONFIGURATION_COMPONENT_DATA DiskKey,
- ULONG DriveNumber)
-{
- PMASTER_BOOT_RECORD Mbr;
- ULONG *Buffer;
- ULONG i;
- ULONG Checksum;
- ULONG Signature;
- CHAR Identifier[20];
- CHAR ArcName[256];
-
- /* Read the MBR */
- if (!MachDiskReadLogicalSectors(DriveNumber, 0ULL, 1, (PVOID)DISKREADBUFFER))
- {
- DbgPrint((DPRINT_HWDETECT, "Reading MBR failed\n"));
- return;
- }
-
- Buffer = (ULONG*)DISKREADBUFFER;
- Mbr = (PMASTER_BOOT_RECORD)DISKREADBUFFER;
-
- Signature = Mbr->Signature;
- DbgPrint((DPRINT_HWDETECT, "Signature: %x\n", Signature));
-
- /* Calculate the MBR checksum */
- Checksum = 0;
- for (i = 0; i < 128; i++)
- {
- Checksum += Buffer[i];
- }
- Checksum = ~Checksum + 1;
- DbgPrint((DPRINT_HWDETECT, "Checksum: %x\n", Checksum));
-
- /* Fill out the ARC disk block */
- reactos_arc_disk_info[reactos_disk_count].Signature = Signature;
- reactos_arc_disk_info[reactos_disk_count].CheckSum = Checksum;
- sprintf(ArcName, "multi(0)disk(0)rdisk(%lu)", reactos_disk_count);
- strcpy(reactos_arc_strings[reactos_disk_count], ArcName);
- reactos_arc_disk_info[reactos_disk_count].ArcName =
- reactos_arc_strings[reactos_disk_count];
- reactos_disk_count++;
-
- /* Convert checksum and signature to identifier string */
- Identifier[0] = Hex[(Checksum >> 28) & 0x0F];
- Identifier[1] = Hex[(Checksum >> 24) & 0x0F];
- Identifier[2] = Hex[(Checksum >> 20) & 0x0F];
- Identifier[3] = Hex[(Checksum >> 16) & 0x0F];
- Identifier[4] = Hex[(Checksum >> 12) & 0x0F];
- Identifier[5] = Hex[(Checksum >> 8) & 0x0F];
- Identifier[6] = Hex[(Checksum >> 4) & 0x0F];
- Identifier[7] = Hex[Checksum & 0x0F];
- Identifier[8] = '-';
- Identifier[9] = Hex[(Signature >> 28) & 0x0F];
- Identifier[10] = Hex[(Signature >> 24) & 0x0F];
- Identifier[11] = Hex[(Signature >> 20) & 0x0F];
- Identifier[12] = Hex[(Signature >> 16) & 0x0F];
- Identifier[13] = Hex[(Signature >> 12) & 0x0F];
- Identifier[14] = Hex[(Signature >> 8) & 0x0F];
- Identifier[15] = Hex[(Signature >> 4) & 0x0F];
- Identifier[16] = Hex[Signature & 0x0F];
- Identifier[17] = '-';
- Identifier[18] = 'A';
- Identifier[19] = 0;
- DbgPrint((DPRINT_HWDETECT, "Identifier: %s\n", Identifier));
-
- /* Set identifier */
- FldrSetIdentifier(DiskKey, Identifier);
-}
-
-static ULONG
-GetFloppyCount(VOID)
-{
- UCHAR Data;
-
- WRITE_PORT_UCHAR((PUCHAR)0x70, 0x10);
- Data = READ_PORT_UCHAR((PUCHAR)0x71);
-
- return ((Data & 0xF0) ? 1 : 0) + ((Data & 0x0F) ? 1 : 0);
-}
-
-
-static UCHAR
-GetFloppyType(UCHAR DriveNumber)
-{
- UCHAR Data;
-
- WRITE_PORT_UCHAR((PUCHAR)0x70, 0x10);
- Data = READ_PORT_UCHAR((PUCHAR)0x71);
-
- if (DriveNumber == 0)
- return Data >> 4;
- else if (DriveNumber == 1)
- return Data & 0x0F;
-
- return 0;
-}
-
-
-static PVOID
-GetInt1eTable(VOID)
-{
- PUSHORT SegPtr = (PUSHORT)0x7A;
- PUSHORT OfsPtr = (PUSHORT)0x78;
-
- return (PVOID)((ULONG_PTR)(((ULONG)(*SegPtr)) << 4) + (ULONG)(*OfsPtr));
-}
-
-
-static VOID
-DetectBiosFloppyPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey)
-{
- PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
- PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
- PCM_FLOPPY_DEVICE_DATA FloppyData;
- CHAR Identifier[20];
- PCONFIGURATION_COMPONENT_DATA PeripheralKey;
- ULONG Size;
- ULONG FloppyNumber;
- UCHAR FloppyType;
- ULONG MaxDensity[6] = {0, 360, 1200, 720, 1440, 2880};
- PUCHAR Ptr;
-
- for (FloppyNumber = 0; FloppyNumber < 2; FloppyNumber++)
- {
- FloppyType = GetFloppyType(FloppyNumber);
-
- if ((FloppyType > 5) || (FloppyType == 0))
- continue;
-
- DiskResetController(FloppyNumber);
-
- Ptr = GetInt1eTable();
-
- FldrCreateComponentKey(ControllerKey,
- L"FloppyDiskPeripheral",
- FloppyNumber,
- PeripheralClass,
- FloppyDiskPeripheral,
- &PeripheralKey);
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(PeripheralKey,
- Input | Output,
- FloppyNumber,
- 0xFFFFFFFF);
-
- Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
- sizeof(CM_FLOPPY_DEVICE_DATA);
- PartialResourceList = MmHeapAlloc(Size);
- if (PartialResourceList == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- return;
- }
-
- memset(PartialResourceList, 0, Size);
- PartialResourceList->Version = 1;
- PartialResourceList->Revision = 1;
- PartialResourceList->Count = 1;
-
- PartialDescriptor = &PartialResourceList->PartialDescriptors[0];
- PartialDescriptor->Type = CmResourceTypeDeviceSpecific;
- PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
- PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(CM_FLOPPY_DEVICE_DATA);
-
- FloppyData = (PVOID)(((ULONG_PTR)PartialResourceList) + sizeof(CM_PARTIAL_RESOURCE_LIST));
- FloppyData->Version = 2;
- FloppyData->Revision = 0;
- FloppyData->MaxDensity = MaxDensity[FloppyType];
- FloppyData->MountDensity = 0;
- RtlCopyMemory(&FloppyData->StepRateHeadUnloadTime,
- Ptr,
- 11);
- FloppyData->MaximumTrackValue = (FloppyType == 1) ? 39 : 79;
- FloppyData->DataTransferRate = 0;
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(PeripheralKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
-
- /* Set 'Identifier' value */
- sprintf(Identifier, "FLOPPY%ld", FloppyNumber + 1);
- FldrSetIdentifier(PeripheralKey, Identifier);
- }
-}
-
-
-static VOID
-DetectBiosFloppyController(PCONFIGURATION_COMPONENT_DATA BusKey,
- PCONFIGURATION_COMPONENT_DATA ControllerKey)
-{
- PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
- PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
- ULONG Size;
- ULONG FloppyCount;
-
- FloppyCount = GetFloppyCount();
- DbgPrint((DPRINT_HWDETECT,
- "Floppy count: %u\n",
- FloppyCount));
-
- Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
- 2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
- PartialResourceList = MmHeapAlloc(Size);
- if (PartialResourceList == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- return;
- }
- memset(PartialResourceList, 0, Size);
-
- /* Initialize resource descriptor */
- PartialResourceList->Version = 1;
- PartialResourceList->Revision = 1;
- PartialResourceList->Count = 3;
-
- /* Set IO Port */
- PartialDescriptor = &PartialResourceList->PartialDescriptors[0];
- PartialDescriptor->Type = CmResourceTypePort;
- PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
- PartialDescriptor->Flags = CM_RESOURCE_PORT_IO;
- PartialDescriptor->u.Port.Start.LowPart = 0x03F0;
- PartialDescriptor->u.Port.Start.HighPart = 0x0;
- PartialDescriptor->u.Port.Length = 8;
-
- /* Set Interrupt */
- PartialDescriptor = &PartialResourceList->PartialDescriptors[1];
- PartialDescriptor->Type = CmResourceTypeInterrupt;
- PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
- PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED;
- PartialDescriptor->u.Interrupt.Level = 6;
- PartialDescriptor->u.Interrupt.Vector = 6;
- PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
-
- /* Set DMA channel */
- PartialDescriptor = &PartialResourceList->PartialDescriptors[2];
- PartialDescriptor->Type = CmResourceTypeDma;
- PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
- PartialDescriptor->Flags = 0;
- PartialDescriptor->u.Dma.Channel = 2;
- PartialDescriptor->u.Dma.Port = 0;
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
-
- if (FloppyCount) DetectBiosFloppyPeripheral(ControllerKey);
-}
-
-static VOID
-DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey,
- PCONFIGURATION_COMPONENT_DATA BusKey)
-{
- PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
- PCM_INT13_DRIVE_PARAMETER Int13Drives;
- GEOMETRY Geometry;
- PCONFIGURATION_COMPONENT_DATA DiskKey, ControllerKey;
- ULONG DiskCount;
- ULONG Size;
- ULONG i;
- BOOLEAN Changed;
-
- /* Count the number of visible drives */
- DiskReportError(FALSE);
- DiskCount = 0;
-
- /* There are some really broken BIOSes out there. There are even BIOSes
- * that happily report success when you ask them to read from non-existent
- * harddisks. So, we set the buffer to known contents first, then try to
- * read. If the BIOS reports success but the buffer contents haven't
- * changed then we fail anyway */
- memset((PVOID) DISKREADBUFFER, 0xcd, 512);
- while (MachDiskReadLogicalSectors(0x80 + DiskCount, 0ULL, 1, (PVOID)DISKREADBUFFER))
- {
- Changed = FALSE;
- for (i = 0; ! Changed && i < 512; i++)
- {
- Changed = ((PUCHAR)DISKREADBUFFER)[i] != 0xcd;
- }
- if (! Changed)
- {
- DbgPrint((DPRINT_HWDETECT, "BIOS reports success for disk %d but data didn't change\n",
- (int)DiskCount));
- break;
- }
- DiskCount++;
- memset((PVOID) DISKREADBUFFER, 0xcd, 512);
- }
- DiskReportError(TRUE);
- DbgPrint((DPRINT_HWDETECT, "BIOS reports %d harddisk%s\n",
- (int)DiskCount, (DiskCount == 1) ? "": "s"));
-
- FldrCreateComponentKey(BusKey,
- L"DiskController",
- 0,
- ControllerClass,
- DiskController,
- &ControllerKey);
- DbgPrint((DPRINT_HWDETECT, "Created key: DiskController\\0\n"));
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- Output | Input | Removable,
- 0,
- 0xFFFFFFFF);
-
- DetectBiosFloppyController(BusKey, ControllerKey);
-
- /* Allocate resource descriptor */
- Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
- sizeof(CM_INT13_DRIVE_PARAMETER) * DiskCount;
- PartialResourceList = MmHeapAlloc(Size);
- if (PartialResourceList == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- return;
- }
-
- /* Initialize resource descriptor */
- memset(PartialResourceList, 0, Size);
- PartialResourceList->Version = 1;
- PartialResourceList->Revision = 1;
- PartialResourceList->Count = 1;
- PartialResourceList->PartialDescriptors[0].Type = CmResourceTypeDeviceSpecific;
- PartialResourceList->PartialDescriptors[0].ShareDisposition = 0;
- PartialResourceList->PartialDescriptors[0].Flags = 0;
- PartialResourceList->PartialDescriptors[0].u.DeviceSpecificData.DataSize =
- sizeof(CM_INT13_DRIVE_PARAMETER) * DiskCount;
-
- /* Get harddisk Int13 geometry data */
- Int13Drives = (PVOID)(((ULONG_PTR)PartialResourceList) + sizeof(CM_PARTIAL_RESOURCE_LIST));
- for (i = 0; i < DiskCount; i++)
- {
- if (MachDiskGetDriveGeometry(0x80 + i, &Geometry))
- {
- Int13Drives[i].DriveSelect = 0x80 + i;
- Int13Drives[i].MaxCylinders = Geometry.Cylinders - 1;
- Int13Drives[i].SectorsPerTrack = Geometry.Sectors;
- Int13Drives[i].MaxHeads = Geometry.Heads - 1;
- Int13Drives[i].NumberDrives = DiskCount;
-
- DbgPrint((DPRINT_HWDETECT,
- "Disk %x: %u Cylinders %u Heads %u Sectors %u Bytes\n",
- 0x80 + i,
- Geometry.Cylinders - 1,
- Geometry.Heads -1,
- Geometry.Sectors,
- Geometry.BytesPerSector));
- }
- }
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(SystemKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
-
- /* Create and fill subkey for each harddisk */
- for (i = 0; i < DiskCount; i++)
- {
- /* Create disk key */
- FldrCreateComponentKey(ControllerKey,
- L"DiskPeripheral",
- i,
- PeripheralClass,
- DiskPeripheral,
- &DiskKey);
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(DiskKey,
- Output | Input,
- 0,
- 0xFFFFFFFF);
-
- /* Set disk values */
- SetHarddiskConfigurationData(DiskKey, 0x80 + i);
- SetHarddiskIdentifier(DiskKey, 0x80 + i);
- }
-}
-
-static VOID
-InitializeSerialPort(ULONG Port,
- ULONG LineControl)
-{
- WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 3, 0x80); /* set DLAB on */
- WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port, 0x60); /* speed LO byte */
- WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 1, 0); /* speed HI byte */
- WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 3, LineControl);
- WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 1, 0); /* set comm and DLAB to 0 */
- WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 4, 0x09); /* DR int enable */
- READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 5); /* clear error bits */
-}
-
-
-static ULONG
-DetectSerialMouse(ULONG Port)
-{
- CHAR Buffer[4];
- ULONG i;
- ULONG TimeOut;
- UCHAR LineControl;
-
- /* Shutdown mouse or something like that */
- LineControl = READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 4);
- WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 4, (LineControl & ~0x02) | 0x01);
- StallExecutionProcessor(100000);
-
- /*
- * Clear buffer
- * Maybe there is no serial port although BIOS reported one (this
- * is the case on Apple hardware), or the serial port is misbehaving,
- * therefore we must give up after some time.
- */
- TimeOut = 200;
- while (READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 5) & 0x01)
- {
- if (--TimeOut == 0)
- return MOUSE_TYPE_NONE;
- READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port);
- }
-
- /*
- * Send modem control with 'Data Terminal Ready', 'Request To Send' and
- * 'Output Line 2' message. This enables mouse to identify.
- */
- WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 4, 0x0b);
-
- /* Wait 10 milliseconds for the mouse getting ready */
- StallExecutionProcessor(10000);
-
- /* Read first four bytes, which contains Microsoft Mouse signs */
- TimeOut = 200;
- for (i = 0; i < 4; i++)
- {
- while (((READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 5) & 1) == 0) && (TimeOut > 0))
- {
- StallExecutionProcessor(1000);
- --TimeOut;
- if (TimeOut == 0)
- return MOUSE_TYPE_NONE;
- }
- Buffer[i] = READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port);
- }
-
- DbgPrint((DPRINT_HWDETECT,
- "Mouse data: %x %x %x %x\n",
- Buffer[0],Buffer[1],Buffer[2],Buffer[3]));
-
- /* Check that four bytes for signs */
- for (i = 0; i < 4; ++i)
- {
- if (Buffer[i] == 'B')
- {
- /* Sign for Microsoft Ballpoint */
-// DbgPrint("Microsoft Ballpoint device detected\n");
-// DbgPrint("THIS DEVICE IS NOT SUPPORTED, YET\n");
- return MOUSE_TYPE_NONE;
- }
- else if (Buffer[i] == 'M')
- {
- /* Sign for Microsoft Mouse protocol followed by button specifier */
- if (i == 3)
- {
- /* Overflow Error */
- return MOUSE_TYPE_NONE;
- }
-
- switch (Buffer[i + 1])
- {
- case '3':
- DbgPrint((DPRINT_HWDETECT,
- "Microsoft Mouse with 3-buttons detected\n"));
- return MOUSE_TYPE_LOGITECH;
-
- case 'Z':
- DbgPrint((DPRINT_HWDETECT,
- "Microsoft Wheel Mouse detected\n"));
- return MOUSE_TYPE_WHEELZ;
-
- /* case '2': */
- default:
- DbgPrint((DPRINT_HWDETECT,
- "Microsoft Mouse with 2-buttons detected\n"));
- return MOUSE_TYPE_MICROSOFT;
- }
- }
- }
-
- return MOUSE_TYPE_NONE;
-}
-
-
-static ULONG
-GetSerialMousePnpId(ULONG Port, char *Buffer)
-{
- ULONG TimeOut;
- ULONG i = 0;
- char c;
- char x;
-
- WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 4, 0x09);
-
- /* Wait 10 milliseconds for the mouse getting ready */
- StallExecutionProcessor(10000);
-
- WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 4, 0x0b);
-
- StallExecutionProcessor(10000);
-
- for (;;)
- {
- TimeOut = 200;
- while (((READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 5) & 1) == 0) && (TimeOut > 0))
- {
- StallExecutionProcessor(1000);
- --TimeOut;
- if (TimeOut == 0)
- {
- return 0;
- }
- }
-
- c = READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port);
- if (c == 0x08 || c == 0x28)
- break;
- }
-
- Buffer[i++] = c;
- x = c + 1;
-
- for (;;)
- {
- TimeOut = 200;
- while (((READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 5) & 1) == 0) && (TimeOut > 0))
- {
- StallExecutionProcessor(1000);
- --TimeOut;
- if (TimeOut == 0)
- return 0;
- }
- c = READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port);
- Buffer[i++] = c;
- if (c == x)
- break;
- if (i >= 256)
- break;
- }
-
- return i;
-}
-
-
-static VOID
-DetectSerialPointerPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey,
- ULONG Base)
-{
- CM_PARTIAL_RESOURCE_LIST PartialResourceList;
- char Buffer[256];
- CHAR Identifier[256];
- PCONFIGURATION_COMPONENT_DATA PeripheralKey;
- ULONG MouseType;
- ULONG Length;
- ULONG i;
- ULONG j;
- ULONG k;
-
- DbgPrint((DPRINT_HWDETECT,
- "DetectSerialPointerPeripheral()\n"));
-
- Identifier[0] = 0;
-
- InitializeSerialPort(Base, 2);
- MouseType = DetectSerialMouse(Base);
-
- if (MouseType != MOUSE_TYPE_NONE)
- {
- Length = GetSerialMousePnpId(Base, Buffer);
- DbgPrint((DPRINT_HWDETECT,
- "PnP ID length: %u\n",
- Length));
-
- if (Length != 0)
- {
- /* Convert PnP sting to ASCII */
- if (Buffer[0] == 0x08)
- {
- for (i = 0; i < Length; i++)
- Buffer[i] += 0x20;
- }
- Buffer[Length] = 0;
-
- DbgPrint((DPRINT_HWDETECT,
- "PnP ID string: %s\n",
- Buffer));
-
- /* Copy PnpId string */
- for (i = 0; i < 7; i++)
- {
- Identifier[i] = Buffer[3+i];
- }
- memcpy(&Identifier[7],
- L" - ",
- 3 * sizeof(WCHAR));
-
- /* Skip device serial number */
- i = 10;
- if (Buffer[i] == '\\')
- {
- for (j = ++i; i < Length; ++i)
- {
- if (Buffer[i] == '\\')
- break;
- }
- if (i >= Length)
- i -= 3;
- }
-
- /* Skip PnP class */
- if (Buffer[i] == '\\')
- {
- for (j = ++i; i < Length; ++i)
- {
- if (Buffer[i] == '\\')
- break;
- }
-
- if (i >= Length)
- i -= 3;
- }
-
- /* Skip compatible PnP Id */
- if (Buffer[i] == '\\')
- {
- for (j = ++i; i < Length; ++i)
- {
- if (Buffer[i] == '\\')
- break;
- }
- if (Buffer[j] == '*')
- ++j;
- if (i >= Length)
- i -= 3;
- }
-
- /* Get product description */
- if (Buffer[i] == '\\')
- {
- for (j = ++i; i < Length; ++i)
- {
- if (Buffer[i] == ';')
- break;
- }
- if (i >= Length)
- i -= 3;
- if (i > j + 1)
- {
- for (k = 0; k < i - j; k++)
- {
- Identifier[k + 10] = Buffer[k + j];
- }
- Identifier[10 + (i-j)] = 0;
- }
- }
-
- DbgPrint((DPRINT_HWDETECT,
- "Identifier string: %s\n",
- Identifier));
- }
-
- if (Length == 0 || strlen(Identifier) < 11)
- {
- switch (MouseType)
- {
- case MOUSE_TYPE_LOGITECH:
- strcpy (Identifier,
- "LOGITECH SERIAL MOUSE");
- break;
-
- case MOUSE_TYPE_WHEELZ:
- strcpy (Identifier,
- "MICROSOFT SERIAL MOUSE WITH WHEEL");
- break;
-
- case MOUSE_TYPE_MICROSOFT:
- default:
- strcpy (Identifier,
- "MICROSOFT SERIAL MOUSE");
- break;
- }
- }
-
- /* Create 'PointerPeripheral' key */
- FldrCreateComponentKey(ControllerKey,
- L"PointerPeripheral",
- 0,
- PeripheralClass,
- PointerPeripheral,
- &PeripheralKey);
- DbgPrint((DPRINT_HWDETECT,
- "Created key: PointerPeripheral\\0\n"));
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(PeripheralKey,
- Input,
- 0,
- 0xFFFFFFFF);
-
- /* Set 'Configuration Data' value */
- memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
- PartialResourceList.Version = 1;
- PartialResourceList.Revision = 1;
- PartialResourceList.Count = 0;
-
- FldrSetConfigurationData(PeripheralKey,
- &PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST) -
- sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(PeripheralKey, Identifier);
- }
-}
-
-
-static VOID
-DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey)
-{
- PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
- PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
- PCM_SERIAL_DEVICE_DATA SerialDeviceData;
- ULONG Irq[4] = {4, 3, 4, 3};
- ULONG Base;
- CHAR Buffer[80];
- PUSHORT BasePtr;
- ULONG ControllerNumber = 0;
- PCONFIGURATION_COMPONENT_DATA ControllerKey;
- ULONG i;
- ULONG Size;
-
- DbgPrint((DPRINT_HWDETECT, "DetectSerialPorts()\n"));
-
- ControllerNumber = 0;
- BasePtr = (PUSHORT)0x400;
- for (i = 0; i < 4; i++, BasePtr++)
- {
- Base = (ULONG)*BasePtr;
- if (Base == 0)
- continue;
-
- DbgPrint((DPRINT_HWDETECT,
- "Found COM%u port at 0x%x\n",
- i + 1,
- Base));
-
- /* Create controller key */
- FldrCreateComponentKey(BusKey,
- L"SerialController",
- ControllerNumber,
- ControllerClass,
- SerialController,
- &ControllerKey);
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- Output | Input | ConsoleIn | ConsoleOut,
- ControllerNumber,
- 0xFFFFFFFF);
-
- /* Build full device descriptor */
- Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
- 2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) +
- sizeof(CM_SERIAL_DEVICE_DATA);
- PartialResourceList = MmHeapAlloc(Size);
- if (PartialResourceList == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- continue;
- }
- memset(PartialResourceList, 0, Size);
-
- /* Initialize resource descriptor */
- PartialResourceList->Version = 1;
- PartialResourceList->Revision = 1;
- PartialResourceList->Count = 3;
-
- /* Set IO Port */
- PartialDescriptor = &PartialResourceList->PartialDescriptors[0];
- PartialDescriptor->Type = CmResourceTypePort;
- PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
- PartialDescriptor->Flags = CM_RESOURCE_PORT_IO;
- PartialDescriptor->u.Port.Start.LowPart = Base;
- PartialDescriptor->u.Port.Start.HighPart = 0x0;
- PartialDescriptor->u.Port.Length = 7;
-
- /* Set Interrupt */
- PartialDescriptor = &PartialResourceList->PartialDescriptors[1];
- PartialDescriptor->Type = CmResourceTypeInterrupt;
- PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
- PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED;
- PartialDescriptor->u.Interrupt.Level = Irq[i];
- PartialDescriptor->u.Interrupt.Vector = 0;
- PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
-
- /* Set serial data (device specific) */
- PartialDescriptor = &PartialResourceList->PartialDescriptors[2];
- PartialDescriptor->Type = CmResourceTypeDeviceSpecific;
- PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
- PartialDescriptor->Flags = 0;
- PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(CM_SERIAL_DEVICE_DATA);
-
- SerialDeviceData =
- (PCM_SERIAL_DEVICE_DATA)&PartialResourceList->PartialDescriptors[3];
- SerialDeviceData->BaudClock = 1843200; /* UART Clock frequency (Hertz) */
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
-
- /* Set 'Identifier' value */
- sprintf(Buffer, "COM%ld", i + 1);
- FldrSetIdentifier(ControllerKey, Buffer);
- DbgPrint((DPRINT_HWDETECT,
- "Created value: Identifier %s\n",
- Buffer));
-
- if (!Rs232PortInUse(Base))
- {
- /* Detect serial mouse */
- DetectSerialPointerPeripheral(ControllerKey, Base);
- }
-
- ControllerNumber++;
- }
-}
-
-
-static VOID
-DetectParallelPorts(PCONFIGURATION_COMPONENT_DATA BusKey)
-{
- PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
- PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
- ULONG Irq[3] = {7, 5, (ULONG)-1};
- CHAR Buffer[80];
- PCONFIGURATION_COMPONENT_DATA ControllerKey;
- PUSHORT BasePtr;
- ULONG Base;
- ULONG ControllerNumber;
- ULONG i;
- ULONG Size;
-
- DbgPrint((DPRINT_HWDETECT, "DetectParallelPorts() called\n"));
-
- ControllerNumber = 0;
- BasePtr = (PUSHORT)0x408;
- for (i = 0; i < 3; i++, BasePtr++)
- {
- Base = (ULONG)*BasePtr;
- if (Base == 0)
- continue;
-
- DbgPrint((DPRINT_HWDETECT,
- "Parallel port %u: %x\n",
- ControllerNumber,
- Base));
-
- /* Create controller key */
- FldrCreateComponentKey(BusKey,
- L"ParallelController",
- ControllerNumber,
- ControllerClass,
- ParallelController,
- &ControllerKey);
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- Output,
- ControllerNumber,
- 0xFFFFFFFF);
-
- /* Build full device descriptor */
- Size = sizeof(CM_PARTIAL_RESOURCE_LIST);
- if (Irq[i] != (ULONG)-1)
- Size += sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
-
- PartialResourceList = MmHeapAlloc(Size);
- if (PartialResourceList == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- continue;
- }
- memset(PartialResourceList, 0, Size);
-
- /* Initialize resource descriptor */
- PartialResourceList->Version = 1;
- PartialResourceList->Revision = 1;
- PartialResourceList->Count = (Irq[i] != (ULONG)-1) ? 2 : 1;
-
- /* Set IO Port */
- PartialDescriptor = &PartialResourceList->PartialDescriptors[0];
- PartialDescriptor->Type = CmResourceTypePort;
- PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
- PartialDescriptor->Flags = CM_RESOURCE_PORT_IO;
- PartialDescriptor->u.Port.Start.LowPart = Base;
- PartialDescriptor->u.Port.Start.HighPart = 0x0;
- PartialDescriptor->u.Port.Length = 3;
-
- /* Set Interrupt */
- if (Irq[i] != (ULONG)-1)
- {
- PartialDescriptor = &PartialResourceList->PartialDescriptors[1];
- PartialDescriptor->Type = CmResourceTypeInterrupt;
- PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
- PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED;
- PartialDescriptor->u.Interrupt.Level = Irq[i];
- PartialDescriptor->u.Interrupt.Vector = 0;
- PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
- }
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
-
- /* Set 'Identifier' value */
- sprintf(Buffer, "PARALLEL%ld", i + 1);
- FldrSetIdentifier(ControllerKey, Buffer);
- DbgPrint((DPRINT_HWDETECT,
- "Created value: Identifier %s\n",
- Buffer));
-
- ControllerNumber++;
- }
-
- DbgPrint((DPRINT_HWDETECT, "DetectParallelPorts() done\n"));
-}
-
-
-static BOOLEAN
-DetectKeyboardDevice(VOID)
-{
- UCHAR Status;
- UCHAR Scancode;
- ULONG Loops;
- BOOLEAN Result = TRUE;
-
- /* Identify device */
- WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA,
- 0xF2);
-
- /* Wait for reply */
- for (Loops = 0; Loops < 100; Loops++)
- {
- StallExecutionProcessor(10000);
- Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS);
- if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) != 0)
- break;
- }
-
- if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) == 0)
- {
- /* PC/XT keyboard or no keyboard */
- Result = FALSE;
- }
-
- Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA);
- if (Scancode != 0xFA)
- {
- /* No ACK received */
- Result = FALSE;
- }
-
- StallExecutionProcessor(10000);
-
- Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS);
- if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) == 0)
- {
- /* Found AT keyboard */
- return Result;
- }
-
- Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA);
- if (Scancode != 0xAB)
- {
- /* No 0xAB received */
- Result = FALSE;
- }
-
- StallExecutionProcessor(10000);
-
- Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS);
- if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) == 0)
- {
- /* No byte in buffer */
- Result = FALSE;
- }
-
- Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA);
- if (Scancode != 0x41)
- {
- /* No 0x41 received */
- Result = FALSE;
- }
-
- /* Found MF-II keyboard */
- return Result;
-}
-
-
-static VOID
-DetectKeyboardPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey)
-{
- PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
- PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
- PCM_KEYBOARD_DEVICE_DATA KeyboardData;
- PCONFIGURATION_COMPONENT_DATA PeripheralKey;
- ULONG Size;
-
- /* HACK: don't call DetectKeyboardDevice() as it fails in Qemu 0.8.2 */
- if (TRUE || DetectKeyboardDevice())
- {
- /* Create controller key */
- FldrCreateComponentKey(ControllerKey,
- L"KeyboardPeripheral",
- 0,
- PeripheralClass,
- KeyboardPeripheral,
- &PeripheralKey);
- DbgPrint((DPRINT_HWDETECT, "Created key: KeyboardPeripheral\\0\n"));
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(PeripheralKey,
- Input | ConsoleIn,
- 0,
- 0xFFFFFFFF);
-
- /* Set 'Configuration Data' value */
- Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
- sizeof(CM_KEYBOARD_DEVICE_DATA);
- PartialResourceList = MmHeapAlloc(Size);
- if (PartialResourceList == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- return;
- }
-
- /* Initialize resource descriptor */
- memset(PartialResourceList, 0, Size);
- PartialResourceList->Version = 1;
- PartialResourceList->Revision = 1;
- PartialResourceList->Count = 1;
-
- PartialDescriptor = &PartialResourceList->PartialDescriptors[0];
- PartialDescriptor->Type = CmResourceTypeDeviceSpecific;
- PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
- PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(CM_KEYBOARD_DEVICE_DATA);
-
- KeyboardData = (PCM_KEYBOARD_DEVICE_DATA)(PartialDescriptor + 1);
- KeyboardData->Version = 1;
- KeyboardData->Revision = 1;
- KeyboardData->Type = 4;
- KeyboardData->Subtype = 0;
- KeyboardData->KeyboardFlags = 0x20;
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(PeripheralKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(PeripheralKey, "PCAT_ENHANCED");
- }
-}
-
-
-static VOID
-DetectKeyboardController(PCONFIGURATION_COMPONENT_DATA BusKey)
-{
- PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
- PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
- PCONFIGURATION_COMPONENT_DATA ControllerKey;
- ULONG Size;
-
- /* Create controller key */
- FldrCreateComponentKey(BusKey,
- L"KeyboardController",
- 0,
- ControllerClass,
- KeyboardController,
- &ControllerKey);
- DbgPrint((DPRINT_HWDETECT, "Created key: KeyboardController\\0\n"));
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- Input | ConsoleIn,
- 0,
- 0xFFFFFFFF);
-
- /* Set 'Configuration Data' value */
- Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
- 2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
- PartialResourceList = MmHeapAlloc(Size);
- if (PartialResourceList == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- return;
- }
-
- /* Initialize resource descriptor */
- memset(PartialResourceList, 0, Size);
- PartialResourceList->Version = 1;
- PartialResourceList->Revision = 1;
- PartialResourceList->Count = 3;
-
- /* Set Interrupt */
- PartialDescriptor = &PartialResourceList->PartialDescriptors[0];
- PartialDescriptor->Type = CmResourceTypeInterrupt;
- PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
- PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED;
- PartialDescriptor->u.Interrupt.Level = 1;
- PartialDescriptor->u.Interrupt.Vector = 0;
- PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
-
- /* Set IO Port 0x60 */
- PartialDescriptor = &PartialResourceList->PartialDescriptors[1];
- PartialDescriptor->Type = CmResourceTypePort;
- PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
- PartialDescriptor->Flags = CM_RESOURCE_PORT_IO;
- PartialDescriptor->u.Port.Start.LowPart = 0x60;
- PartialDescriptor->u.Port.Start.HighPart = 0x0;
- PartialDescriptor->u.Port.Length = 1;
-
- /* Set IO Port 0x64 */
- PartialDescriptor = &PartialResourceList->PartialDescriptors[2];
- PartialDescriptor->Type = CmResourceTypePort;
- PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
- PartialDescriptor->Flags = CM_RESOURCE_PORT_IO;
- PartialDescriptor->u.Port.Start.LowPart = 0x64;
- PartialDescriptor->u.Port.Start.HighPart = 0x0;
- PartialDescriptor->u.Port.Length = 1;
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
-
- DetectKeyboardPeripheral(ControllerKey);
-}
-
-
-static VOID
-PS2ControllerWait(VOID)
-{
- ULONG Timeout;
- UCHAR Status;
-
- for (Timeout = 0; Timeout < CONTROLLER_TIMEOUT; Timeout++)
- {
- Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS);
- if ((Status & CONTROLLER_STATUS_INPUT_BUFFER_FULL) == 0)
- return;
-
- /* Sleep for one millisecond */
- StallExecutionProcessor(1000);
- }
-}
-
-
-static BOOLEAN
-DetectPS2AuxPort(VOID)
-{
-#if 1
- /* Current detection is too unreliable. Just do as if
- * the PS/2 aux port is always present
- */
- return TRUE;
-#else
- ULONG Loops;
- UCHAR Status;
-
- /* Put the value 0x5A in the output buffer using the
- * "WriteAuxiliary Device Output Buffer" command (0xD3).
- * Poll the Status Register for a while to see if the value really turns up
- * in the Data Register. If the KEYBOARD_STATUS_MOUSE_OBF bit is also set
- * to 1 in the Status Register, we assume this controller has an
- * Auxiliary Port (a.k.a. Mouse Port).
- */
- PS2ControllerWait();
- WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_CONTROL,
- CONTROLLER_COMMAND_WRITE_MOUSE_OUTPUT_BUFFER);
- PS2ControllerWait();
-
- /* 0x5A is a random dummy value */
- WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA,
- 0x5A);
-
- for (Loops = 0; Loops < 10; Loops++)
- {
- StallExecutionProcessor(10000);
- Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS);
- if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) != 0)
- break;
- }
-
- READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA);
-
- return (Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL);
-#endif
-}
-
-
-static BOOLEAN
-DetectPS2AuxDevice(VOID)
-{
- UCHAR Scancode;
- UCHAR Status;
- ULONG Loops;
- BOOLEAN Result = TRUE;
-
- PS2ControllerWait();
- WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_CONTROL,
- CONTROLLER_COMMAND_WRITE_MOUSE);
- PS2ControllerWait();
-
- /* Identify device */
- WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA,
- 0xF2);
-
- /* Wait for reply */
- for (Loops = 0; Loops < 100; Loops++)
- {
- StallExecutionProcessor(10000);
- Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS);
- if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) != 0)
- break;
- }
-
- Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS);
- if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0)
- Result = FALSE;
-
- Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA);
- if (Scancode != 0xFA)
- Result = FALSE;
-
- StallExecutionProcessor(10000);
-
- Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS);
- if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0)
- Result = FALSE;
-
- Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA);
- if (Scancode != 0x00)
- Result = FALSE;
-
- return Result;
-}
-
-
-static VOID
-DetectPS2Mouse(PCONFIGURATION_COMPONENT_DATA BusKey)
-{
- CM_PARTIAL_RESOURCE_LIST PartialResourceList;
- PCONFIGURATION_COMPONENT_DATA ControllerKey;
- PCONFIGURATION_COMPONENT_DATA PeripheralKey;
-
- if (DetectPS2AuxPort())
- {
- DbgPrint((DPRINT_HWDETECT, "Detected PS2 port\n"));
-
- /* Create controller key */
- FldrCreateComponentKey(BusKey,
- L"PointerController",
- 0,
- ControllerClass,
- PointerController,
- &ControllerKey);
- DbgPrint((DPRINT_HWDETECT, "Created key: PointerController\\0\n"));
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- Input,
- 0,
- 0xFFFFFFFF);
-
- memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
-
- /* Initialize resource descriptor */
- PartialResourceList.Version = 1;
- PartialResourceList.Revision = 1;
- PartialResourceList.Count = 1;
-
- /* Set Interrupt */
- PartialResourceList.PartialDescriptors[0].Type = CmResourceTypeInterrupt;
- PartialResourceList.PartialDescriptors[0].ShareDisposition = CmResourceShareUndetermined;
- PartialResourceList.PartialDescriptors[0].Flags = CM_RESOURCE_INTERRUPT_LATCHED;
- PartialResourceList.PartialDescriptors[0].u.Interrupt.Level = 12;
- PartialResourceList.PartialDescriptors[0].u.Interrupt.Vector = 0;
- PartialResourceList.PartialDescriptors[0].u.Interrupt.Affinity = 0xFFFFFFFF;
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey,
- &PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST));
-
- if (DetectPS2AuxDevice())
- {
- DbgPrint((DPRINT_HWDETECT, "Detected PS2 mouse\n"));
-
- /* Create peripheral key */
- FldrCreateComponentKey(ControllerKey,
- L"PointerPeripheral",
- 0,
- ControllerClass,
- PointerPeripheral,
- &PeripheralKey);
- DbgPrint((DPRINT_HWDETECT, "Created key: PointerPeripheral\\0\n"));
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(PeripheralKey,
- Input,
- 0,
- 0xFFFFFFFF);
-
- /* Initialize resource descriptor */
- memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
- PartialResourceList.Version = 1;
- PartialResourceList.Revision = 1;
- PartialResourceList.Count = 0;
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(PeripheralKey,
- &PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST) -
- sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(PeripheralKey, "MICROSOFT PS2 MOUSE");
- }
- }
-}
-
-
-static VOID
-DetectDisplayController(PCONFIGURATION_COMPONENT_DATA BusKey)
-{
- CHAR Buffer[80];
- PCONFIGURATION_COMPONENT_DATA ControllerKey;
- USHORT VesaVersion;
-
- FldrCreateComponentKey(BusKey,
- L"DisplayController",
- 0,
- ControllerClass,
- DisplayController,
- &ControllerKey);
- DbgPrint((DPRINT_HWDETECT, "Created key: DisplayController\\0\n"));
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- 0x00,
- 0,
- 0xFFFFFFFF);
-
- /* FIXME: Set 'ComponentInformation' value */
-
- VesaVersion = BiosIsVesaSupported();
- if (VesaVersion != 0)
- {
- DbgPrint((DPRINT_HWDETECT,
- "VESA version %c.%c\n",
- (VesaVersion >> 8) + '0',
- (VesaVersion & 0xFF) + '0'));
- }
- else
- {
- DbgPrint((DPRINT_HWDETECT,
- "VESA not supported\n"));
- }
-
- if (VesaVersion >= 0x0200)
- {
- strcpy(Buffer,
- "VBE Display");
- }
- else
- {
- strcpy(Buffer,
- "VGA Display");
- }
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(ControllerKey, Buffer);
-
- /* FIXME: Add display peripheral (monitor) data */
-}
-
-
-static VOID
-DetectIsaBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
-{
- PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
- PCONFIGURATION_COMPONENT_DATA BusKey;
- ULONG Size;
-
- /* Create new bus key */
- FldrCreateComponentKey(SystemKey,
- L"MultifunctionAdapter",
- *BusNumber,
- AdapterClass,
- MultiFunctionAdapter,
- &BusKey);
-
- /* Set 'Component Information' value similar to my NT4 box */
- FldrSetComponentInformation(BusKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
- /* Increment bus number */
- (*BusNumber)++;
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(BusKey, "ISA");
-
- /* Set 'Configuration Data' value */
- Size = sizeof(CM_PARTIAL_RESOURCE_LIST) -
- sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
- PartialResourceList = MmHeapAlloc(Size);
- if (PartialResourceList == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- return;
- }
-
- /* Initialize resource descriptor */
- memset(PartialResourceList, 0, Size);
- PartialResourceList->Version = 1;
- PartialResourceList->Revision = 1;
- PartialResourceList->Count = 0;
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
-
- /* Detect ISA/BIOS devices */
- DetectBiosDisks(SystemKey, BusKey);
-
- DetectSerialPorts(BusKey);
-
- DetectParallelPorts(BusKey);
-
- DetectKeyboardController(BusKey);
-
- DetectPS2Mouse(BusKey);
-
- DetectDisplayController(BusKey);
-
- /* FIXME: Detect more ISA devices */
-}
-
-
-PCONFIGURATION_COMPONENT_DATA
-PcHwDetect(VOID)
-{
- PCONFIGURATION_COMPONENT_DATA SystemKey;
- ULONG BusNumber = 0;
-
- DbgPrint((DPRINT_HWDETECT, "DetectHardware()\n"));
-
- /* Create the 'System' key */
- FldrCreateSystemKey(&SystemKey);
-
- /* Set empty component information */
- FldrSetComponentInformation(SystemKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
- /* Detect buses */
- DetectPciBios(SystemKey, &BusNumber);
- DetectApmBios(SystemKey, &BusNumber);
- DetectPnpBios(SystemKey, &BusNumber);
- DetectIsaBios(SystemKey, &BusNumber);
- DetectAcpiBios(SystemKey, &BusNumber);
-
- DbgPrint((DPRINT_HWDETECT, "DetectHardware() Done\n"));
-
- return SystemKey;
-}
-
-/* EOF */
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/hwacpi.c b/reactos/boot/freeldr/freeldr/arch/amd64/hwacpi.c
deleted file mode 100644
index cc7cdcd19af..00000000000
--- a/reactos/boot/freeldr/freeldr/arch/amd64/hwacpi.c
+++ /dev/null
@@ -1,5 +0,0 @@
-/* No need to duplicate code ; import the i386 version */
-
-#include "../i386/hwacpi.c"
-
-/* EOF */
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/hwapm.c b/reactos/boot/freeldr/freeldr/arch/amd64/hwapm.c
deleted file mode 100644
index 4296c76164c..00000000000
--- a/reactos/boot/freeldr/freeldr/arch/amd64/hwapm.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * FreeLoader
- *
- * Copyright (C) 2004 Eric Kohl
- *
- * 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.
- *
- * This 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include
-
-#define NDEBUG
-#include
-
-static BOOLEAN
-FindApmBios(VOID)
-{
- REGS RegsIn;
- REGS RegsOut;
-
- RegsIn.b.ah = 0x53;
- RegsIn.b.al = 0x00;
- RegsIn.w.bx = 0x0000;
-
- Int386(0x15, &RegsIn, &RegsOut);
-
- if (INT386_SUCCESS(RegsOut))
- {
- DbgPrint((DPRINT_HWDETECT, "Found APM BIOS\n"));
- DbgPrint((DPRINT_HWDETECT, "AH: %x\n", RegsOut.b.ah));
- DbgPrint((DPRINT_HWDETECT, "AL: %x\n", RegsOut.b.al));
- DbgPrint((DPRINT_HWDETECT, "BH: %x\n", RegsOut.b.bh));
- DbgPrint((DPRINT_HWDETECT, "BL: %x\n", RegsOut.b.bl));
- DbgPrint((DPRINT_HWDETECT, "CX: %x\n", RegsOut.w.cx));
-
- return TRUE;
- }
-
- DbgPrint((DPRINT_HWDETECT, "No APM BIOS found\n"));
-
- return FALSE;
-}
-
-
-VOID
-DetectApmBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
-{
- PCONFIGURATION_COMPONENT_DATA BiosKey;
- CM_PARTIAL_RESOURCE_LIST PartialResourceList;
-
- if (FindApmBios())
- {
- /* Create new bus key */
- FldrCreateComponentKey(SystemKey,
- L"MultifunctionAdapter",
- *BusNumber,
- AdapterClass,
- MultiFunctionAdapter,
- &BiosKey);
-
- /* Set 'Component Information' */
- FldrSetComponentInformation(BiosKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
- /* Set 'Configuration Data' value */
- memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
- PartialResourceList.Version = 0;
- PartialResourceList.Revision = 0;
- PartialResourceList.Count = 0;
- FldrSetConfigurationData(BiosKey,
- &PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST) -
- sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
-
- /* Increment bus number */
- (*BusNumber)++;
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(BiosKey, "APM");
- }
-
- /* FIXME: Add configuration data */
-}
-
-/* EOF */
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/hwpci.c b/reactos/boot/freeldr/freeldr/arch/amd64/hwpci.c
deleted file mode 100644
index de293334c5f..00000000000
--- a/reactos/boot/freeldr/freeldr/arch/amd64/hwpci.c
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * FreeLoader
- *
- * Copyright (C) 2004 Eric Kohl
- *
- * 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.
- *
- * This 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include
-
-#define NDEBUG
-#include
-
-typedef struct _ROUTING_SLOT
-{
- UCHAR BusNumber;
- UCHAR DeviceNumber;
- UCHAR LinkA;
- USHORT BitmapA;
- UCHAR LinkB;
- USHORT BitmapB;
- UCHAR LinkC;
- USHORT BitmapC;
- UCHAR LinkD;
- USHORT BitmapD;
- UCHAR SlotNumber;
- UCHAR Reserved;
-} __attribute__((packed)) ROUTING_SLOT, *PROUTING_SLOT;
-
-typedef struct _PCI_IRQ_ROUTING_TABLE
-{
- ULONG Signature;
- USHORT Version;
- USHORT Size;
- UCHAR RouterBus;
- UCHAR RouterSlot;
- USHORT ExclusiveIRQs;
- ULONG CompatibleRouter;
- ULONG MiniportData;
- UCHAR Reserved[11];
- UCHAR Checksum;
- ROUTING_SLOT Slot[1];
-} __attribute__((packed)) PCI_IRQ_ROUTING_TABLE, *PPCI_IRQ_ROUTING_TABLE;
-
-typedef struct _PCI_REGISTRY_INFO
-{
- UCHAR MajorRevision;
- UCHAR MinorRevision;
- UCHAR NoBuses;
- UCHAR HardwareMechanism;
-} PCI_REGISTRY_INFO, *PPCI_REGISTRY_INFO;
-
-static PPCI_IRQ_ROUTING_TABLE
-GetPciIrqRoutingTable(VOID)
-{
- PPCI_IRQ_ROUTING_TABLE Table;
- PUCHAR Ptr;
- ULONG Sum;
- ULONG i;
-
- Table = (PPCI_IRQ_ROUTING_TABLE)0xF0000;
- while ((ULONG_PTR)Table < 0x100000)
- {
- if (Table->Signature == 0x52495024)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Found signature\n"));
-
- Ptr = (PUCHAR)Table;
- Sum = 0;
- for (i = 0; i < Table->Size; i++)
- {
- Sum += Ptr[i];
- }
-
- if ((Sum & 0xFF) != 0)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Invalid routing table\n"));
- return NULL;
- }
-
- DbgPrint((DPRINT_HWDETECT,
- "Valid checksum\n"));
-
- return Table;
- }
-
- Table = (PPCI_IRQ_ROUTING_TABLE)((ULONG_PTR)Table + 0x10);
- }
-
- return NULL;
-}
-
-
-static BOOLEAN
-FindPciBios(PPCI_REGISTRY_INFO BusData)
-{
- REGS RegsIn;
- REGS RegsOut;
-
- RegsIn.b.ah = 0xB1; /* Subfunction B1h */
- RegsIn.b.al = 0x01; /* PCI BIOS present */
-
- Int386(0x1A, &RegsIn, &RegsOut);
-
- if (INT386_SUCCESS(RegsOut) && RegsOut.d.edx == 0x20494350 && RegsOut.b.ah == 0)
- {
- DbgPrint((DPRINT_HWDETECT, "Found PCI bios\n"));
-
- DbgPrint((DPRINT_HWDETECT, "AL: %x\n", RegsOut.b.al));
- DbgPrint((DPRINT_HWDETECT, "BH: %x\n", RegsOut.b.bh));
- DbgPrint((DPRINT_HWDETECT, "BL: %x\n", RegsOut.b.bl));
- DbgPrint((DPRINT_HWDETECT, "CL: %x\n", RegsOut.b.cl));
-
- BusData->NoBuses = RegsOut.b.cl + 1;
- BusData->MajorRevision = RegsOut.b.bh;
- BusData->MinorRevision = RegsOut.b.bl;
- BusData->HardwareMechanism = RegsOut.b.cl;
-
- return TRUE;
- }
-
-
- DbgPrint((DPRINT_HWDETECT, "No PCI bios found\n"));
-
- return FALSE;
-}
-
-
-static VOID
-DetectPciIrqRoutingTable(PCONFIGURATION_COMPONENT_DATA BusKey)
-{
- PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
- PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
- PPCI_IRQ_ROUTING_TABLE Table;
- PCONFIGURATION_COMPONENT_DATA TableKey;
- ULONG Size;
-
- Table = GetPciIrqRoutingTable();
- if (Table != NULL)
- {
- DbgPrint((DPRINT_HWDETECT, "Table size: %u\n", Table->Size));
-
- FldrCreateComponentKey(BusKey,
- L"RealModeIrqRoutingTable",
- 0,
- PeripheralClass,
- RealModeIrqRoutingTable,
- &TableKey);
-
- /* Set 'Component Information' */
- FldrSetComponentInformation(TableKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(TableKey, "PCI Real-mode IRQ Routing Table");
-
- /* Set 'Configuration Data' value */
- Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST, PartialDescriptors) +
- 2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) + Table->Size;
- PartialResourceList = MmAllocateMemory(Size);
- if (PartialResourceList == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- return;
- }
-
- /* Initialize resource descriptor */
- memset(PartialResourceList, 0, Size);
- PartialResourceList->Version = 1;
- PartialResourceList->Revision = 1;
- PartialResourceList->Count = 2;
-
- PartialDescriptor = &PartialResourceList->PartialDescriptors[0];
- PartialDescriptor->Type = CmResourceTypeBusNumber;
- PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
- PartialDescriptor->u.BusNumber.Start = 0;
- PartialDescriptor->u.BusNumber.Length = 1;
-
- PartialDescriptor = &PartialResourceList->PartialDescriptors[1];
- PartialDescriptor->Type = CmResourceTypeDeviceSpecific;
- PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
- PartialDescriptor->u.DeviceSpecificData.DataSize = Table->Size;
-
- memcpy(&PartialResourceList->PartialDescriptors[2],
- Table, Table->Size);
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(TableKey, PartialResourceList, Size);
- MmFreeMemory(PartialResourceList);
- }
-}
-
-
-VOID
-DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
-{
- PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
- PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
- PCI_REGISTRY_INFO BusData;
- PCONFIGURATION_COMPONENT_DATA BiosKey;
- ULONG Size;
- PCONFIGURATION_COMPONENT_DATA BusKey;
- ULONG i;
- CHAR szPci[] = "PCI";
-
- /* Report the PCI BIOS */
- if (FindPciBios(&BusData))
- {
- /* Create new bus key */
- FldrCreateComponentKey(SystemKey,
- L"MultifunctionAdapter",
- *BusNumber,
- AdapterClass,
- MultiFunctionAdapter,
- &BiosKey);
-
- /* Set 'Component Information' */
- FldrSetComponentInformation(BiosKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
- /* Increment bus number */
- (*BusNumber)++;
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(BiosKey, "PCI BIOS");
-
- /* Set 'Configuration Data' value */
- Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST,
- PartialDescriptors);
- PartialResourceList = MmAllocateMemory(Size);
- if (PartialResourceList == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- return;
- }
-
- /* Initialize resource descriptor */
- memset(PartialResourceList, 0, Size);
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BiosKey, PartialResourceList, Size);
- MmFreeMemory(PartialResourceList);
-
- DetectPciIrqRoutingTable(BiosKey);
-
- /* Report PCI buses */
- for (i = 0; i < (ULONG)BusData.NoBuses; i++)
- {
- /* Create the bus key */
- FldrCreateComponentKey(SystemKey,
- L"MultifunctionAdapter",
- *BusNumber,
- AdapterClass,
- MultiFunctionAdapter,
- &BusKey);
-
- /* Set 'Component Information' */
- FldrSetComponentInformation(BusKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
- /* Check if this is the first bus */
- if (i == 0)
- {
- /* Set 'Configuration Data' value */
- Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST,
- PartialDescriptors) +
- sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) +
- sizeof(PCI_REGISTRY_INFO);
- PartialResourceList = MmAllocateMemory(Size);
- if (!PartialResourceList)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- return;
- }
-
- /* Initialize resource descriptor */
- memset(PartialResourceList, 0, Size);
- PartialResourceList->Version = 1;
- PartialResourceList->Revision = 1;
- PartialResourceList->Count = 1;
- PartialDescriptor = &PartialResourceList->PartialDescriptors[0];
- PartialDescriptor->Type = CmResourceTypeDeviceSpecific;
- PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
- PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(PCI_REGISTRY_INFO);
- memcpy(&PartialResourceList->PartialDescriptors[1],
- &BusData,
- sizeof(PCI_REGISTRY_INFO));
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
- MmFreeMemory(PartialResourceList);
- }
- else
- {
- /* Set 'Configuration Data' value */
- Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST,
- PartialDescriptors);
- PartialResourceList = MmAllocateMemory(Size);
- if (!PartialResourceList)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- return;
- }
-
- /* Initialize resource descriptor */
- memset(PartialResourceList, 0, Size);
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
- MmFreeMemory(PartialResourceList);
- }
-
- /* Increment bus number */
- (*BusNumber)++;
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(BusKey, szPci);
- }
- }
-}
-
-/* EOF */
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386disk.c b/reactos/boot/freeldr/freeldr/arch/amd64/i386disk.c
deleted file mode 100644
index 3a0874c84d3..00000000000
--- a/reactos/boot/freeldr/freeldr/arch/amd64/i386disk.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * FreeLoader
- * Copyright (C) 1998-2003 Brian Palmer
- *
- * 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.
- *
- * This 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include
-
-#define NDEBUG
-#include
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-// FUNCTIONS
-/////////////////////////////////////////////////////////////////////////////////////////////
-
-BOOLEAN DiskResetController(ULONG DriveNumber)
-{
- REGS RegsIn;
- REGS RegsOut;
-
- DbgPrint((DPRINT_DISK, "DiskResetController(0x%x) DISK OPERATION FAILED -- RESETTING CONTROLLER\n", DriveNumber));
-
- // BIOS Int 13h, function 0 - Reset disk system
- // AH = 00h
- // DL = drive (if bit 7 is set both hard disks and floppy disks reset)
- // Return:
- // AH = status
- // CF clear if successful
- // CF set on error
- RegsIn.b.ah = 0x00;
- RegsIn.b.dl = DriveNumber;
-
- // Reset the disk controller
- Int386(0x13, &RegsIn, &RegsOut);
-
- return INT386_SUCCESS(RegsOut);
-}
-
-BOOLEAN DiskInt13ExtensionsSupported(ULONG DriveNumber)
-{
- REGS RegsIn;
- REGS RegsOut;
-
- DbgPrint((DPRINT_DISK, "DiskInt13ExtensionsSupported()\n"));
-
- // IBM/MS INT 13 Extensions - INSTALLATION CHECK
- // AH = 41h
- // BX = 55AAh
- // DL = drive (80h-FFh)
- // Return:
- // CF set on error (extensions not supported)
- // AH = 01h (invalid function)
- // CF clear if successful
- // BX = AA55h if installed
- // AH = major version of extensions
- // 01h = 1.x
- // 20h = 2.0 / EDD-1.0
- // 21h = 2.1 / EDD-1.1
- // 30h = EDD-3.0
- // AL = internal use
- // CX = API subset support bitmap
- // DH = extension version (v2.0+ ??? -- not present in 1.x)
- //
- // Bitfields for IBM/MS INT 13 Extensions API support bitmap
- // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
- // Bit 1, removable drive controller functions (AH=45h,46h,48h,49h,INT 15/AH=52h) supported
- // Bit 2, enhanced disk drive (EDD) functions (AH=48h,AH=4Eh) supported
- // extended drive parameter table is valid
- // Bits 3-15 reserved
- RegsIn.b.ah = 0x41;
- RegsIn.w.bx = 0x55AA;
- RegsIn.b.dl = DriveNumber;
-
- // Reset the disk controller
- Int386(0x13, &RegsIn, &RegsOut);
-
- if (!INT386_SUCCESS(RegsOut))
- {
- // CF set on error (extensions not supported)
- return FALSE;
- }
-
- if (RegsOut.w.bx != 0xAA55)
- {
- // BX = AA55h if installed
- return FALSE;
- }
-
- // Note:
- // The original check is too strict because some BIOSes report that
- // extended disk access functions are not suported when booting
- // from a CD (e.g. Phoenix BIOS v6.00PG). Argh!
-#if 0
- if (!(RegsOut.w.cx & 0x0001))
- {
- // CX = API subset support bitmap
- // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
- return FALSE;
- }
-#endif
-
- // Use this relaxed check instead
- if (RegsOut.w.cx == 0x0000)
- {
- // CX = API subset support bitmap
- return FALSE;
- }
-
- return TRUE;
-}
-
-VOID DiskStopFloppyMotor(VOID)
-{
- WRITE_PORT_UCHAR((PUCHAR)0x3F2, 0);
-}
-
-BOOLEAN DiskGetExtendedDriveParameters(ULONG DriveNumber, PVOID Buffer, USHORT BufferSize)
-{
- REGS RegsIn;
- REGS RegsOut;
- PUSHORT Ptr = (PUSHORT)(BIOSCALLBUFFER);
-
- DbgPrint((DPRINT_DISK, "DiskGetExtendedDriveParameters()\n"));
-
- // Initialize transfer buffer
- *Ptr = BufferSize;
-
- // BIOS Int 13h, function 48h - Get drive parameters
- // AH = 48h
- // DL = drive (bit 7 set for hard disk)
- // DS:SI = result buffer
- // Return:
- // CF set on error
- // AH = status (07h)
- // CF clear if successful
- // AH = 00h
- // DS:SI -> result buffer
- RegsIn.b.ah = 0x48;
- RegsIn.b.dl = DriveNumber;
- RegsIn.x.ds = BIOSCALLBUFSEGMENT; // DS:SI -> result buffer
- RegsIn.w.si = BIOSCALLBUFOFFSET;
-
- // Get drive parameters
- Int386(0x13, &RegsIn, &RegsOut);
-
- if (!INT386_SUCCESS(RegsOut))
- {
- return FALSE;
- }
-
- memcpy(Buffer, Ptr, BufferSize);
-
- DbgPrint((DPRINT_DISK, "size of buffer: %x\n", Ptr[0]));
- DbgPrint((DPRINT_DISK, "information flags: %x\n", Ptr[1]));
- DbgPrint((DPRINT_DISK, "number of physical cylinders on drive: %u\n", *(PULONG)&Ptr[2]));
- DbgPrint((DPRINT_DISK, "number of physical heads on drive: %u\n", *(PULONG)&Ptr[4]));
- DbgPrint((DPRINT_DISK, "number of physical sectors per track: %u\n", *(PULONG)&Ptr[6]));
- DbgPrint((DPRINT_DISK, "total number of sectors on drive: %I64u\n", *(unsigned long long*)&Ptr[8]));
- DbgPrint((DPRINT_DISK, "bytes per sector: %u\n", Ptr[12]));
- if (Ptr[0] >= 0x1e)
- {
- DbgPrint((DPRINT_DISK, "EED configuration parameters: %x:%x\n", Ptr[13], Ptr[14]));
- if (Ptr[13] != 0xffff && Ptr[14] != 0xffff)
- {
- PUCHAR SpecPtr = (PUCHAR)(ULONG_PTR)((Ptr[13] << 4) + Ptr[14]);
- DbgPrint((DPRINT_DISK, "SpecPtr: %x\n", SpecPtr));
- DbgPrint((DPRINT_DISK, "physical I/O port base address: %x\n", *(PUSHORT)&SpecPtr[0]));
- DbgPrint((DPRINT_DISK, "disk-drive control port address: %x\n", *(PUSHORT)&SpecPtr[2]));
- DbgPrint((DPRINT_DISK, "drive flags: %x\n", SpecPtr[4]));
- DbgPrint((DPRINT_DISK, "proprietary information: %x\n", SpecPtr[5]));
- DbgPrint((DPRINT_DISK, "IRQ for drive: %u\n", SpecPtr[6]));
- DbgPrint((DPRINT_DISK, "sector count for multi-sector transfers: %u\n", SpecPtr[7]));
- DbgPrint((DPRINT_DISK, "DMA control: %x\n", SpecPtr[8]));
- DbgPrint((DPRINT_DISK, "programmed I/O control: %x\n", SpecPtr[9]));
- DbgPrint((DPRINT_DISK, "drive options: %x\n", *(PUSHORT)&SpecPtr[10]));
- }
- }
- if (Ptr[0] >= 0x42)
- {
- DbgPrint((DPRINT_DISK, "signature: %x\n", Ptr[15]));
- }
-
- return TRUE;
-}
-
-/* EOF */
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386rtl.c b/reactos/boot/freeldr/freeldr/arch/amd64/i386rtl.c
deleted file mode 100644
index ff3ac988a37..00000000000
--- a/reactos/boot/freeldr/freeldr/arch/amd64/i386rtl.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * FreeLoader
- * Copyright (C) 1998-2003 Brian Palmer
- *
- * 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.
- *
- * This 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include
-
-void PcBeep(void)
-{
- sound(700);
- delay(200);
- sound(0);
-}
-
-void delay(unsigned msec)
-{
- REGS Regs;
- unsigned usec;
- unsigned msec_this;
-
- // Int 15h AH=86h
- // BIOS - WAIT (AT,PS)
- //
- // AH = 86h
- // CX:DX = interval in microseconds
- // Return:
- // CF clear if successful (wait interval elapsed)
- // CF set on error or AH=83h wait already in progress
- // AH = status (see #00496)
-
- // Note: The resolution of the wait period is 977 microseconds on
- // many systems because many BIOSes use the 1/1024 second fast
- // interrupt from the AT real-time clock chip which is available on INT 70;
- // because newer BIOSes may have much more precise timers available, it is
- // not possible to use this function accurately for very short delays unless
- // the precise behavior of the BIOS is known (or found through testing)
-
- while (msec)
- {
- msec_this = msec;
-
- if (msec_this > 4000)
- {
- msec_this = 4000;
- }
-
- usec = msec_this * 1000;
-
- Regs.b.ah = 0x86;
- Regs.w.cx = usec >> 16;
- Regs.w.dx = usec & 0xffff;
- Int386(0x15, &Regs, &Regs);
-
- msec -= msec_this;
- }
-}
-
-void sound(int freq)
-{
- int scale;
-
- if (freq == 0)
- {
- WRITE_PORT_UCHAR((PUCHAR)0x61, READ_PORT_UCHAR((PUCHAR)0x61) & ~3);
- return;
- }
-
- scale = 1193046 / freq;
- WRITE_PORT_UCHAR((PUCHAR)0x43, 0xb6);
- WRITE_PORT_UCHAR((PUCHAR)0x42, scale & 0xff);
- WRITE_PORT_UCHAR((PUCHAR)0x42, scale >> 8);
- WRITE_PORT_UCHAR((PUCHAR)0x61, READ_PORT_UCHAR((PUCHAR)0x61) | 3);
-}
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386vid.c b/reactos/boot/freeldr/freeldr/arch/amd64/i386vid.c
deleted file mode 100644
index 1c33ee6804e..00000000000
--- a/reactos/boot/freeldr/freeldr/arch/amd64/i386vid.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * FreeLoader
- * Copyright (C) 1998-2003 Brian Palmer
- * Portions from Linux video.S - Display adapter & video mode setup, version 2.13 (14-May-99)
- * Copyright (C) 1995 -- 1999 Martin Mares
- * Based on the original setup.S code (C) Linus Torvalds and Mats Anderson
- *
- * 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.
- *
- * This 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include
-
-#define NDEBUG
-#include
-
-typedef struct
-{
- UCHAR Signature[4]; // (ret) signature ("VESA")
- // (call) VESA 2.0 request signature ("VBE2"), required to receive
- // version 2.0 info
- USHORT VesaVersion; // VESA version number (one-digit minor version -- 0102h = v1.2)
- ULONG OemNamePtr; // pointer to OEM name
- // "761295520" for ATI
- ULONG Capabilities; // capabilities flags (see #00078)
- ULONG SupportedModeListPtr; // pointer to list of supported VESA and OEM video modes
- // (list of words terminated with FFFFh)
- USHORT TotalVideoMemory; // total amount of video memory in 64K blocks
-
- // ---VBE v1.x ---
- //UCHAR Reserved[236];
-
- // ---VBE v2.0 ---
- USHORT OemSoftwareVersion; // OEM software version (BCD, high byte = major, low byte = minor)
- ULONG VendorNamePtr; // pointer to vendor name
- ULONG ProductNamePtr; // pointer to product name
- ULONG ProductRevisionStringPtr; // pointer to product revision string
- USHORT VBE_AF_Version; // (if capabilities bit 3 set) VBE/AF version (BCD)
- // 0100h for v1.0P
- ULONG AcceleratedModeListPtr; // (if capabilities bit 3 set) pointer to list of supported
- // accelerated video modes (list of words terminated with FFFFh)
- UCHAR Reserved[216]; // reserved for VBE implementation
- UCHAR ScratchPad[256]; // OEM scratchpad (for OEM strings, etc.)
-} PACKED VESA_SVGA_INFO, *PVESA_SVGA_INFO;
-
-// Bitfields for VESA capabilities:
-//
-// Bit(s) Description (Table 00078)
-// 0 DAC can be switched into 8-bit mode
-// 1 non-VGA controller
-// 2 programmed DAC with blank bit (i.e. only during blanking interval)
-// 3 (VBE v3.0) controller supports hardware stereoscopic signalling
-// 3 controller supports VBE/AF v1.0P extensions
-// 4 (VBE v3.0) if bit 3 set:
-// =0 stereo signalling via external VESA stereo connector
-// =1 stereo signalling via VESA EVC connector
-// 4 (VBE/AF v1.0P) must call EnableDirectAccess to access framebuffer
-// 5 (VBE/AF v1.0P) controller supports hardware mouse cursor
-// 6 (VBE/AF v1.0P) controller supports hardware clipping
-// 7 (VBE/AF v1.0P) controller supports transparent BitBLT
-// 8-31 reserved (0)
-
-// Notes: The list of supported video modes is stored in the reserved
-// portion of the SuperVGA information record by some implementations,
-// and it may thus be necessary to either copy the mode list or use a
-// different buffer for all subsequent VESA calls. Not all of the video
-// modes in the list of mode numbers may be supported, e.g. if they require
-// more memory than currently installed or are not supported by the
-// attached monitor. Check any mode you intend to use through AX=4F01h first..
-// The 1.1 VESA document specifies 242 reserved bytes at the end, so the
-// buffer should be 262 bytes to ensure that it is not overrun; for v2.0,
-// the buffer should be 512 bytes. The S3 specific video modes will most
-// likely follow the FFFFh terminator at the end of the standard modes.
-// A search must then be made to find them, FFFFh will also terminate this
-// second list. In some cases, only a "stub" VBE may be present, supporting
-// only AX=4F00h; this case may be assumed if the list of supported video modes
-// is empty (consisting of a single word of FFFFh)
-#if 0
-static VOID BiosSetVideoFont8x16(VOID)
-{
- REGS Regs;
-
- // Int 10h AX=1114h
- // VIDEO - TEXT-MODE CHARGEN - LOAD ROM 8x16 CHARACTER SET (VGA)
- //
- // AX = 1114h
- // BL = block to load
- // Return:
- // Nothing
- Regs.w.ax = 0x1114;
- Regs.b.bl = 0;
- Int386(0x10, &Regs, &Regs);
-}
-
-static VOID VideoSetTextCursorPosition(ULONG X, ULONG Y)
-{
-}
-
-static ULONG VideoGetTextCursorPositionX(VOID)
-{
- REGS Regs;
-
- // Int 10h AH=03h
- // VIDEO - GET CURSOR POSITION AND SIZE
- //
- // AH = 03h
- // BH = page number
- // 0-3 in modes 2&3
- // 0-7 in modes 0&1
- // 0 in graphics modes
- // Return:
- // AX = 0000h (Phoenix BIOS)
- // CH = start scan line
- // CL = end scan line
- // DH = row (00h is top)
- // DL = column (00h is left)
- Regs.b.ah = 0x03;
- Regs.b.bh = 0x00;
- Int386(0x10, &Regs, &Regs);
-
- return Regs.b.dl;
-}
-
-static ULONG VideoGetTextCursorPositionY(VOID)
-{
- REGS Regs;
-
- // Int 10h AH=03h
- // VIDEO - GET CURSOR POSITION AND SIZE
- //
- // AH = 03h
- // BH = page number
- // 0-3 in modes 2&3
- // 0-7 in modes 0&1
- // 0 in graphics modes
- // Return:
- // AX = 0000h (Phoenix BIOS)
- // CH = start scan line
- // CL = end scan line
- // DH = row (00h is top)
- // DL = column (00h is left)
- Regs.b.ah = 0x03;
- Regs.b.bh = 0x00;
- Int386(0x10, &Regs, &Regs);
-
- return Regs.b.dh;
-}
-#endif
-
-USHORT BiosIsVesaSupported(VOID)
-{
- REGS Regs;
- PVESA_SVGA_INFO SvgaInfo = (PVESA_SVGA_INFO)BIOSCALLBUFFER;
- //USHORT* VideoModes;
- //USHORT Index;
-
- DbgPrint((DPRINT_UI, "BiosIsVesaSupported()\n"));
-
- RtlZeroMemory(SvgaInfo, sizeof(VESA_SVGA_INFO));
-
- // Make sure we receive version 2.0 info
- SvgaInfo->Signature[0] = 'V';
- SvgaInfo->Signature[1] = 'B';
- SvgaInfo->Signature[2] = 'E';
- SvgaInfo->Signature[3] = '2';
-
- // Int 10h AX=4F00h
- // VESA SuperVGA BIOS (VBE) - GET SuperVGA INFORMATION
- //
- // AX = 4F00h
- // ES:DI -> buffer for SuperVGA information (see #00077)
- // Return:
- // AL = 4Fh if function supported
- // AH = status
- // 00h successful
- // ES:DI buffer filled
- // 01h failed
- // ---VBE v2.0---
- // 02h function not supported by current hardware configuration
- // 03h function invalid in current video mode
- //
- // Determine whether VESA BIOS extensions are present and the
- // capabilities supported by the display adapter
- //
- // Installation check;VESA SuperVGA
- Regs.w.ax = 0x4F00;
- Regs.w.es = BIOSCALLBUFSEGMENT;
- Regs.w.di = BIOSCALLBUFOFFSET;
- Int386(0x10, &Regs, &Regs);
-
- DbgPrint((DPRINT_UI, "AL = 0x%x\n", Regs.b.al));
- DbgPrint((DPRINT_UI, "AH = 0x%x\n", Regs.b.ah));
-
- if (Regs.w.ax != 0x004F)
- {
- DbgPrint((DPRINT_UI, "Failed.\n"));
- return 0x0000;
- }
-
- DbgPrint((DPRINT_UI, "Supported.\n"));
- DbgPrint((DPRINT_UI, "SvgaInfo->Signature[4] = %c%c%c%c\n", SvgaInfo->Signature[0], SvgaInfo->Signature[1], SvgaInfo->Signature[2], SvgaInfo->Signature[3]));
- DbgPrint((DPRINT_UI, "SvgaInfo->VesaVersion = v%d.%d\n", ((SvgaInfo->VesaVersion >> 8) & 0xFF), (SvgaInfo->VesaVersion & 0xFF)));
- DbgPrint((DPRINT_UI, "SvgaInfo->OemNamePtr = 0x%x\n", SvgaInfo->OemNamePtr));
- DbgPrint((DPRINT_UI, "SvgaInfo->Capabilities = 0x%x\n", SvgaInfo->Capabilities));
- DbgPrint((DPRINT_UI, "SvgaInfo->VideoMemory = %dK\n", SvgaInfo->TotalVideoMemory * 64));
- DbgPrint((DPRINT_UI, "---VBE v2.0 ---\n"));
- DbgPrint((DPRINT_UI, "SvgaInfo->OemSoftwareVersion = v%d.%d\n", ((SvgaInfo->OemSoftwareVersion >> 8) & 0x0F) + (((SvgaInfo->OemSoftwareVersion >> 12) & 0x0F) * 10), (SvgaInfo->OemSoftwareVersion & 0x0F) + (((SvgaInfo->OemSoftwareVersion >> 4) & 0x0F) * 10)));
- DbgPrint((DPRINT_UI, "SvgaInfo->VendorNamePtr = 0x%x\n", SvgaInfo->VendorNamePtr));
- DbgPrint((DPRINT_UI, "SvgaInfo->ProductNamePtr = 0x%x\n", SvgaInfo->ProductNamePtr));
- DbgPrint((DPRINT_UI, "SvgaInfo->ProductRevisionStringPtr = 0x%x\n", SvgaInfo->ProductRevisionStringPtr));
- DbgPrint((DPRINT_UI, "SvgaInfo->VBE/AF Version = 0x%x (BCD WORD)\n", SvgaInfo->VBE_AF_Version));
-
- //DbgPrint((DPRINT_UI, "\nSupported VESA and OEM video modes:\n"));
- //VideoModes = (USHORT*)SvgaInfo->SupportedModeListPtr;
- //for (Index=0; VideoModes[Index]!=0xFFFF; Index++)
- //{
- // DbgPrint((DPRINT_UI, "Mode %d: 0x%x\n", Index, VideoModes[Index]));
- //}
-
- //if (SvgaInfo->VesaVersion >= 0x0200)
- //{
- // DbgPrint((DPRINT_UI, "\nSupported accelerated video modes (VESA v2.0):\n"));
- // VideoModes = (USHORT*)SvgaInfo->AcceleratedModeListPtr;
- // for (Index=0; VideoModes[Index]!=0xFFFF; Index++)
- // {
- // DbgPrint((DPRINT_UI, "Mode %d: 0x%x\n", Index, VideoModes[Index]));
- // }
- //}
-
- DbgPrint((DPRINT_UI, "\n"));
-
- return SvgaInfo->VesaVersion;
-}
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/mach.c b/reactos/boot/freeldr/freeldr/arch/amd64/mach.c
deleted file mode 100644
index bd168ea69d2..00000000000
--- a/reactos/boot/freeldr/freeldr/arch/amd64/mach.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* $Id: machpc.c 32173 2008-02-07 00:43:09Z ros-arm-bringup $
- *
- * FreeLoader
- *
- * 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.
- *
- * This 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include
-
-VOID
-MachInit(const char *CmdLine)
-{
-// EnableA20();
-//DbgPrint((DPRINT_MEMORY, "MachInit.\n"));
- /* Setup vtbl */
- MachVtbl.ConsPutChar = PcConsPutChar;
- MachVtbl.ConsKbHit = PcConsKbHit;
- MachVtbl.ConsGetCh = PcConsGetCh;
- MachVtbl.VideoClearScreen = PcVideoClearScreen;
- MachVtbl.VideoSetDisplayMode = PcVideoSetDisplayMode;
- MachVtbl.VideoGetDisplaySize = PcVideoGetDisplaySize;
- MachVtbl.VideoGetBufferSize = PcVideoGetBufferSize;
- MachVtbl.VideoSetTextCursorPosition = PcVideoSetTextCursorPosition;
- MachVtbl.VideoSetTextCursorPosition = PcVideoSetTextCursorPosition;
- MachVtbl.VideoHideShowTextCursor = PcVideoHideShowTextCursor;
- MachVtbl.VideoPutChar = PcVideoPutChar;
- MachVtbl.VideoCopyOffScreenBufferToVRAM = PcVideoCopyOffScreenBufferToVRAM;
- MachVtbl.VideoIsPaletteFixed = PcVideoIsPaletteFixed;
- MachVtbl.VideoSetPaletteColor = PcVideoSetPaletteColor;
- MachVtbl.VideoGetPaletteColor = PcVideoGetPaletteColor;
- MachVtbl.VideoSync = PcVideoSync;
- MachVtbl.Beep = PcBeep;
- MachVtbl.PrepareForReactOS = PcPrepareForReactOS;
- MachVtbl.GetMemoryMap = PcMemGetMemoryMap;
- MachVtbl.DiskGetBootVolume = DiskGetBootVolume;
- MachVtbl.DiskGetSystemVolume = DiskGetSystemVolume;
- MachVtbl.DiskGetBootPath = DiskGetBootPath;
- MachVtbl.DiskGetBootDevice = DiskGetBootDevice;
- MachVtbl.DiskBootingFromFloppy = DiskBootingFromFloppy;
- MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath;
- MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors;
- MachVtbl.DiskGetPartitionEntry = DiskGetPartitionEntry;
- MachVtbl.DiskGetDriveGeometry = PcDiskGetDriveGeometry;
- MachVtbl.DiskGetCacheableBlockCount = PcDiskGetCacheableBlockCount;
- MachVtbl.GetTime = PcGetTime;
- MachVtbl.HwDetect = PcHwDetect;
-}
-
-VOID
-PcPrepareForReactOS(IN BOOLEAN Setup)
-{
- //
- // On PC, prepare video and turn off the floppy motor
- //
-// PcVideoPrepareForReactOS(Setup);
-// DiskStopFloppyMotor();
-}
-/* EOF */
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/pccons.c b/reactos/boot/freeldr/freeldr/arch/amd64/pccons.c
deleted file mode 100644
index a146f01b33f..00000000000
--- a/reactos/boot/freeldr/freeldr/arch/amd64/pccons.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/* $Id: pccons.c 21917 2006-05-16 23:09:41Z hpoussin $
- *
- * FreeLoader
- *
- * 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.
- *
- * This 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include
-
-#define TEXTMODE_BUFFER 0xb8000
-#define TEXTMODE_BUFFER_SIZE 0x8000
-
-#define TEXT_COLS 80
-#define TEXT_LINES 25
-
-VOID
-PcConsPutChar(int Ch)
-{
- REGS Regs;
-
- /* If we are displaying a CR '\n' then do a LF also */
- if ('\n' == Ch)
- {
- /* Display the LF */
- PcConsPutChar('\r');
- }
-
- /* If we are displaying a TAB '\t' then display 8 spaces ' ' */
- if ('\t' == Ch)
- {
- /* Display the 8 spaces ' ' */
- PcConsPutChar(' ');
- PcConsPutChar(' ');
- PcConsPutChar(' ');
- PcConsPutChar(' ');
- PcConsPutChar(' ');
- PcConsPutChar(' ');
- PcConsPutChar(' ');
- PcConsPutChar(' ');
- return;
- }
-
- /* Int 10h AH=0Eh
- * VIDEO - TELETYPE OUTPUT
- *
- * AH = 0Eh
- * AL = character to write
- * BH = page number
- * BL = foreground color (graphics modes only)
- */
- Regs.b.ah = 0x0E;
- Regs.b.al = Ch;
- Regs.w.bx = 1;
- Int386(0x10, &Regs, &Regs);
-}
-
-BOOLEAN
-PcConsKbHit(VOID)
-{
- REGS Regs;
-
- /* Int 16h AH=01h
- * KEYBOARD - CHECK FOR KEYSTROKE
- *
- * AH = 01h
- * Return:
- * ZF set if no keystroke available
- * ZF clear if keystroke available
- * AH = BIOS scan code
- * AL = ASCII character
- */
- Regs.b.ah = 0x01;
- Int386(0x16, &Regs, &Regs);
-
- return 0 == (Regs.x.eflags & I386FLAG_ZF);
-}
-
-int
-PcConsGetCh(void)
-{
- REGS Regs;
- static BOOLEAN ExtendedKey = FALSE;
- static char ExtendedScanCode = 0;
-
- /* If the last time we were called an
- * extended key was pressed then return
- * that keys scan code. */
- if (ExtendedKey)
- {
- ExtendedKey = FALSE;
- return ExtendedScanCode;
- }
-
- /* Int 16h AH=00h
- * KEYBOARD - GET KEYSTROKE
- *
- * AH = 00h
- * Return:
- * AH = BIOS scan code
- * AL = ASCII character
- */
- Regs.b.ah = 0x00;
- Int386(0x16, &Regs, &Regs);
-
- /* Check for an extended keystroke */
- if (0 == Regs.b.al)
- {
- ExtendedKey = TRUE;
- ExtendedScanCode = Regs.b.ah;
- }
-
- /* Return keystroke */
- return Regs.b.al;
-}
-
-/* EOF */
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/pcdisk.c b/reactos/boot/freeldr/freeldr/arch/amd64/pcdisk.c
deleted file mode 100644
index cd35497cc6b..00000000000
--- a/reactos/boot/freeldr/freeldr/arch/amd64/pcdisk.c
+++ /dev/null
@@ -1,455 +0,0 @@
-/*
- * FreeLoader
- * Copyright (C) 1998-2003 Brian Palmer
- *
- * 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.
- *
- * This 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include
-
-#define NDEBUG
-#include
-
-typedef struct
-{
- UCHAR PacketSize; // 00h - Size of packet (10h or 18h)
- UCHAR Reserved; // 01h - Reserved (0)
- USHORT LBABlockCount; // 02h - Number of blocks to transfer (max 007Fh for Phoenix EDD)
- USHORT TransferBufferOffset; // 04h - Transfer buffer offset (seg:off)
- USHORT TransferBufferSegment; // Transfer buffer segment (seg:off)
- ULONGLONG LBAStartBlock; // 08h - Starting absolute block number
- //ULONGLONG TransferBuffer64; // 10h - (EDD-3.0, optional) 64-bit flat address of transfer buffer
- // used if DWORD at 04h is FFFFh:FFFFh
- // Commented since some earlier BIOSes refuse to work with
- // such extended structure
-} PACKED I386_DISK_ADDRESS_PACKET, *PI386_DISK_ADDRESS_PACKET;
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-// FUNCTIONS
-/////////////////////////////////////////////////////////////////////////////////////////////
-
-static BOOLEAN PcDiskResetController(ULONG DriveNumber)
-{
- REGS RegsIn;
- REGS RegsOut;
-
- DbgPrint((DPRINT_DISK, "PcDiskResetController(0x%x) DISK OPERATION FAILED -- RESETTING CONTROLLER\n", DriveNumber));
-
- // BIOS Int 13h, function 0 - Reset disk system
- // AH = 00h
- // DL = drive (if bit 7 is set both hard disks and floppy disks reset)
- // Return:
- // AH = status
- // CF clear if successful
- // CF set on error
- RegsIn.b.ah = 0x00;
- RegsIn.b.dl = DriveNumber;
-
- // Reset the disk controller
- Int386(0x13, &RegsIn, &RegsOut);
-
- return INT386_SUCCESS(RegsOut);
-}
-
-static BOOLEAN PcDiskReadLogicalSectorsLBA(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer)
-{
- REGS RegsIn;
- REGS RegsOut;
- ULONG RetryCount;
- PI386_DISK_ADDRESS_PACKET Packet = (PI386_DISK_ADDRESS_PACKET)(BIOSCALLBUFFER);
-
- DbgPrint((DPRINT_DISK, "PcDiskReadLogicalSectorsLBA() DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d Buffer: 0x%x\n", DriveNumber, SectorNumber, SectorCount, Buffer));
-
- // BIOS int 0x13, function 42h - IBM/MS INT 13 Extensions - EXTENDED READ
- RegsIn.b.ah = 0x42; // Subfunction 42h
- RegsIn.b.dl = DriveNumber; // Drive number in DL (0 - floppy, 0x80 - harddisk)
- RegsIn.x.ds = BIOSCALLBUFSEGMENT; // DS:SI -> disk address packet
- RegsIn.w.si = BIOSCALLBUFOFFSET;
-
- // Setup disk address packet
- RtlZeroMemory(Packet, sizeof(I386_DISK_ADDRESS_PACKET));
- Packet->PacketSize = sizeof(I386_DISK_ADDRESS_PACKET);
- Packet->Reserved = 0;
- Packet->LBABlockCount = SectorCount;
- Packet->TransferBufferOffset = ((ULONG_PTR)Buffer) & 0x0F;
- Packet->TransferBufferSegment = ((ULONG_PTR)Buffer) >> 4;
- Packet->LBAStartBlock = SectorNumber;
-
- // BIOS int 0x13, function 42h - IBM/MS INT 13 Extensions - EXTENDED READ
- // Return:
- // CF clear if successful
- // AH = 00h
- // CF set on error
- // AH = error code
- // disk address packet's block count field set to the
- // number of blocks successfully transferred
-
- // Retry 3 times
- for (RetryCount=0; RetryCount<3; RetryCount++)
- {
- Int386(0x13, &RegsIn, &RegsOut);
-
- // If it worked return TRUE
- if (INT386_SUCCESS(RegsOut))
- {
- return TRUE;
- }
- // If it was a corrected ECC error then the data is still good
- else if (RegsOut.b.ah == 0x11)
- {
- return TRUE;
- }
- // If it failed the do the next retry
- else
- {
- PcDiskResetController(DriveNumber);
-
- continue;
- }
- }
-
- // If we get here then the read failed
- DiskError("Disk Read Failed in LBA mode", RegsOut.b.ah);
-
- return FALSE;
-}
-
-static BOOLEAN PcDiskReadLogicalSectorsCHS(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer)
-{
- ULONG PhysicalSector;
- ULONG PhysicalHead;
- ULONG PhysicalTrack;
- GEOMETRY DriveGeometry;
- ULONG NumberOfSectorsToRead;
- REGS RegsIn;
- REGS RegsOut;
- ULONG RetryCount;
-
- DbgPrint((DPRINT_DISK, "PcDiskReadLogicalSectorsCHS()\n"));
-
- //
- // Get the drive geometry
- //
- if (!MachDiskGetDriveGeometry(DriveNumber, &DriveGeometry) ||
- DriveGeometry.Sectors == 0 ||
- DriveGeometry.Heads == 0)
- {
- return FALSE;
- }
-
- while (SectorCount)
- {
-
- //
- // Calculate the physical disk offsets
- //
- PhysicalSector = 1 + (SectorNumber % DriveGeometry.Sectors);
- PhysicalHead = (SectorNumber / DriveGeometry.Sectors) % DriveGeometry.Heads;
- PhysicalTrack = (SectorNumber / DriveGeometry.Sectors) / DriveGeometry.Heads;
-
- //
- // Calculate how many sectors we need to read this round
- //
- if (PhysicalSector > 1)
- {
- if (SectorCount >= (DriveGeometry.Sectors - (PhysicalSector - 1)))
- NumberOfSectorsToRead = (DriveGeometry.Sectors - (PhysicalSector - 1));
- else
- NumberOfSectorsToRead = SectorCount;
- }
- else
- {
- if (SectorCount >= DriveGeometry.Sectors)
- NumberOfSectorsToRead = DriveGeometry.Sectors;
- else
- NumberOfSectorsToRead = SectorCount;
- }
-
- //
- // Make sure the read is within the geometry boundaries
- //
- if ((PhysicalHead >= DriveGeometry.Heads) ||
- (PhysicalTrack >= DriveGeometry.Cylinders) ||
- ((NumberOfSectorsToRead + PhysicalSector) > (DriveGeometry.Sectors + 1)) ||
- (PhysicalSector > DriveGeometry.Sectors))
- {
- DiskError("Disk read exceeds drive geometry limits.", 0);
- return FALSE;
- }
-
- // BIOS Int 13h, function 2 - Read Disk Sectors
- // AH = 02h
- // AL = number of sectors to read (must be nonzero)
- // CH = low eight bits of cylinder number
- // CL = sector number 1-63 (bits 0-5)
- // high two bits of cylinder (bits 6-7, hard disk only)
- // DH = head number
- // DL = drive number (bit 7 set for hard disk)
- // ES:BX -> data buffer
- // Return:
- // CF set on error
- // if AH = 11h (corrected ECC error), AL = burst length
- // CF clear if successful
- // AH = status
- // AL = number of sectors transferred
- // (only valid if CF set for some BIOSes)
- RegsIn.b.ah = 0x02;
- RegsIn.b.al = NumberOfSectorsToRead;
- RegsIn.b.ch = (PhysicalTrack & 0xFF);
- RegsIn.b.cl = (PhysicalSector + ((PhysicalTrack & 0x300) >> 2));
- RegsIn.b.dh = PhysicalHead;
- RegsIn.b.dl = DriveNumber;
- RegsIn.w.es = ((ULONG_PTR)Buffer) >> 4;
- RegsIn.w.bx = ((ULONG_PTR)Buffer) & 0x0F;
-
- //
- // Perform the read
- // Retry 3 times
- //
- for (RetryCount=0; RetryCount<3; RetryCount++)
- {
- Int386(0x13, &RegsIn, &RegsOut);
-
- // If it worked break out
- if (INT386_SUCCESS(RegsOut))
- {
- break;
- }
- // If it was a corrected ECC error then the data is still good
- else if (RegsOut.b.ah == 0x11)
- {
- break;
- }
- // If it failed the do the next retry
- else
- {
- PcDiskResetController(DriveNumber);
-
- continue;
- }
- }
-
- // If we retried 3 times then fail
- if (RetryCount >= 3)
- {
- DiskError("Disk Read Failed in CHS mode, after retrying 3 times", RegsOut.b.ah);
- return FALSE;
- }
-
- // I have learned that not all bioses return
- // the sector read count in the AL register (at least mine doesn't)
- // even if the sectors were read correctly. So instead
- // of checking the sector read count we will rely solely
- // on the carry flag being set on error
-
- Buffer = (PVOID)((ULONG_PTR)Buffer + (NumberOfSectorsToRead * DriveGeometry.BytesPerSector));
- SectorCount -= NumberOfSectorsToRead;
- SectorNumber += NumberOfSectorsToRead;
- }
-
- return TRUE;
-}
-
-static BOOLEAN PcDiskInt13ExtensionsSupported(ULONG DriveNumber)
-{
- static ULONG LastDriveNumber = 0xffffffff;
- static BOOLEAN LastSupported;
- REGS RegsIn;
- REGS RegsOut;
-
- DbgPrint((DPRINT_DISK, "PcDiskInt13ExtensionsSupported()\n"));
-
- if (DriveNumber == LastDriveNumber)
- {
- DbgPrint((DPRINT_DISK, "Using cached value %s for drive 0x%x\n", LastSupported ? "TRUE" : "FALSE", DriveNumber));
- return LastSupported;
- }
-
- // Some BIOSes report that extended disk access functions are not supported
- // when booting from a CD (e.g. Phoenix BIOS v6.00PG and Insyde BIOS shipping
- // with Intel Macs). Therefore we just return TRUE if we're booting from a CD -
- // we can assume that all El Torito capable BIOSes support INT 13 extensions.
- // We simply detect whether we're booting from CD by checking whether the drive
- // number is >= 0x90. It's 0x90 on the Insyde BIOS, and 0x9F on most other BIOSes.
- if (DriveNumber >= 0x90)
- {
- LastSupported = TRUE;
- return TRUE;
- }
-
- LastDriveNumber = DriveNumber;
-
- // IBM/MS INT 13 Extensions - INSTALLATION CHECK
- // AH = 41h
- // BX = 55AAh
- // DL = drive (80h-FFh)
- // Return:
- // CF set on error (extensions not supported)
- // AH = 01h (invalid function)
- // CF clear if successful
- // BX = AA55h if installed
- // AH = major version of extensions
- // 01h = 1.x
- // 20h = 2.0 / EDD-1.0
- // 21h = 2.1 / EDD-1.1
- // 30h = EDD-3.0
- // AL = internal use
- // CX = API subset support bitmap
- // DH = extension version (v2.0+ ??? -- not present in 1.x)
- //
- // Bitfields for IBM/MS INT 13 Extensions API support bitmap
- // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
- // Bit 1, removable drive controller functions (AH=45h,46h,48h,49h,INT 15/AH=52h) supported
- // Bit 2, enhanced disk drive (EDD) functions (AH=48h,AH=4Eh) supported
- // extended drive parameter table is valid
- // Bits 3-15 reserved
- RegsIn.b.ah = 0x41;
- RegsIn.w.bx = 0x55AA;
- RegsIn.b.dl = DriveNumber;
-
- // Reset the disk controller
- Int386(0x13, &RegsIn, &RegsOut);
-
- if (!INT386_SUCCESS(RegsOut))
- {
- // CF set on error (extensions not supported)
- LastSupported = FALSE;
- return FALSE;
- }
-
- if (RegsOut.w.bx != 0xAA55)
- {
- // BX = AA55h if installed
- LastSupported = FALSE;
- return FALSE;
- }
-
- if (!(RegsOut.w.cx & 0x0001))
- {
- // CX = API subset support bitmap
- // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
- printf("Suspicious API subset support bitmap 0x%x on device 0x%lx\n", RegsOut.w.cx, DriveNumber);
- LastSupported = FALSE;
- return FALSE;
- }
-
- LastSupported = TRUE;
- return TRUE;
-}
-
-BOOLEAN PcDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer)
-{
-
- DbgPrint((DPRINT_DISK, "PcDiskReadLogicalSectors() DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d Buffer: 0x%x\n", DriveNumber, SectorNumber, SectorCount, Buffer));
-
- //
- // Check to see if it is a fixed disk drive
- // If so then check to see if Int13 extensions work
- // If they do then use them, otherwise default back to BIOS calls
- //
- if ((DriveNumber >= 0x80) && PcDiskInt13ExtensionsSupported(DriveNumber))
- {
- DbgPrint((DPRINT_DISK, "Using Int 13 Extensions for read. PcDiskInt13ExtensionsSupported(%d) = %s\n", DriveNumber, PcDiskInt13ExtensionsSupported(DriveNumber) ? "TRUE" : "FALSE"));
-
- //
- // LBA is easy, nothing to calculate
- // Just do the read
- //
- return PcDiskReadLogicalSectorsLBA(DriveNumber, SectorNumber, SectorCount, Buffer);
- }
- else
- {
- // LBA is not supported default to the CHS calls
- return PcDiskReadLogicalSectorsCHS(DriveNumber, SectorNumber, SectorCount, Buffer);
- }
-
- return TRUE;
-}
-
-BOOLEAN
-PcDiskGetDriveGeometry(ULONG DriveNumber, PGEOMETRY Geometry)
-{
- REGS RegsIn;
- REGS RegsOut;
- ULONG Cylinders;
-
- DbgPrint((DPRINT_DISK, "DiskGetDriveGeometry()\n"));
-
- /* BIOS Int 13h, function 08h - Get drive parameters
- * AH = 08h
- * DL = drive (bit 7 set for hard disk)
- * ES:DI = 0000h:0000h to guard against BIOS bugs
- * Return:
- * CF set on error
- * AH = status (07h)
- * CF clear if successful
- * AH = 00h
- * AL = 00h on at least some BIOSes
- * BL = drive type (AT/PS2 floppies only)
- * CH = low eight bits of maximum cylinder number
- * CL = maximum sector number (bits 5-0)
- * high two bits of maximum cylinder number (bits 7-6)
- * DH = maximum head number
- * DL = number of drives
- * ES:DI -> drive parameter table (floppies only)
- */
- RegsIn.b.ah = 0x08;
- RegsIn.b.dl = DriveNumber;
- RegsIn.w.es = 0x0000;
- RegsIn.w.di = 0x0000;
-
- /* Get drive parameters */
- Int386(0x13, &RegsIn, &RegsOut);
-
- if (! INT386_SUCCESS(RegsOut))
- {
- return FALSE;
- }
-
- Cylinders = (RegsOut.b.cl & 0xC0) << 2;
- Cylinders += RegsOut.b.ch;
- Cylinders++;
- Geometry->Cylinders = Cylinders;
- Geometry->Heads = RegsOut.b.dh + 1;
- Geometry->Sectors = RegsOut.b.cl & 0x3F;
- Geometry->BytesPerSector = 512; /* Just assume 512 bytes per sector */
-
- return TRUE;
-}
-
-ULONG
-PcDiskGetCacheableBlockCount(ULONG DriveNumber)
-{
- GEOMETRY Geometry;
-
- /* If LBA is supported then the block size will be 64 sectors (32k)
- * If not then the block size is the size of one track */
- if (DiskInt13ExtensionsSupported(DriveNumber))
- {
- return 64;
- }
- /* Get the disk geometry
- * If this fails then we will just return 1 sector to be safe */
- else if (! PcDiskGetDriveGeometry(DriveNumber, &Geometry))
- {
- return 1;
- }
- else
- {
- return Geometry.Sectors;
- }
-}
-
-/* EOF */
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/pcmem.c b/reactos/boot/freeldr/freeldr/arch/amd64/pcmem.c
deleted file mode 100644
index 914a363cc9a..00000000000
--- a/reactos/boot/freeldr/freeldr/arch/amd64/pcmem.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/* $Id: pcmem.c 24238 2006-09-23 16:50:39Z fireball $
- *
- * FreeLoader
- *
- * 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.
- *
- * This 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * Note: Most of this code comes from the old file "i386mem.c", which
- * was Copyright (C) 1998-2003 Brian Palmer
- */
-
-#include
-
-#define NDEBUG
-#include
-
-static ULONG
-PcMemGetExtendedMemorySize(VOID)
-{
- REGS RegsIn;
- REGS RegsOut;
- ULONG MemorySize;
-
- DbgPrint((DPRINT_MEMORY, "GetExtendedMemorySize()\n"));
-
- /* Int 15h AX=E801h
- * Phoenix BIOS v4.0 - GET MEMORY SIZE FOR >64M CONFIGURATIONS
- *
- * AX = E801h
- * Return:
- * CF clear if successful
- * AX = extended memory between 1M and 16M, in K (max 3C00h = 15MB)
- * BX = extended memory above 16M, in 64K blocks
- * CX = configured memory 1M to 16M, in K
- * DX = configured memory above 16M, in 64K blocks
- * CF set on error
- */
- RegsIn.w.ax = 0xE801;
- Int386(0x15, &RegsIn, &RegsOut);
-
- DbgPrint((DPRINT_MEMORY, "Int15h AX=E801h\n"));
- DbgPrint((DPRINT_MEMORY, "AX = 0x%x\n", RegsOut.w.ax));
- DbgPrint((DPRINT_MEMORY, "BX = 0x%x\n", RegsOut.w.bx));
- DbgPrint((DPRINT_MEMORY, "CX = 0x%x\n", RegsOut.w.cx));
- DbgPrint((DPRINT_MEMORY, "DX = 0x%x\n", RegsOut.w.dx));
- DbgPrint((DPRINT_MEMORY, "CF set = %s\n\n", (RegsOut.x.eflags & I386FLAG_CF) ? "TRUE" : "FALSE"));
-
- if (INT386_SUCCESS(RegsOut))
- {
- /* If AX=BX=0000h the use CX and DX */
- if (RegsOut.w.ax == 0)
- {
- /* Return extended memory size in K */
- MemorySize = RegsOut.w.dx * 64;
- MemorySize += RegsOut.w.cx;
- return MemorySize;
- }
- else
- {
- /* Return extended memory size in K */
- MemorySize = RegsOut.w.bx * 64;
- MemorySize += RegsOut.w.ax;
- return MemorySize;
- }
- }
-
- /* If we get here then Int15 Func E801h didn't work */
- /* So try Int15 Func 88h */
-
- /* Int 15h AH=88h
- * SYSTEM - GET EXTENDED MEMORY SIZE (286+)
- *
- * AH = 88h
- * Return:
- * CF clear if successful
- * AX = number of contiguous KB starting at absolute address 100000h
- * CF set on error
- * AH = status
- * 80h invalid command (PC,PCjr)
- * 86h unsupported function (XT,PS30)
- */
- RegsIn.b.ah = 0x88;
- Int386(0x15, &RegsIn, &RegsOut);
-
- DbgPrint((DPRINT_MEMORY, "Int15h AH=88h\n"));
- DbgPrint((DPRINT_MEMORY, "AX = 0x%x\n", RegsOut.w.ax));
- DbgPrint((DPRINT_MEMORY, "CF set = %s\n\n", (RegsOut.x.eflags & I386FLAG_CF) ? "TRUE" : "FALSE"));
-
- if (INT386_SUCCESS(RegsOut) && RegsOut.w.ax != 0)
- {
- MemorySize = RegsOut.w.ax;
- return MemorySize;
- }
-
- /* If we get here then Int15 Func 88h didn't work */
- /* So try reading the CMOS */
- WRITE_PORT_UCHAR((PUCHAR)0x70, 0x31);
- MemorySize = READ_PORT_UCHAR((PUCHAR)0x71);
- MemorySize = (MemorySize & 0xFFFF);
- MemorySize = (MemorySize << 8);
-
- DbgPrint((DPRINT_MEMORY, "Int15h Failed\n"));
- DbgPrint((DPRINT_MEMORY, "CMOS reports: 0x%x\n", MemorySize));
-
- return MemorySize;
-}
-
-static ULONG
-PcMemGetConventionalMemorySize(VOID)
-{
- REGS Regs;
-
- DbgPrint((DPRINT_MEMORY, "GetConventionalMemorySize()\n"));
-
- /* Int 12h
- * BIOS - GET MEMORY SIZE
- *
- * Return:
- * AX = kilobytes of contiguous memory starting at absolute address 00000h
- *
- * This call returns the contents of the word at 0040h:0013h;
- * in PC and XT, this value is set from the switches on the motherboard
- */
- Regs.w.ax = 0;
- Int386(0x12, &Regs, &Regs);
-
- DbgPrint((DPRINT_MEMORY, "Int12h\n"));
- DbgPrint((DPRINT_MEMORY, "AX = 0x%x\n\n", Regs.w.ax));
-
- return (ULONG)Regs.w.ax;
-}
-
-static ULONG
-PcMemGetBiosMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize)
-{
- REGS Regs;
- ULONG MapCount;
-
- DbgPrint((DPRINT_MEMORY, "GetBiosMemoryMap()\n"));
-
- /* Int 15h AX=E820h
- * Newer BIOSes - GET SYSTEM MEMORY MAP
- *
- * AX = E820h
- * EAX = 0000E820h
- * EDX = 534D4150h ('SMAP')
- * EBX = continuation value or 00000000h to start at beginning of map
- * ECX = size of buffer for result, in bytes (should be >= 20 bytes)
- * ES:DI -> buffer for result
- * Return:
- * CF clear if successful
- * EAX = 534D4150h ('SMAP')
- * ES:DI buffer filled
- * EBX = next offset from which to copy or 00000000h if all done
- * ECX = actual length returned in bytes
- * CF set on error
- * AH = error code (86h)
- */
- Regs.x.eax = 0x0000E820;
- Regs.x.edx = 0x534D4150; /* ('SMAP') */
- Regs.x.ebx = 0x00000000;
- Regs.x.ecx = sizeof(BIOS_MEMORY_MAP);
- Regs.w.es = BIOSCALLBUFSEGMENT;
- Regs.w.di = BIOSCALLBUFOFFSET;
- for (MapCount = 0; MapCount < MaxMemoryMapSize; MapCount++)
- {
- Int386(0x15, &Regs, &Regs);
-
- DbgPrint((DPRINT_MEMORY, "Memory Map Entry %d\n", MapCount));
- DbgPrint((DPRINT_MEMORY, "Int15h AX=E820h\n"));
- DbgPrint((DPRINT_MEMORY, "EAX = 0x%x\n", Regs.x.eax));
- DbgPrint((DPRINT_MEMORY, "EBX = 0x%x\n", Regs.x.ebx));
- DbgPrint((DPRINT_MEMORY, "ECX = 0x%x\n", Regs.x.ecx));
- DbgPrint((DPRINT_MEMORY, "CF set = %s\n", (Regs.x.eflags & I386FLAG_CF) ? "TRUE" : "FALSE"));
-
- /* If the BIOS didn't return 'SMAP' in EAX then
- * it doesn't support this call */
- if (Regs.x.eax != 0x534D4150)
- {
- break;
- }
-
- /* Copy data to caller's buffer */
- RtlCopyMemory(&BiosMemoryMap[MapCount], (PVOID)BIOSCALLBUFFER, Regs.x.ecx);
-
- DbgPrint((DPRINT_MEMORY, "BaseAddress: 0x%p\n", (PVOID)BiosMemoryMap[MapCount].BaseAddress));
- DbgPrint((DPRINT_MEMORY, "Length: 0x%p\n", (PVOID)BiosMemoryMap[MapCount].Length));
- DbgPrint((DPRINT_MEMORY, "Type: 0x%x\n", BiosMemoryMap[MapCount].Type));
- DbgPrint((DPRINT_MEMORY, "Reserved: 0x%x\n", BiosMemoryMap[MapCount].Reserved));
- DbgPrint((DPRINT_MEMORY, "\n"));
-
- /* If the continuation value is zero or the
- * carry flag is set then this was
- * the last entry so we're done */
- if (Regs.x.ebx == 0x00000000 || !INT386_SUCCESS(Regs))
- {
- MapCount++;
- DbgPrint((DPRINT_MEMORY, "End Of System Memory Map!\n\n"));
- break;
- }
-
- /* Setup the registers for the next call */
- Regs.x.eax = 0x0000E820;
- Regs.x.edx = 0x534D4150; /* ('SMAP') */
- /* Regs.x.ebx = 0x00000001; Continuation value already set by the BIOS */
- Regs.x.ecx = sizeof(BIOS_MEMORY_MAP);
- Regs.w.es = BIOSCALLBUFSEGMENT;
- Regs.w.di = BIOSCALLBUFOFFSET;
- }
-
- return MapCount;
-}
-
-ULONG
-PcMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize)
-{
- ULONG EntryCount;
-
- EntryCount = PcMemGetBiosMemoryMap(BiosMemoryMap, MaxMemoryMapSize);
-
- /* If the BIOS didn't provide a memory map, synthesize one */
- if (0 == EntryCount && 2 <= MaxMemoryMapSize)
- {
- /* Conventional memory */
- BiosMemoryMap[0].BaseAddress = 0;
- BiosMemoryMap[0].Length = PcMemGetConventionalMemorySize() * 1024;
- BiosMemoryMap[0].Type = BiosMemoryUsable;
- /* Extended memory */
- BiosMemoryMap[1].BaseAddress = 1024 * 1024;
- BiosMemoryMap[1].Length = PcMemGetExtendedMemorySize() * 1024;
- BiosMemoryMap[1].Type = BiosMemoryUsable;
- EntryCount = 2;
- }
-
- return EntryCount;
-}
-
-/* EOF */
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/pcrtc.c b/reactos/boot/freeldr/freeldr/arch/amd64/pcrtc.c
deleted file mode 100644
index 1e9234fcdad..00000000000
--- a/reactos/boot/freeldr/freeldr/arch/amd64/pcrtc.c
+++ /dev/null
@@ -1,5 +0,0 @@
-/* No need to duplicate code ; import the i386 version */
-
-#include "../i386/pcrtc.c"
-
-/* EOF */
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/pcvideo.c b/reactos/boot/freeldr/freeldr/arch/amd64/pcvideo.c
deleted file mode 100644
index fd3668c38b4..00000000000
--- a/reactos/boot/freeldr/freeldr/arch/amd64/pcvideo.c
+++ /dev/null
@@ -1,1122 +0,0 @@
-/* $Id: pcvideo.c 31712 2008-01-11 11:35:09Z hpoussin $
- *
- * FreeLoader
- *
- * 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.
- *
- * This 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include
-
-#define NDEBUG
-#include
-
-#define VIDEOPORT_PALETTE_READ 0x03C7
-#define VIDEOPORT_PALETTE_WRITE 0x03C8
-#define VIDEOPORT_PALETTE_DATA 0x03C9
-#define VIDEOPORT_VERTICAL_RETRACE 0x03DA
-
-#define VIDEOVGA_MEM_ADDRESS 0xA0000
-#define VIDEOTEXT_MEM_ADDRESS 0xB8000
-#define VIDEOTEXT_MEM_SIZE 0x8000
-
-#define VIDEOCARD_CGA_OR_OTHER 0
-#define VIDEOCARD_EGA 1
-#define VIDEOCARD_VGA 2
-
-#define VIDEOMODE_NORMAL_TEXT 0
-#define VIDEOMODE_EXTENDED_TEXT 1
-#define VIDEOMODE_80X28 0x501C
-#define VIDEOMODE_80X30 0x501E
-#define VIDEOMODE_80X34 0x5022
-#define VIDEOMODE_80X43 0x502B
-#define VIDEOMODE_80X60 0x503C
-#define VIDEOMODE_132X25 0x8419
-#define VIDEOMODE_132X43 0x842B
-#define VIDEOMODE_132X50 0x8432
-#define VIDEOMODE_132X60 0x843C
-
-#define VERTRES_200_SCANLINES 0x00
-#define VERTRES_350_SCANLINES 0x01
-#define VERTRES_400_SCANLINES 0x02
-
-typedef struct
-{
- USHORT ModeAttributes; /* mode attributes (see #00080) */
- UCHAR WindowAttributesA; /* window attributes, window A (see #00081) */
- UCHAR WindowsAttributesB; /* window attributes, window B (see #00081) */
- USHORT WindowGranularity; /* window granularity in KB */
- USHORT WindowSize; /* window size in KB */
- USHORT WindowAStartSegment; /* start segment of window A (0000h if not supported) */
- USHORT WindowBStartSegment; /* start segment of window B (0000h if not supported) */
- ULONG WindowPositioningFunction; /* -> FAR window positioning function (equivalent to AX=4F05h) */
- USHORT BytesPerScanLine; /* bytes per scan line */
- /* ---remainder is optional for VESA modes in v1.0/1.1, needed for OEM modes--- */
- USHORT WidthInPixels; /* width in pixels (graphics) or characters (text) */
- USHORT HeightInPixels; /* height in pixels (graphics) or characters (text) */
- UCHAR CharacterWidthInPixels; /* width of character cell in pixels */
- UCHAR CharacterHeightInPixels; /* height of character cell in pixels */
- UCHAR NumberOfMemoryPlanes; /* number of memory planes */
- UCHAR BitsPerPixel; /* number of bits per pixel */
- UCHAR NumberOfBanks; /* number of banks */
- UCHAR MemoryModel; /* memory model type (see #00082) */
- UCHAR BankSize; /* size of bank in KB */
- UCHAR NumberOfImagePanes; /* number of image pages (less one) that will fit in video RAM */
- UCHAR Reserved1; /* reserved (00h for VBE 1.0-2.0, 01h for VBE 3.0) */
- /* ---VBE v1.2+ --- */
- UCHAR RedMaskSize; /* red mask size */
- UCHAR RedMaskPosition; /* red field position */
- UCHAR GreenMaskSize; /* green mask size */
- UCHAR GreenMaskPosition; /* green field size */
- UCHAR BlueMaskSize; /* blue mask size */
- UCHAR BlueMaskPosition; /* blue field size */
- UCHAR ReservedMaskSize; /* reserved mask size */
- UCHAR ReservedMaskPosition; /* reserved mask position */
- UCHAR DirectColorModeInfo; /* direct color mode info */
- /* bit 0:Color ramp is programmable */
- /* bit 1:Bytes in reserved field may be used by application */
- /* ---VBE v2.0+ --- */
- ULONG LinearVideoBufferAddress; /* physical address of linear video buffer */
- ULONG OffscreenMemoryPointer; /* pointer to start of offscreen memory */
- USHORT OffscreenMemorySize; /* KB of offscreen memory */
- /* ---VBE v3.0 --- */
- USHORT LinearBytesPerScanLine; /* bytes per scan line in linear modes */
- UCHAR BankedNumberOfImages; /* number of images (less one) for banked video modes */
- UCHAR LinearNumberOfImages; /* number of images (less one) for linear video modes */
- UCHAR LinearRedMaskSize; /* linear modes:Size of direct color red mask (in bits) */
- UCHAR LinearRedMaskPosition; /* linear modes:Bit position of red mask LSB (e.g. shift count) */
- UCHAR LinearGreenMaskSize; /* linear modes:Size of direct color green mask (in bits) */
- UCHAR LinearGreenMaskPosition; /* linear modes:Bit position of green mask LSB (e.g. shift count) */
- UCHAR LinearBlueMaskSize; /* linear modes:Size of direct color blue mask (in bits) */
- UCHAR LinearBlueMaskPosition; /* linear modes:Bit position of blue mask LSB (e.g. shift count) */
- UCHAR LinearReservedMaskSize; /* linear modes:Size of direct color reserved mask (in bits) */
- UCHAR LinearReservedMaskPosition; /* linear modes:Bit position of reserved mask LSB */
- ULONG MaximumPixelClock; /* maximum pixel clock for graphics video mode, in Hz */
- UCHAR Reserved2[190]; /* 190 BYTEs reserved (0) */
-} PACKED SVGA_MODE_INFORMATION, *PSVGA_MODE_INFORMATION;
-
-static ULONG BiosVideoMode; /* Current video mode as known by BIOS */
-static ULONG ScreenWidth = 80; /* Screen Width in characters */
-static ULONG ScreenHeight = 25; /* Screen Height in characters */
-static ULONG BytesPerScanLine = 160; /* Number of bytes per scanline (delta) */
-static VIDEODISPLAYMODE DisplayMode = VideoTextMode; /* Current display mode */
-static BOOLEAN VesaVideoMode = FALSE; /* Are we using a VESA mode? */
-static SVGA_MODE_INFORMATION VesaVideoModeInformation; /* Only valid when in VESA mode */
-static ULONG CurrentMemoryBank = 0; /* Currently selected VESA bank */
-
-static ULONG
-PcVideoDetectVideoCard(VOID)
-{
- REGS Regs;
-
- /* Int 10h AH=12h BL=10h
- * VIDEO - ALTERNATE FUNCTION SELECT (PS,EGA,VGA,MCGA) - GET EGA INFO
- *
- * AH = 12h
- * BL = 10h
- * Return:
- * BH = video state
- * 00h color mode in effect (I/O port 3Dxh)
- * 01h mono mode in effect (I/O port 3Bxh)
- * BL = installed memory (00h = 64K, 01h = 128K, 02h = 192K, 03h = 256K)
- * CH = feature connector bits
- * CL = switch settings
- * AH destroyed (at least by Tseng ET4000 BIOS v8.00n)
- *
- * Installation check;EGA
- */
- Regs.b.ah = 0x12;
- Regs.b.bl = 0x10;
- Int386(0x10, &Regs, &Regs);
-
- /* If BL is still equal to 0x10 then there is no EGA/VGA present */
- if (0x10 == Regs.b.bl)
- {
- return VIDEOCARD_CGA_OR_OTHER;
- }
-
- /* Int 10h AX=1A00h
- * VIDEO - GET DISPLAY COMBINATION CODE (PS,VGA/MCGA)
- *
- * AX = 1A00h
- * Return:
- * AL = 1Ah if function was supported
- * BL = active display code
- * BH = alternate display code
- *
- * This function is commonly used to check for the presence of a VGA.
- *
- * Installation check;VGA
- *
- * Values for display combination code:
- * 00h no display
- * 01h monochrome adapter w/ monochrome display
- * 02h CGA w/ color display
- * 03h reserved
- * 04h EGA w/ color display
- * 05h EGA w/ monochrome display
- * 06h PGA w/ color display
- * 07h VGA w/ monochrome analog display
- * 08h VGA w/ color analog display
- * 09h reserved
- * 0Ah MCGA w/ digital color display
- * 0Bh MCGA w/ monochrome analog display
- * 0Ch MCGA w/ color analog display
- * FFh unknown display type
- */
- Regs.b.ah = 0x12;
- Regs.b.bl = 0x10;
- Int386(0x10, &Regs, &Regs);
-
- if (0x1a == Regs.b.al)
- {
- return VIDEOCARD_VGA;
- }
- else
- {
- return VIDEOCARD_EGA;
- }
-}
-
-static VOID PcVideoSetBiosMode(ULONG VideoMode)
-{
- REGS Regs;
-
- /* Int 10h AH=00h
- * VIDEO - SET VIDEO MODE
- *
- * AH = 00h
- * AL = desired video mode
- * Return:
- * AL = video mode flag (Phoenix, AMI BIOS)
- * 20h mode > 7
- * 30h modes 0-5 and 7
- * 3Fh mode 6
- * AL = CRT controller mode byte (Phoenix 386 BIOS v1.10)
- */
- Regs.b.ah = 0x00;
- Regs.b.al = VideoMode;
- Int386(0x10, &Regs, &Regs);
-}
-
-static VOID
-PcVideoSetFont8x8(VOID)
-{
- REGS Regs;
-
- /* Int 10h AX=1112h
- * VIDEO - TEXT-MODE CHARGEN - LOAD ROM 8x8 DBL-DOT PATTERNS (PS,EGA,VGA)
- *
- * AX = 1112h
- * BL = block to load
- * Return:
- * Nothing
- */
- Regs.w.ax = 0x1112;
- Regs.b.bl = 0x00;
- Int386(0x10, &Regs, &Regs);
-}
-
-static VOID
-PcVideoSetFont8x14(VOID)
-{
- REGS Regs;
-
- /* Int 10h AX=1111h
- * VIDEO - TEXT-MODE CHARGEN - LOAD ROM MONOCHROME PATTERNS (PS,EGA,VGA)
- *
- * AX = 1111h
- * BL = block to load
- * Return:
- * Nothing
- */
- Regs.w.ax = 0x1111;
- Regs.b.bl = 0;
- Int386(0x10, &Regs, &Regs);
-}
-
-static VOID
-PcVideoSelectAlternatePrintScreen(VOID)
-{
- REGS Regs;
-
- /* Int 10h AH=12h BL=20h
- * VIDEO - ALTERNATE FUNCTION SELECT (PS,EGA,VGA,MCGA) - ALTERNATE PRTSC
- *
- * AH = 12h
- * BL = 20h select alternate print screen routine
- * Return:
- * Nothing
- *
- * Installs a PrtSc routine from the video card's BIOS to replace the
- * default PrtSc handler from the ROM BIOS, which usually does not
- * understand screen heights other than 25 lines.
- *
- * Some adapters disable print-screen instead of enhancing it.
- */
- Regs.b.ah = 0x12;
- Regs.b.bl = 0x20;
- Int386(0x10, &Regs, &Regs);
-}
-
-static VOID
-PcVideoDisableCursorEmulation(VOID)
-{
- REGS Regs;
-
- /* Int 10h AH=12h BL=34h
- * VIDEO - ALTERNATE FUNCTION SELECT (VGA) - CURSOR EMULATION
- *
- * AH = 12h
- * BL = 34h
- * AL = new state
- * 00h enable alphanumeric cursor emulation
- * 01h disable alphanumeric cursor emulation
- * Return:
- * AL = 12h if function supported
- *
- * Specify whether the BIOS should automatically remap cursor start/end
- * according to the current character height in text modes.
- */
- Regs.b.ah = 0x12;
- Regs.b.bl = 0x34;
- Regs.b.al = 0x01;
- Int386(0x10, &Regs, &Regs);
-}
-
-static VOID
-PcVideoDefineCursor(ULONG StartScanLine, ULONG EndScanLine)
-{
- REGS Regs;
-
- /* Int 10h AH=01h
- * VIDEO - SET TEXT-MODE CURSOR SHAPE
- *
- * AH = 01h
- * CH = cursor start and options
- * CL = bottom scan line containing cursor (bits 0-4)
- * Return:
- * Nothing
- *
- * Specify the starting and ending scan lines to be occupied
- * by the hardware cursor in text modes.
- *
- * AMI 386 BIOS and AST Premier 386 BIOS will lock up the
- * system if AL is not equal to the current video mode.
- *
- * Bitfields for cursor start and options:
- *
- * Bit(s) Description
- * 7 should be zero
- * 6,5 cursor blink
- * (00=normal, 01=invisible, 10=erratic, 11=slow).
- * (00=normal, other=invisible on EGA/VGA)
- * 4-0 topmost scan line containing cursor
- */
- Regs.b.ah = 0x01;
- Regs.b.al = 0x03;
- Regs.b.ch = StartScanLine;
- Regs.b.cl = EndScanLine;
- Int386(0x10, &Regs, &Regs);
-}
-
-static VOID
-PcVideoSetVerticalResolution(ULONG ScanLines)
-{
- REGS Regs;
-
- /* Int 10h AH=12h BL=30h
- * VIDEO - ALTERNATE FUNCTION SELECT (VGA) - SELECT VERTICAL RESOLUTION
- *
- * AH = 12h
- * BL = 30h
- * AL = vertical resolution
- * 00h 200 scan lines
- * 01h 350 scan lines
- * 02h 400 scan lines
- * Return:
- * AL = 12h if function supported
- *
- * Specifiy the number of scan lines used to display text modes.
- *
- * The specified resolution will take effect on the next mode set.
- */
- Regs.b.ah = 0x12;
- Regs.b.bl = 0x30;
- Regs.b.al = ScanLines;
- Int386(0x10, &Regs, &Regs);
-}
-
-static VOID
-PcVideoSet480ScanLines(VOID)
-{
- INT_PTR CRTC;
-
- /* Read CRTC port */
- CRTC = READ_PORT_UCHAR((PUCHAR)0x03CC);
-
- if (CRTC & 1)
- {
- CRTC = 0x3D4;
- }
- else
- {
- CRTC = 0x3B4;
- }
-
- /* Vertical sync end (also unlocks CR0-7) */
- WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x11);
- WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0x0C);
-
- /* Vertical total */
- WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x06);
- WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0x0B);
-
- /* (vertical) overflow */
- WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x07);
- WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0x3E);
-
- /* Vertical sync start */
- WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x10);
- WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0xEA);
-
- /* Vertical display end */
- WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x12);
- WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0xDF);
-
- /* Vertical blank start */
- WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x15);
- WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0xE7);
-
- /* Vertical blank end */
- WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x16);
- WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0x04);
-
- /* Misc output register (read) */
- CRTC = READ_PORT_UCHAR((PUCHAR)0x03CC);
-
- /* Preserve clock select bits and color bit */
- CRTC = (CRTC & 0x0D);
- /* Set correct sync polarity */
- CRTC = (CRTC | 0xE2);
-
- /* (write) */
- WRITE_PORT_UCHAR((PUCHAR)0x03C2, CRTC);
-}
-
-static VOID
-PcVideoSetDisplayEnd(VOID)
-{
- INT_PTR CRTC;
-
- /* Read CRTC port */
- CRTC = READ_PORT_UCHAR((PUCHAR)0x03CC);
-
- if (CRTC & 1)
- {
- CRTC = 0x3D4;
- }
- else
- {
- CRTC = 0x3B4;
- }
-
- /* Vertical display end */
- WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x12);
- WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0xDF);
-}
-
-static BOOLEAN
-PcVideoVesaGetSVGAModeInformation(USHORT Mode, PSVGA_MODE_INFORMATION ModeInformation)
-{
- REGS Regs;
-
- RtlZeroMemory((PVOID)BIOSCALLBUFFER, 256);
-
- /* VESA SuperVGA BIOS - GET SuperVGA MODE INFORMATION
- * AX = 4F01h
- * CX = SuperVGA video mode (see #04082 for bitfields)
- * ES:DI -> 256-byte buffer for mode information (see #00079)
- * Return:
- * AL = 4Fh if function supported
- * AH = status
- * 00h successful
- * ES:DI buffer filled
- * 01h failed
- *
- * Desc: Determine the attributes of the specified video mode
- *
- * Note: While VBE 1.1 and higher will zero out all unused bytes
- * of the buffer, v1.0 did not, so applications that want to be
- * backward compatible should clear the buffer before calling
- */
- Regs.w.ax = 0x4F01;
- Regs.w.cx = Mode;
- Regs.w.es = BIOSCALLBUFSEGMENT;
- Regs.w.di = BIOSCALLBUFOFFSET;
- Int386(0x10, &Regs, &Regs);
-
- if (Regs.w.ax != 0x004F)
- {
- return FALSE;
- }
-
- RtlCopyMemory(ModeInformation, (PVOID)BIOSCALLBUFFER, sizeof(SVGA_MODE_INFORMATION));
-
- DbgPrint((DPRINT_UI, "\n"));
- DbgPrint((DPRINT_UI, "BiosVesaGetSVGAModeInformation() mode 0x%x\n", Mode));
- DbgPrint((DPRINT_UI, "ModeAttributes = 0x%x\n", ModeInformation->ModeAttributes));
- DbgPrint((DPRINT_UI, "WindowAttributesA = 0x%x\n", ModeInformation->WindowAttributesA));
- DbgPrint((DPRINT_UI, "WindowAttributesB = 0x%x\n", ModeInformation->WindowsAttributesB));
- DbgPrint((DPRINT_UI, "WindowGranularity = %dKB\n", ModeInformation->WindowGranularity));
- DbgPrint((DPRINT_UI, "WindowSize = %dKB\n", ModeInformation->WindowSize));
- DbgPrint((DPRINT_UI, "WindowAStartSegment = 0x%x\n", ModeInformation->WindowAStartSegment));
- DbgPrint((DPRINT_UI, "WindowBStartSegment = 0x%x\n", ModeInformation->WindowBStartSegment));
- DbgPrint((DPRINT_UI, "WindowPositioningFunction = 0x%x\n", ModeInformation->WindowPositioningFunction));
- DbgPrint((DPRINT_UI, "BytesPerScanLine = %d\n", ModeInformation->BytesPerScanLine));
- DbgPrint((DPRINT_UI, "WidthInPixels = %d\n", ModeInformation->WidthInPixels));
- DbgPrint((DPRINT_UI, "HeightInPixels = %d\n", ModeInformation->HeightInPixels));
- DbgPrint((DPRINT_UI, "CharacterWidthInPixels = %d\n", ModeInformation->CharacterWidthInPixels));
- DbgPrint((DPRINT_UI, "CharacterHeightInPixels = %d\n", ModeInformation->CharacterHeightInPixels));
- DbgPrint((DPRINT_UI, "NumberOfMemoryPlanes = %d\n", ModeInformation->NumberOfMemoryPlanes));
- DbgPrint((DPRINT_UI, "BitsPerPixel = %d\n", ModeInformation->BitsPerPixel));
- DbgPrint((DPRINT_UI, "NumberOfBanks = %d\n", ModeInformation->NumberOfBanks));
- DbgPrint((DPRINT_UI, "MemoryModel = %d\n", ModeInformation->MemoryModel));
- DbgPrint((DPRINT_UI, "BankSize = %d\n", ModeInformation->BankSize));
- DbgPrint((DPRINT_UI, "NumberOfImagePlanes = %d\n", ModeInformation->NumberOfImagePanes));
- DbgPrint((DPRINT_UI, "---VBE v1.2+ ---\n"));
- DbgPrint((DPRINT_UI, "RedMaskSize = %d\n", ModeInformation->RedMaskSize));
- DbgPrint((DPRINT_UI, "RedMaskPosition = %d\n", ModeInformation->RedMaskPosition));
- DbgPrint((DPRINT_UI, "GreenMaskSize = %d\n", ModeInformation->GreenMaskSize));
- DbgPrint((DPRINT_UI, "GreenMaskPosition = %d\n", ModeInformation->GreenMaskPosition));
- DbgPrint((DPRINT_UI, "BlueMaskSize = %d\n", ModeInformation->BlueMaskSize));
- DbgPrint((DPRINT_UI, "BlueMaskPosition = %d\n", ModeInformation->BlueMaskPosition));
- DbgPrint((DPRINT_UI, "ReservedMaskSize = %d\n", ModeInformation->ReservedMaskSize));
- DbgPrint((DPRINT_UI, "ReservedMaskPosition = %d\n", ModeInformation->ReservedMaskPosition));
- DbgPrint((DPRINT_UI, "\n"));
-
- return TRUE;
-}
-
-static BOOLEAN
-PcVideoSetBiosVesaMode(USHORT Mode)
-{
- REGS Regs;
-
- /* Int 10h AX=4F02h
- * VESA SuperVGA BIOS - SET SuperVGA VIDEO MODE
- *
- * AX = 4F02h
- * BX = new video mode
- * ES:DI -> (VBE 3.0+) CRTC information block, bit mode bit 11 set
- * Return:
- * AL = 4Fh if function supported
- * AH = status
- * 00h successful
- * 01h failed
- *
- * Values for VESA video mode:
- * 00h-FFh OEM video modes (see #00010 at AH=00h)
- * 100h 640x400x256
- * 101h 640x480x256
- * 102h 800x600x16
- * 103h 800x600x256
- * 104h 1024x768x16
- * 105h 1024x768x256
- * 106h 1280x1024x16
- * 107h 1280x1024x256
- * 108h 80x60 text
- * 109h 132x25 text
- * 10Ah 132x43 text
- * 10Bh 132x50 text
- * 10Ch 132x60 text
- * ---VBE v1.2+ ---
- * 10Dh 320x200x32K
- * 10Eh 320x200x64K
- * 10Fh 320x200x16M
- * 110h 640x480x32K
- * 111h 640x480x64K
- * 112h 640x480x16M
- * 113h 800x600x32K
- * 114h 800x600x64K
- * 115h 800x600x16M
- * 116h 1024x768x32K
- * 117h 1024x768x64K
- * 118h 1024x768x16M
- * 119h 1280x1024x32K (1:5:5:5)
- * 11Ah 1280x1024x64K (5:6:5)
- * 11Bh 1280x1024x16M
- * ---VBE 2.0+ ---
- * 120h 1600x1200x256
- * 121h 1600x1200x32K
- * 122h 1600x1200x64K
- * 81FFh special full-memory access mode
- *
- * Notes: The special mode 81FFh preserves the contents of the video memory and gives
- * access to all of the memory; VESA recommends that the special mode be a packed-pixel
- * mode. For VBE 2.0+, it is required that the VBE implement the mode, but not place it
- * in the list of available modes (mode information for this mode can be queried
- * directly, however).. As of VBE 2.0, VESA will no longer define video mode numbers
- */
- Regs.w.ax = 0x4F02;
- Regs.w.bx = Mode;
- Int386(0x10, &Regs, &Regs);
-
- if (0x004F != Regs.w.ax)
- {
- return FALSE;
- }
-
- return TRUE;
-}
-
-static BOOLEAN
-PcVideoSetMode80x25(VOID)
-{
- PcVideoSetBiosMode(0x03);
- ScreenWidth = 80;
- ScreenHeight = 25;
-
- return TRUE;
-}
-
-static BOOLEAN
-PcVideoSetMode80x50_80x43(VOID)
-{
- if (VIDEOCARD_VGA == PcVideoDetectVideoCard())
- {
- PcVideoSetBiosMode(0x12);
- PcVideoSetFont8x8();
- PcVideoSelectAlternatePrintScreen();
- PcVideoDisableCursorEmulation();
- PcVideoDefineCursor(6, 7);
- ScreenWidth = 80;
- ScreenHeight = 50;
- }
- else if (VIDEOCARD_EGA == PcVideoDetectVideoCard())
- {
- PcVideoSetBiosMode(0x03);
- PcVideoSetFont8x8();
- PcVideoSelectAlternatePrintScreen();
- PcVideoDisableCursorEmulation();
- PcVideoDefineCursor(6, 7);
- ScreenWidth = 80;
- ScreenHeight = 43;
- }
- else /* VIDEOCARD_CGA_OR_OTHER */
- {
- return FALSE;
- }
-
- return TRUE;
-}
-
-static BOOLEAN
-PcVideoSetMode80x28(VOID)
-{
- /* FIXME: Is this VGA-only? */
- PcVideoSetMode80x25();
- PcVideoSetFont8x14();
- PcVideoDefineCursor(11, 12);
- ScreenWidth = 80;
- ScreenHeight = 28;
-
- return TRUE;
-}
-
-static BOOLEAN
-PcVideoSetMode80x30(VOID)
-{
- /* FIXME: Is this VGA-only? */
- PcVideoSetMode80x25();
- PcVideoSet480ScanLines();
- ScreenWidth = 80;
- ScreenHeight = 30;
-
- return TRUE;
-}
-
-static BOOLEAN
-PcVideoSetMode80x34(VOID)
-{
- /* FIXME: Is this VGA-only? */
- PcVideoSetMode80x25();
- PcVideoSet480ScanLines();
- PcVideoSetFont8x14();
- PcVideoDefineCursor(11, 12);
- PcVideoSetDisplayEnd();
- ScreenWidth = 80;
- ScreenHeight = 34;
-
- return TRUE;
-}
-
-static BOOLEAN
-PcVideoSetMode80x43(VOID)
-{
- /* FIXME: Is this VGA-only? */
- PcVideoSetVerticalResolution(VERTRES_350_SCANLINES);
- PcVideoSetMode80x25();
- PcVideoSetFont8x8();
- PcVideoSelectAlternatePrintScreen();
- PcVideoDisableCursorEmulation();
- PcVideoDefineCursor(6, 7);
- ScreenWidth = 80;
- ScreenHeight = 43;
-
- return TRUE;
-}
-
-static BOOLEAN
-PcVideoSetMode80x60(VOID)
-{
- /* FIXME: Is this VGA-only? */
- PcVideoSetMode80x25();
- PcVideoSet480ScanLines();
- PcVideoSetFont8x8();
- PcVideoSelectAlternatePrintScreen();
- PcVideoDisableCursorEmulation();
- PcVideoDefineCursor(6, 7);
- PcVideoSetDisplayEnd();
- ScreenWidth = 80;
- ScreenHeight = 60;
-
- return TRUE;
-}
-
-static BOOLEAN
-PcVideoSetMode(ULONG NewMode)
-{
- CurrentMemoryBank = 0;
-
- /* Set the values for the default text modes
- * If they are setting a graphics mode then
- * these values will be changed.
- */
- BiosVideoMode = NewMode;
- ScreenWidth = 80;
- ScreenHeight = 25;
- BytesPerScanLine = 160;
- DisplayMode = VideoTextMode;
- VesaVideoMode = FALSE;
-
- switch (NewMode)
- {
- case VIDEOMODE_NORMAL_TEXT:
- case 0x03: /* BIOS 80x25 text mode number */
- return PcVideoSetMode80x25();
- case VIDEOMODE_EXTENDED_TEXT:
- return PcVideoSetMode80x50_80x43();
- case VIDEOMODE_80X28:
- return PcVideoSetMode80x28();
- case VIDEOMODE_80X30:
- return PcVideoSetMode80x30();
- case VIDEOMODE_80X34:
- return PcVideoSetMode80x34();
- case VIDEOMODE_80X43:
- return PcVideoSetMode80x43();
- case VIDEOMODE_80X60:
- return PcVideoSetMode80x60();
- }
-
- if (0x12 == NewMode)
- {
- /* 640x480x16 */
- PcVideoSetBiosMode(NewMode);
- WRITE_PORT_USHORT((USHORT*)0x03CE, 0x0F01); /* For some reason this is necessary? */
- ScreenWidth = 640;
- ScreenHeight = 480;
- BytesPerScanLine = 80;
- BiosVideoMode = NewMode;
- DisplayMode = VideoGraphicsMode;
-
- return TRUE;
- }
- else if (0x13 == NewMode)
- {
- /* 320x200x256 */
- PcVideoSetBiosMode(NewMode);
- ScreenWidth = 320;
- ScreenHeight = 200;
- BytesPerScanLine = 320;
- BiosVideoMode = NewMode;
- DisplayMode = VideoGraphicsMode;
-
- return TRUE;
- }
- else if (0x0108 <= NewMode && NewMode <= 0x010C)
- {
- /* VESA Text Mode */
- if (! PcVideoVesaGetSVGAModeInformation(NewMode, &VesaVideoModeInformation))
- {
- return FALSE;
- }
-
- if (! PcVideoSetBiosVesaMode(NewMode))
- {
- return FALSE;
- }
-
- ScreenWidth = VesaVideoModeInformation.WidthInPixels;
- ScreenHeight = VesaVideoModeInformation.HeightInPixels;
- BytesPerScanLine = VesaVideoModeInformation.BytesPerScanLine;
- BiosVideoMode = NewMode;
- DisplayMode = VideoTextMode;
- VesaVideoMode = TRUE;
-
- return TRUE;
- }
- else
- {
- /* VESA Graphics Mode */
- if (! PcVideoVesaGetSVGAModeInformation(NewMode, &VesaVideoModeInformation))
- {
- return FALSE;
- }
-
- if (! PcVideoSetBiosVesaMode(NewMode))
- {
- return FALSE;
- }
-
- ScreenWidth = VesaVideoModeInformation.WidthInPixels;
- ScreenHeight = VesaVideoModeInformation.HeightInPixels;
- BytesPerScanLine = VesaVideoModeInformation.BytesPerScanLine;
- BiosVideoMode = NewMode;
- DisplayMode = VideoTextMode;
- VesaVideoMode = TRUE;
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static VOID
-PcVideoSetBlinkBit(BOOLEAN Enable)
-{
- REGS Regs;
-
- /* Int 10h AX=1003h
- * VIDEO - TOGGLE INTENSITY/BLINKING BIT (Jr, PS, TANDY 1000, EGA, VGA)
- *
- * AX = 1003h
- * BL = new state
- * 00h background intensity enabled
- * 01h blink enabled
- * BH = 00h to avoid problems on some adapters
- * Return:
- * Nothing
- *
- * Note: although there is no function to get
- * the current status, bit 5 of 0040h:0065h
- * indicates the state.
- */
- Regs.w.ax = 0x1003;
- Regs.w.bx = Enable ? 0x0001 : 0x0000;
- Int386(0x10, &Regs, &Regs);
-}
-
-static VOID
-PcVideoSetMemoryBank(USHORT BankNumber)
-{
- REGS Regs;
-
- if (CurrentMemoryBank != BankNumber)
- {
- /* Int 10h AX=4F05h
- * VESA SuperVGA BIOS - CPU VIDEO MEMORY CONTROL
- *
- * AX = 4F05h
- * BH = subfunction
- * 00h select video memory window
- * 01h get video memory window
- * DX = window address in video memory (in granularity units)
- * Return:
- * DX = window address in video memory (in gran. units)
- * BL = window number
- * 00h window A
- * 01h window B.
- * Return:
- * AL = 4Fh if function supported
- * AH = status
- * 00h successful
- * 01h failed
- */
- Regs.w.ax = 0x4F05;
- Regs.w.bx = 0x0000;
- Regs.w.dx = BankNumber;
- Int386(0x10, &Regs, &Regs);
-
- if (0x004F == Regs.w.ax)
- {
- CurrentMemoryBank = BankNumber;
- }
- }
-}
-
-VIDEODISPLAYMODE
-PcVideoSetDisplayMode(char *DisplayModeName, BOOLEAN Init)
-{
- ULONG VideoMode = VIDEOMODE_NORMAL_TEXT;
-
- if (NULL == DisplayModeName || '\0' == *DisplayModeName)
- {
- PcVideoSetBlinkBit(! Init);
- return DisplayMode;
- }
-
- if (VIDEOCARD_CGA_OR_OTHER == PcVideoDetectVideoCard())
- {
- DbgPrint((DPRINT_UI, "CGA or other display adapter detected.\n"));
- printf("CGA or other display adapter detected.\n");
- printf("Using 80x25 text mode.\n");
- VideoMode = VIDEOMODE_NORMAL_TEXT;
- }
- else if (VIDEOCARD_EGA == PcVideoDetectVideoCard())
- {
- DbgPrint((DPRINT_UI, "EGA display adapter detected.\n"));
- printf("EGA display adapter detected.\n");
- printf("Using 80x25 text mode.\n");
- VideoMode = VIDEOMODE_NORMAL_TEXT;
- }
- else /* if (VIDEOCARD_VGA == PcVideoDetectVideoCard()) */
- {
- DbgPrint((DPRINT_UI, "VGA display adapter detected.\n"));
-
- if (0 == _stricmp(DisplayModeName, "NORMAL_VGA"))
- {
- VideoMode = VIDEOMODE_NORMAL_TEXT;
- }
- else if (0 == _stricmp(DisplayModeName, "EXTENDED_VGA"))
- {
- VideoMode = VIDEOMODE_EXTENDED_TEXT;
- }
- else
- {
- VideoMode = atoi(DisplayModeName);
- }
- }
-
- if (! PcVideoSetMode(VideoMode))
- {
- printf("Error: unable to set video display mode 0x%x\n", (int) VideoMode);
- printf("Defaulting to 80x25 text mode.\n");
- printf("Press any key to continue.\n");
- PcConsGetCh();
-
- PcVideoSetMode(VIDEOMODE_NORMAL_TEXT);
- }
-
- PcVideoSetBlinkBit(! Init);
-
-
- return DisplayMode;
-}
-
-VOID
-PcVideoGetDisplaySize(PULONG Width, PULONG Height, PULONG Depth)
-{
- *Width = ScreenWidth;
- *Height = ScreenHeight;
- if (VideoGraphicsMode == DisplayMode && VesaVideoMode)
- {
- if (16 == VesaVideoModeInformation.BitsPerPixel)
- {
- /* 16-bit color modes give green an extra bit (5:6:5)
- * 15-bit color modes have just 5:5:5 for R:G:B */
- *Depth = (6 == VesaVideoModeInformation.GreenMaskSize ? 16 : 15);
- }
- else
- {
- *Depth = VesaVideoModeInformation.BitsPerPixel;
- }
- }
- else
- {
- *Depth = 0;
- }
-}
-
-ULONG
-PcVideoGetBufferSize(VOID)
-{
- return ScreenHeight * BytesPerScanLine;
-}
-
-VOID
-PcVideoSetTextCursorPosition(ULONG X, ULONG Y)
-{
- REGS Regs;
-
- /* Int 10h AH=02h
- * VIDEO - SET CURSOR POSITION
- *
- * AH = 02h
- * BH = page number
- * 0-3 in modes 2&3
- * 0-7 in modes 0&1
- * 0 in graphics modes
- * DH = row (00h is top)
- * DL = column (00h is left)
- * Return:
- * Nothing
- */
- Regs.b.ah = 0x02;
- Regs.b.bh = 0x00;
- Regs.b.dh = Y;
- Regs.b.dl = X;
- Int386(0x10, &Regs, &Regs);
-}
-
-VOID
-PcVideoHideShowTextCursor(BOOLEAN Show)
-{
- if (Show)
- {
- PcVideoDefineCursor(0x0D, 0x0E);
- }
- else
- {
- PcVideoDefineCursor(0x20, 0x00);
- }
-}
-
-VOID
-PcVideoCopyOffScreenBufferToVRAM(PVOID Buffer)
-{
- ULONG BanksToCopy;
- ULONG BytesInLastBank;
- ULONG CurrentBank;
- ULONG BankSize;
-
- /* PcVideoWaitForVerticalRetrace(); */
-
- /* Text mode (BIOS or VESA) */
- if (VideoTextMode == DisplayMode)
- {
- RtlCopyMemory((PVOID) VIDEOTEXT_MEM_ADDRESS, Buffer, PcVideoGetBufferSize());
- }
- /* VESA graphics mode */
- else if (VideoGraphicsMode == DisplayMode && VesaVideoMode)
- {
- BankSize = VesaVideoModeInformation.WindowGranularity << 10;
- BanksToCopy = (VesaVideoModeInformation.HeightInPixels * VesaVideoModeInformation.BytesPerScanLine) / BankSize;
- BytesInLastBank = (VesaVideoModeInformation.HeightInPixels * VesaVideoModeInformation.BytesPerScanLine) % BankSize;
-
- /* Copy all the banks but the last one because
- * it is probably a partial bank */
- for (CurrentBank = 0; CurrentBank < BanksToCopy; CurrentBank++)
- {
- PcVideoSetMemoryBank(CurrentBank);
- RtlCopyMemory((PVOID) VIDEOVGA_MEM_ADDRESS, (char *) Buffer + CurrentBank * BankSize, BankSize);
- }
-
- /* Copy the remaining bytes into the last bank */
- PcVideoSetMemoryBank(CurrentBank);
- RtlCopyMemory((PVOID)VIDEOVGA_MEM_ADDRESS, (char *) Buffer + CurrentBank * BankSize, BytesInLastBank);
- }
- /* BIOS graphics mode */
- else
- {
- UNIMPLEMENTED;
- }
-}
-
-VOID
-PcVideoClearScreen(UCHAR Attr)
-{
- USHORT AttrChar;
- USHORT *BufPtr;
-
- AttrChar = ((USHORT) Attr << 8) | ' ';
- for (BufPtr = (USHORT *) VIDEOTEXT_MEM_ADDRESS;
- BufPtr < (USHORT *) (VIDEOTEXT_MEM_ADDRESS + VIDEOTEXT_MEM_SIZE);
- BufPtr++)
- {
- *BufPtr = AttrChar;
- }
-}
-
-VOID
-PcVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y)
-{
- USHORT *BufPtr;
-
- BufPtr = (USHORT *) (ULONG_PTR)(VIDEOTEXT_MEM_ADDRESS + Y * BytesPerScanLine + X * 2);
- *BufPtr = ((USHORT) Attr << 8) | (Ch & 0xff);
-}
-
-BOOLEAN
-PcVideoIsPaletteFixed(VOID)
-{
- return FALSE;
-}
-
-VOID
-PcVideoSetPaletteColor(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue)
-{
- WRITE_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_WRITE, Color);
- WRITE_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_DATA, Red);
- WRITE_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_DATA, Green);
- WRITE_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_DATA, Blue);
-}
-
-VOID
-PcVideoGetPaletteColor(UCHAR Color, UCHAR* Red, UCHAR* Green, UCHAR* Blue)
-{
- WRITE_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_READ, Color);
- *Red = READ_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_DATA);
- *Green = READ_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_DATA);
- *Blue = READ_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_DATA);
-}
-
-VOID
-PcVideoSync(VOID)
-{
- while (1 == (READ_PORT_UCHAR((UCHAR*)VIDEOPORT_VERTICAL_RETRACE) & 0x08))
- {
- /*
- * Keep reading the port until bit 3 is clear
- * This waits for the current retrace to end and
- * we can catch the next one so we know we are
- * getting a full retrace.
- */
- }
-
- while (0 == (READ_PORT_UCHAR((UCHAR*)VIDEOPORT_VERTICAL_RETRACE) & 0x08))
- {
- /*
- * Keep reading the port until bit 3 is set
- * Now that we know we aren't doing a vertical
- * retrace we need to wait for the next one.
- */
- }
-}
-
-VOID
-PcVideoPrepareForReactOS(IN BOOLEAN Setup)
-{
- if (Setup)
- {
- PcVideoSetMode80x50_80x43();
- }
- else
- {
- PcVideoSetBiosMode(0x12);
- }
- PcVideoHideShowTextCursor(FALSE);
-}
-
-/* EOF */
diff --git a/reactos/boot/freeldr/freeldr/arch/arm/boot.s b/reactos/boot/freeldr/freeldr/arch/arm/boot.s
index a4fe1d375ba..ab14f70a6b3 100644
--- a/reactos/boot/freeldr/freeldr/arch/arm/boot.s
+++ b/reactos/boot/freeldr/freeldr/arch/arm/boot.s
@@ -10,7 +10,6 @@
.include "ntoskrnl/include/internal/arm/kxarm.h"
.include "ntoskrnl/include/internal/arm/ksarm.h"
- .section startup
NESTED_ENTRY _start
PROLOG_END _start
@@ -45,7 +44,7 @@
//
// Okay, now give us a stack
//
- ldr sp, L_BootStackEnd
+ //ldr sp, L_BootStackEnd
//
// Go ahead and call the C initialization code
@@ -60,13 +59,6 @@ L_BootStackEnd:
L_ArmInit:
.long ArmInit
- .align 4
-.global BootStack
-BootStack:
- .space 0x4000
-BootStackEnd:
- .long 0
-
.section pagedata
.global TranslationTableStart
TranslationTableStart:
@@ -149,10 +141,5 @@ MasterTranslationTable:
.space 0x0400 // 0xYYYYYYYY->0xC10FFFFF
.space 0x0C00 // PADDING FOR 4KB GRANULARITY
-.global HyperSpaceTranslationTable
-HyperSpaceTranslationTable:
- .space 0x0400 // 0xYYYYYYYY->0xC10FFFFF
- .space 0x0C00 // PADDING FOR 4KB GRANULARITY
-
.global TranslationTableEnd
TranslationTableEnd:
diff --git a/reactos/boot/freeldr/freeldr/arch/arm/loader.c b/reactos/boot/freeldr/freeldr/arch/arm/loader.c
index 06bf7ca281b..d1548d9eeaa 100644
--- a/reactos/boot/freeldr/freeldr/arch/arm/loader.c
+++ b/reactos/boot/freeldr/freeldr/arch/arm/loader.c
@@ -42,7 +42,7 @@ PCHAR ArmSharedHeap;
extern ADDRESS_RANGE ArmBoardMemoryMap[16];
extern ULONG ArmBoardMemoryMapRangeCount;
extern ARM_TRANSLATION_TABLE ArmTranslationTable;
-extern ARM_COARSE_PAGE_TABLE BootTranslationTable, KernelTranslationTable, FlatMapTranslationTable, MasterTranslationTable, HyperSpaceTranslationTable;
+extern ARM_COARSE_PAGE_TABLE BootTranslationTable, KernelTranslationTable, FlatMapTranslationTable, MasterTranslationTable;
extern ROS_KERNEL_ENTRY_POINT KernelEntryPoint;
extern ULONG_PTR KernelBase;
extern ULONG_PTR AnsiData, OemData, UnicodeData, RegistryData, KernelData, HalData, DriverData[16];
@@ -683,7 +683,7 @@ ArmSetupPageDirectory(VOID)
ARM_PTE Pte;
ULONG i, j;
PARM_TRANSLATION_TABLE ArmTable;
- PARM_COARSE_PAGE_TABLE BootTable, KernelTable, FlatMapTable, MasterTable, HyperSpaceTable;
+ PARM_COARSE_PAGE_TABLE BootTable, KernelTable, FlatMapTable, MasterTable;
//
// Get the PDEs that we will use
@@ -693,7 +693,6 @@ ArmSetupPageDirectory(VOID)
KernelTable = &KernelTranslationTable;
FlatMapTable = &FlatMapTranslationTable;
MasterTable = &MasterTranslationTable;
- HyperSpaceTable = &HyperSpaceTranslationTable;
//
// Set the master L1 PDE as the TTB
@@ -810,12 +809,6 @@ ArmSetupPageDirectory(VOID)
//
Pte.L1.Coarse.BaseAddress = (ULONG)MasterTable >> CPT_SHIFT;
ArmTable->Pte[PDE_BASE >> PDE_SHIFT] = Pte;
-
- //
- // Now create the template for the hyperspace table which maps 1MB
- //
- Pte.L1.Coarse.BaseAddress = (ULONG)HyperSpaceTable >> CPT_SHIFT;
- ArmTable->Pte[HYPER_SPACE >> PDE_SHIFT] = Pte;
//
// Now create the template for the coarse page tables which map the first 8MB
@@ -983,12 +976,6 @@ ArmSetupPageDirectory(VOID)
Pte.L2.Small.BaseAddress = (ULONG)&MasterTranslationTable >> PTE_SHIFT;
FlatMapTable->Pte[16] = Pte;
- //
- // And finally for the 0xC1100000 region (1MB)
- //
- Pte.L2.Small.BaseAddress = (ULONG)&HyperSpaceTranslationTable >> PTE_SHIFT;
- FlatMapTable->Pte[17] = Pte;
-
//
// Now we handle the master translation area for our PDEs. We'll just make
// the 4 page tables point to the ARM TTB.
diff --git a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c
index 6e2595f48be..b334c3bbf34 100644
--- a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c
+++ b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c
@@ -12,6 +12,8 @@
/* GLOBALS ********************************************************************/
+UCHAR BootStack[0x4000];
+PUCHAR BootStackEnd = &BootStack[0x3FFF];
PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock;
ULONG BootDrive, BootPartition;
VOID ArmPrepareForReactOS(IN BOOLEAN Setup);
@@ -40,7 +42,8 @@ ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext)
// This should probably go away once we support more boards
//
ASSERT((ArmBoardBlock->BoardType == MACH_TYPE_FEROCEON) ||
- (ArmBoardBlock->BoardType == MACH_TYPE_VERSATILE_PB));
+ (ArmBoardBlock->BoardType == MACH_TYPE_VERSATILE_PB) ||
+ (ArmBoardBlock->BoardType == MACH_TYPE_OMAP3_BEAGLE));
//
// Save data required for memory initialization
@@ -169,10 +172,25 @@ MachInit(IN PCCH CommandLine)
MachVtbl.ConsGetCh = ArmVersaGetCh;
break;
+ //
+ // Check for TI OMAP3 boards
+ // For now that means only Beagle, but ZOOM and others should be ok too
+ //
+ case MACH_TYPE_OMAP3_BEAGLE:
+
+ //
+ // These boards use a UART16550
+ //
+ ArmOmap3SerialInit(115200);
+ MachVtbl.ConsPutChar = ArmOmap3PutChar;
+ MachVtbl.ConsKbHit = ArmOmap3KbHit;
+ MachVtbl.ConsGetCh = ArmOmap3GetCh;
+ break;
+
default:
ASSERT(FALSE);
}
-
+
//
// Setup generic ARM routines for all boards
//
diff --git a/reactos/boot/freeldr/freeldr/arch/arm/omapuart.c b/reactos/boot/freeldr/freeldr/arch/arm/omapuart.c
new file mode 100644
index 00000000000..f8b89f88445
--- /dev/null
+++ b/reactos/boot/freeldr/freeldr/arch/arm/omapuart.c
@@ -0,0 +1,162 @@
+/*
+ * PROJECT: ReactOS Boot Loader
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: boot/freeldr/arch/arm/omapuart.c
+ * PURPOSE: Implements code for TI OMAP3 boards using the 16550 UART
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+
+/* GLOBALS ********************************************************************/
+
+//
+// UART Registers
+//
+#define UART0_RHR (ArmBoardBlock->UartRegisterBase + 0x00)
+#define UART0_THR UART0_RHR
+#define UART0_IER (ArmBoardBlock->UartRegisterBase + 0x04)
+#define UART0_FCR (ArmBoardBlock->UartRegisterBase + 0x08)
+#define UART0_LCR (ArmBoardBlock->UartRegisterBase + 0x0C)
+#define UART0_MCR (ArmBoardBlock->UartRegisterBase + 0x10)
+#define UART0_LSR (ArmBoardBlock->UartRegisterBase + 0x14)
+#define UART0_MDR1 (ArmBoardBlock->UartRegisterBase + 0x20)
+
+//
+// When we enable the divisor latch
+//
+#define UART0_DLL UART0_RHR
+#define UART0_DLH UART0_IER
+
+//
+// FCR Values
+//
+#define FCR_FIFO_EN 0x01
+#define FCR_RXSR 0x02
+#define FCR_TXSR 0x04
+
+//
+// LCR Values
+//
+#define LCR_WLS_8 0x03
+#define LCR_1_STB 0x00
+#define LCR_DIVL_EN 0x80
+#define LCR_NO_PAR 0x00
+
+//
+// LSR Values
+//
+#define LSR_DR 0x01
+#define LSR_THRE 0x20
+
+//
+// MCR Values
+//
+#define MCR_DTR 0x01
+#define MCR_RTS 0x02
+
+//
+// MDR1 Modes
+//
+#define MDR1_UART16X 1
+#define MDR1_SIR 2
+#define MDR1_UART16X_AUTO_BAUD 3
+#define MDR1_UART13X 4
+#define MDR1_MIR 5
+#define MDR1_FIR 6
+#define MDR1_CIR 7
+#define MDR1_DISABLE 8
+
+/* FUNCTIONS ******************************************************************/
+
+VOID
+ArmOmap3SerialInit(IN ULONG Baudrate)
+{
+ ULONG BaudClock;
+
+ //
+ // Calculate baudrate clock divider to set the baud rate
+ //
+ BaudClock = (ArmBoardBlock->ClockRate / 16) / Baudrate;
+
+ //
+ // Disable serial port
+ //
+ WRITE_REGISTER_UCHAR(UART0_MDR1, MDR1_DISABLE);
+
+ //
+ // Disable interrupts
+ //
+ WRITE_REGISTER_UCHAR(UART0_IER, 0);
+
+ //
+ // Set the baud rate to 115200 bps
+ //
+ WRITE_REGISTER_UCHAR(UART0_LCR, LCR_DIVL_EN);
+ WRITE_REGISTER_UCHAR(UART0_DLL, BaudClock);
+ WRITE_REGISTER_UCHAR(UART0_DLH, (BaudClock >> 8) & 0xFF);
+
+ //
+ // Setup loopback
+ //
+ WRITE_REGISTER_UCHAR(UART0_MCR, MCR_DTR | MCR_RTS);
+
+ //
+ // Set 8 bits for data, 1 stop bit, no parity
+ //
+ WRITE_REGISTER_UCHAR(UART0_LCR, LCR_WLS_8 | LCR_1_STB | LCR_NO_PAR);
+
+ //
+ // Clear and enable FIFO
+ //
+ WRITE_REGISTER_UCHAR(UART0_FCR, FCR_FIFO_EN | FCR_RXSR | FCR_TXSR);
+
+ //
+ // Enable serial port
+ //
+ WRITE_REGISTER_UCHAR(UART0_MDR1, MDR1_UART16X);
+}
+
+VOID
+ArmOmap3PutChar(IN INT Char)
+{
+ //
+ // Properly support new-lines
+ //
+ if (Char == '\n') ArmOmap3PutChar('\r');
+
+ //
+ // Wait for ready
+ //
+ while ((READ_REGISTER_UCHAR(UART0_LSR) & LSR_THRE) == 0);
+
+ //
+ // Send the character
+ //
+ WRITE_REGISTER_UCHAR(UART0_THR, Char);
+}
+
+INT
+ArmOmap3GetCh(VOID)
+{
+ //
+ // Wait for ready
+ //
+ while ((READ_REGISTER_UCHAR(UART0_LSR) & LSR_DR) == 0);
+
+ //
+ // Read the character
+ //
+ return READ_REGISTER_UCHAR(UART0_RHR);
+}
+
+BOOLEAN
+ArmOmap3KbHit(VOID)
+{
+ //
+ // Return if something is ready
+ //
+ return ((READ_REGISTER_UCHAR(UART0_LSR) & LSR_DR) != 0);
+}
diff --git a/reactos/boot/freeldr/freeldr/arch/i386/i386vid.c b/reactos/boot/freeldr/freeldr/arch/i386/i386vid.c
index e9bf8a64b65..a5a61cb7709 100644
--- a/reactos/boot/freeldr/freeldr/arch/i386/i386vid.c
+++ b/reactos/boot/freeldr/freeldr/arch/i386/i386vid.c
@@ -1,9 +1,6 @@
/*
* FreeLoader
* Copyright (C) 1998-2003 Brian Palmer
- * Portions from Linux video.S - Display adapter & video mode setup, version 2.13 (14-May-99)
- * Copyright (C) 1995 -- 1999 Martin Mares
- * Based on the original setup.S code (C) Linus Torvalds and Mats Anderson
*
* 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
@@ -25,12 +22,7 @@
#define NDEBUG
#include
-/* non-standard specifier from windef.h -- please deprecate */
-#undef PACKED
-#ifdef __GNUC__
-#define PACKED __attribute__((packed))
-#endif
-
+#include
typedef struct
{
UCHAR Signature[4]; // (ret) signature ("VESA")
@@ -58,7 +50,8 @@ typedef struct
// accelerated video modes (list of words terminated with FFFFh)
UCHAR Reserved[216]; // reserved for VBE implementation
UCHAR ScratchPad[256]; // OEM scratchpad (for OEM strings, etc.)
-} PACKED VESA_SVGA_INFO, *PVESA_SVGA_INFO;
+} VESA_SVGA_INFO, *PVESA_SVGA_INFO;
+#include
// Bitfields for VESA capabilities:
//
diff --git a/reactos/boot/freeldr/freeldr/arch/i386/loader.c b/reactos/boot/freeldr/freeldr/arch/i386/loader.c
index eb60ebf6f4c..4e29731c74f 100644
--- a/reactos/boot/freeldr/freeldr/arch/i386/loader.c
+++ b/reactos/boot/freeldr/freeldr/arch/i386/loader.c
@@ -27,7 +27,6 @@
extern PAGE_DIRECTORY_X86 startup_pagedirectory;
extern PAGE_DIRECTORY_X86 lowmem_pagetable;
extern PAGE_DIRECTORY_X86 kernel_pagetable;
-extern PAGE_DIRECTORY_X86 hyperspace_pagetable;
extern PAGE_DIRECTORY_X86 apic_pagetable;
extern PAGE_DIRECTORY_X86 kpcr_pagetable;
extern PAGE_DIRECTORY_X86 kuser_pagetable;
@@ -150,11 +149,6 @@ FrLdrSetupPageDirectory(VOID)
PageDir->Pde[StartupPageTableIndex].Write = 1;
PageDir->Pde[StartupPageTableIndex].PageFrameNumber = PaPtrToPfn(startup_pagedirectory);
- /* Set up the Hyperspace PDE */
- PageDir->Pde[HyperspacePageTableIndex].Valid = 1;
- PageDir->Pde[HyperspacePageTableIndex].Write = 1;
- PageDir->Pde[HyperspacePageTableIndex].PageFrameNumber = PaPtrToPfn(hyperspace_pagetable);
-
/* Set up the HAL PDE */
PageDir->Pde[HalPageTableIndex].Valid = 1;
PageDir->Pde[HalPageTableIndex].Write = 1;
diff --git a/reactos/boot/freeldr/freeldr/arch/i386/mb.S b/reactos/boot/freeldr/freeldr/arch/i386/mb.S
index d87e45758b8..3d7845b009f 100644
--- a/reactos/boot/freeldr/freeldr/arch/i386/mb.S
+++ b/reactos/boot/freeldr/freeldr/arch/i386/mb.S
@@ -34,7 +34,6 @@
.globl _startup_pagedirectory
.globl _lowmem_pagetable
.globl _kernel_pagetable
- .globl _hyperspace_pagetable
.globl _apic_pagetable
.globl _kpcr_pagetable
.globl _kuser_pagetable
@@ -64,9 +63,6 @@ _lowmem_pagetable:
_kernel_pagetable:
.fill 2*4096, 1, 0
-_hyperspace_pagetable:
- .fill 4096, 1, 0
-
_apic_pagetable:
.fill 4096, 1, 0
diff --git a/reactos/boot/freeldr/freeldr/arch/i386/pcdisk.c b/reactos/boot/freeldr/freeldr/arch/i386/pcdisk.c
index 1a2d5b9cd0a..23167831577 100644
--- a/reactos/boot/freeldr/freeldr/arch/i386/pcdisk.c
+++ b/reactos/boot/freeldr/freeldr/arch/i386/pcdisk.c
@@ -22,12 +22,7 @@
#define NDEBUG
#include
-/* non-standard specifier from windef.h -- please deprecate */
-#undef PACKED
-#ifdef __GNUC__
-#define PACKED __attribute__((packed))
-#endif
-
+#include
typedef struct
{
UCHAR PacketSize; // 00h - Size of packet (10h or 18h)
@@ -40,7 +35,8 @@ typedef struct
// used if DWORD at 04h is FFFFh:FFFFh
// Commented since some earlier BIOSes refuse to work with
// such extended structure
-} PACKED I386_DISK_ADDRESS_PACKET, *PI386_DISK_ADDRESS_PACKET;
+} I386_DISK_ADDRESS_PACKET, *PI386_DISK_ADDRESS_PACKET;
+#include
/////////////////////////////////////////////////////////////////////////////////////////////
// FUNCTIONS
diff --git a/reactos/boot/freeldr/freeldr/arch/i386/pcvideo.c b/reactos/boot/freeldr/freeldr/arch/i386/pcvideo.c
index b17d6ee98c9..6e04ea62261 100644
--- a/reactos/boot/freeldr/freeldr/arch/i386/pcvideo.c
+++ b/reactos/boot/freeldr/freeldr/arch/i386/pcvideo.c
@@ -22,12 +22,6 @@
#define NDEBUG
#include
-/* non-standard specifier from windef.h -- please deprecate */
-#undef PACKED
-#ifdef __GNUC__
-#define PACKED __attribute__((packed))
-#endif
-
#define VIDEOPORT_PALETTE_READ 0x03C7
#define VIDEOPORT_PALETTE_WRITE 0x03C8
#define VIDEOPORT_PALETTE_DATA 0x03C9
@@ -57,6 +51,7 @@
#define VERTRES_350_SCANLINES 0x01
#define VERTRES_400_SCANLINES 0x02
+#include
typedef struct
{
USHORT ModeAttributes; /* mode attributes (see #00080) */
@@ -110,7 +105,8 @@ typedef struct
UCHAR LinearReservedMaskPosition; /* linear modes:Bit position of reserved mask LSB */
ULONG MaximumPixelClock; /* maximum pixel clock for graphics video mode, in Hz */
UCHAR Reserved2[190]; /* 190 BYTEs reserved (0) */
-} PACKED SVGA_MODE_INFORMATION, *PSVGA_MODE_INFORMATION;
+} SVGA_MODE_INFORMATION, *PSVGA_MODE_INFORMATION;
+#include
static ULONG BiosVideoMode; /* Current video mode as known by BIOS */
static ULONG ScreenWidth = 80; /* Screen Width in characters */
diff --git a/reactos/boot/freeldr/freeldr/bootmgr.c b/reactos/boot/freeldr/freeldr/bootmgr.c
index 69f4456d7d3..d2d8783dd9a 100644
--- a/reactos/boot/freeldr/freeldr/bootmgr.c
+++ b/reactos/boot/freeldr/freeldr/bootmgr.c
@@ -122,6 +122,7 @@ VOID RunLoader(VOID)
// to have different install methods, etc.
LoadReactOSSetup();
}
+#ifdef __i386__
else if (_stricmp(SettingValue, "ReactOSSetup2") == 0)
{
#ifdef __i386__
@@ -130,6 +131,7 @@ VOID RunLoader(VOID)
#endif
}
#endif
+#endif
#ifdef __i386__
else if (_stricmp(SettingValue, "WindowsNT40") == 0)
{
diff --git a/reactos/boot/freeldr/freeldr/freeldr.rbuild b/reactos/boot/freeldr/freeldr/freeldr.rbuild
index ee601a50327..959951862ae 100644
--- a/reactos/boot/freeldr/freeldr/freeldr.rbuild
+++ b/reactos/boot/freeldr/freeldr/freeldr.rbuild
@@ -22,10 +22,10 @@
+ freeldr_arch
freeldr_startup
freeldr_base64k
freeldr_base
- freeldr_arch
freeldr_main
rossym
cmlib
@@ -33,8 +33,7 @@
libcntpr
-lgcc
- -static
- -Wl,--section-start,pagedata=0x50000
+ -Wl,--image-base=0x80FFF000
diff --git a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild
index b427fedd215..728949bd79a 100644
--- a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild
+++ b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild
@@ -69,10 +69,11 @@
- boot.s
+ boot.s
ferouart.c
loader.c
macharm.c
+ omapuart.c
versuart.c
diff --git a/reactos/boot/freeldr/freeldr/fs/ext2.c b/reactos/boot/freeldr/freeldr/fs/ext2.c
index 97841ebdcfb..319adb1456e 100644
--- a/reactos/boot/freeldr/freeldr/fs/ext2.c
+++ b/reactos/boot/freeldr/freeldr/fs/ext2.c
@@ -606,7 +606,7 @@ BOOLEAN Ext2ReadSuperBlock(VOID)
{
return FALSE;
}
- RtlCopyMemory(Ext2SuperBlock, (PVOID)(DISKREADBUFFER + 1024), 1024);
+ RtlCopyMemory(Ext2SuperBlock, (PVOID)((ULONG_PTR)DISKREADBUFFER + 1024), 1024);
DPRINTM(DPRINT_FILESYSTEM, "Dumping super block:\n");
@@ -951,7 +951,7 @@ BOOLEAN Ext2ReadInode(ULONG Inode, PEXT2_INODE InodeBuffer)
}
// Copy the data to their buffer
- RtlCopyMemory(InodeBuffer, (PVOID)(ULONG_PTR)(FILESYSBUFFER + (InodeOffsetInBlock * EXT3_INODE_SIZE(Ext2SuperBlock))), sizeof(EXT2_INODE));
+ RtlCopyMemory(InodeBuffer, (PVOID)((ULONG_PTR)FILESYSBUFFER + (InodeOffsetInBlock * EXT3_INODE_SIZE(Ext2SuperBlock))), sizeof(EXT2_INODE));
DPRINTM(DPRINT_FILESYSTEM, "Dumping inode information:\n");
DPRINTM(DPRINT_FILESYSTEM, "i_mode = 0x%x\n", InodeBuffer->i_mode);
diff --git a/reactos/boot/freeldr/freeldr/fs/fsrec.c b/reactos/boot/freeldr/freeldr/fs/fsrec.c
index 8e7044f3ee6..d0ea2207004 100644
--- a/reactos/boot/freeldr/freeldr/fs/fsrec.c
+++ b/reactos/boot/freeldr/freeldr/fs/fsrec.c
@@ -36,12 +36,7 @@ BOOLEAN FsRecognizeVolume(ULONG DriveNumber, ULONG VolumeStartSector, UCHAR* Vol
DPRINTM(DPRINT_FILESYSTEM, "FsRecognizeVolume() DriveNumber: 0x%x VolumeStartSector: %d\n", DriveNumber, VolumeStartSector);
- if (FsRecIsExt2(DriveNumber, VolumeStartSector))
- {
- *VolumeType = PARTITION_EXT2;
- return TRUE;
- }
- else if (FsRecIsFat(DriveNumber, VolumeStartSector))
+ if (FsRecIsFat(DriveNumber, VolumeStartSector))
{
*VolumeType = PARTITION_FAT32;
return TRUE;
@@ -51,6 +46,11 @@ BOOLEAN FsRecognizeVolume(ULONG DriveNumber, ULONG VolumeStartSector, UCHAR* Vol
*VolumeType = PARTITION_NTFS;
return TRUE;
}
+ else if (FsRecIsExt2(DriveNumber, VolumeStartSector))
+ {
+ *VolumeType = PARTITION_EXT2;
+ return TRUE;
+ }
return FALSE;
}
diff --git a/reactos/boot/freeldr/freeldr/include/arch.h b/reactos/boot/freeldr/freeldr/include/arch.h
index 79feafe3a47..d73786f96d6 100644
--- a/reactos/boot/freeldr/freeldr/include/arch.h
+++ b/reactos/boot/freeldr/freeldr/include/arch.h
@@ -48,8 +48,8 @@
#define DISKREADBUFFER 0x90000 /* Buffer to store data read in from the disk via the BIOS */
#elif defined(_M_PPC) || defined(_M_MIPS) || defined(_M_ARM)
extern PVOID FsStaticBufferDisk, FsStaticBufferData;
-#define DISKREADBUFFER FsStaticBufferDisk
-#define FILESYSBUFFER FsStaticBufferData
+#define DISKREADBUFFER 0x80000000
+#define FILESYSBUFFER 0x80000000
#endif
/* Makes "x" a global variable or label */
diff --git a/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h b/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h
index 60f9186d63f..893fa77674b 100644
--- a/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h
+++ b/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h
@@ -25,6 +25,12 @@
//
#define MACH_TYPE_VERSATILE_PB 387
+//
+// TI Beagle Board, OMAP3530 SoC
+// qemu-system-arm -M beagle, Beagle Board
+//
+#define MACH_TYPE_OMAP3_BEAGLE 1546
+
//
// Compatible boot-loaders should return us this information
//
@@ -105,6 +111,18 @@ ArmFeroGetCh(VOID);
BOOLEAN
ArmFeroKbHit(VOID);
+VOID
+ArmOmap3SerialInit(IN ULONG Baudrate);
+
+VOID
+ArmOmap3PutChar(IN INT Char);
+
+INT
+ArmOmap3GetCh(VOID);
+
+BOOLEAN
+ArmOmap3KbHit(VOID);
+
VOID
ArmVersaSerialInit(IN ULONG Baudrate);
diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h b/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h
index 94b42f6870d..ff96277d6b0 100644
--- a/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h
+++ b/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h
@@ -29,8 +29,8 @@
VOID PcMachInit(const char *CmdLine);
VOID PcConsPutChar(int Ch);
-BOOLEAN PcConsKbHit();
-int PcConsGetCh();
+BOOLEAN PcConsKbHit(VOID);
+int PcConsGetCh(VOID);
VOID PcVideoClearScreen(UCHAR Attr);
VIDEODISPLAYMODE PcVideoSetDisplayMode(char *DisplayMode, BOOLEAN Init);
diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h b/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h
index a1bc397ff7e..6a565878423 100644
--- a/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h
+++ b/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h
@@ -29,8 +29,8 @@ UCHAR XboxFont8x16[256 * 16];
VOID XboxMachInit(const char *CmdLine);
VOID XboxConsPutChar(int Ch);
-BOOLEAN XboxConsKbHit();
-int XboxConsGetCh();
+BOOLEAN XboxConsKbHit(VOID);
+int XboxConsGetCh(VOID);
VOID XboxVideoInit(VOID);
VOID XboxVideoClearScreen(UCHAR Attr);
diff --git a/reactos/boot/freeldr/freeldr/include/freeldr.h b/reactos/boot/freeldr/freeldr/include/freeldr.h
index a001b9b1e44..e8e7af4a482 100644
--- a/reactos/boot/freeldr/freeldr/include/freeldr.h
+++ b/reactos/boot/freeldr/freeldr/include/freeldr.h
@@ -110,12 +110,22 @@
#include
/* arch defines */
+#ifdef __GNUC__
#ifdef _X86_
-#define Ke386EraseFlags(x) __asm__ __volatile__("pushl $0 ; popfl\n")
+#define Ke386EraseFlags() __asm__ __volatile__("pushl $0 ; popfl\n")
#endif
#ifdef _M_AMD64
-#define KeAmd64EraseFlags(x) __asm__ __volatile__("pushq $0 ; popfq\n")
+#define KeAmd64EraseFlags() __asm__ __volatile__("pushq $0 ; popfq\n")
+#endif
+#else
+#ifdef _X86_
+#define Ke386EraseFlags() __asm push 0; __asm popf;
+#endif
+
+#ifdef _M_AMD64
+#error FIXME
+#endif
#endif
VOID BootMain(LPSTR CmdLine);
diff --git a/reactos/boot/freeldr/freeldr/include/reactos.h b/reactos/boot/freeldr/freeldr/include/reactos.h
index d38a3cb1631..0b627bd5268 100644
--- a/reactos/boot/freeldr/freeldr/include/reactos.h
+++ b/reactos/boot/freeldr/freeldr/include/reactos.h
@@ -23,7 +23,7 @@
/* Base Addres of Kernel in Physical Memory */
#define KERNEL_BASE_PHYS 0x800000
-#if !defined(_M_AMD64)
+#if defined(_M_IX86)
/* Bits to shift to convert a Virtual Address into an Offset in the Page Table */
#define PFN_SHIFT 12
@@ -41,13 +41,11 @@
((p) >> PFN_SHIFT)
#define STARTUP_BASE 0xC0000000
-#define HYPERSPACE_BASE 0xC0400000
#define HAL_BASE 0xFFC00000
#define APIC_BASE 0xFFFE0000
#define LowMemPageTableIndex 0
#define StartupPageTableIndex (STARTUP_BASE >> 22)
-#define HyperspacePageTableIndex (HYPERSPACE_BASE >> 22)
#define HalPageTableIndex (HAL_BASE >> 22)
typedef struct _PAGE_DIRECTORY_X86
diff --git a/reactos/boot/freeldr/freeldr/machine.c b/reactos/boot/freeldr/freeldr/machine.c
index f813d2aa9bd..2bdc6051de7 100644
--- a/reactos/boot/freeldr/freeldr/machine.c
+++ b/reactos/boot/freeldr/freeldr/machine.c
@@ -83,7 +83,7 @@ MachVideoSetDisplayMode(char *DisplayMode, BOOLEAN Init)
VOID
MachVideoGetDisplaySize(PULONG Width, PULONG Height, PULONG Depth)
{
- return MachVtbl.VideoGetDisplaySize(Width, Height, Depth);
+ MachVtbl.VideoGetDisplaySize(Width, Height, Depth);
}
ULONG
@@ -95,7 +95,7 @@ MachVideoGetBufferSize(VOID)
VOID
MachVideoSetTextCursorPosition(ULONG X, ULONG Y)
{
- return MachVtbl.VideoSetTextCursorPosition(X, Y);
+ MachVtbl.VideoSetTextCursorPosition(X, Y);
}
VOID
@@ -125,13 +125,13 @@ MachVideoIsPaletteFixed(VOID)
VOID
MachVideoSetPaletteColor(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue)
{
- return MachVtbl.VideoSetPaletteColor(Color, Red, Green, Blue);
+ MachVtbl.VideoSetPaletteColor(Color, Red, Green, Blue);
}
VOID
MachVideoGetPaletteColor(UCHAR Color, UCHAR *Red, UCHAR *Green, UCHAR *Blue)
{
- return MachVtbl.VideoGetPaletteColor(Color, Red, Green, Blue);
+ MachVtbl.VideoGetPaletteColor(Color, Red, Green, Blue);
}
VOID
@@ -169,10 +169,10 @@ static const MEMORY_DESCRIPTOR_INT MemoryDescriptors[] =
{ { MemoryFirmwareTemporary, 0x90, 0x10 }, 5, }, // Disk read buffer for int 13h. DISKREADBUFFER
{ { MemoryFirmwarePermanent, 0xA0, 0x60 }, 6, }, // ROM / Video
{ { MemorySpecialMemory, 0xFFF, 1 }, 7, }, // unusable memory
-#elif __arm__
- { { MemoryFirmwarePermanent, 0x00, 1 }, 0, }, // arm exception handlers
- { { MemoryFirmwareTemporary, 0x01, 7 }, 1, }, // arm board block + freeldr stack + cmdline
- { { MemoryLoadedProgram, 0x08, 0x70 }, 2, }, // freeldr image (roughly max. 0x64 pages)
+#elif __arm__ // This needs to be done per-platform specific way
+ { { MemoryLoadedProgram, 0x80000, 32 }, 0, }, // X-Loader + OmapLdr
+ { { MemoryLoadedProgram, 0x81000, 128 }, 1, }, // FreeLDR
+ { { MemoryFirmwareTemporary, 0x80500, 4096 }, 2, }, // Video Buffer
#endif
};
MEMORY_DESCRIPTOR*
diff --git a/reactos/boot/freeldr/freeldr/reactos/binhive.c b/reactos/boot/freeldr/freeldr/reactos/binhive.c
index 3270bd3b93a..40c9277e325 100644
--- a/reactos/boot/freeldr/freeldr/reactos/binhive.c
+++ b/reactos/boot/freeldr/freeldr/reactos/binhive.c
@@ -40,7 +40,7 @@ static VOID
NTAPI
CmpFree (PVOID Ptr, IN ULONG Quota)
{
- return MmHeapFree(Ptr);
+ MmHeapFree(Ptr);
}
static BOOLEAN
diff --git a/reactos/boot/freeldr/freeldr/reactos/setupldr.c b/reactos/boot/freeldr/freeldr/reactos/setupldr.c
index 5f6cd33588c..2cea745ca3c 100644
--- a/reactos/boot/freeldr/freeldr/reactos/setupldr.c
+++ b/reactos/boot/freeldr/freeldr/reactos/setupldr.c
@@ -60,11 +60,12 @@ VOID LoadReactOSSetup(VOID)
NULL };
CHAR FileName[256];
- HINF InfHandle;
- ULONG ErrorLine;
- INFCONTEXT InfContext;
+ HINF InfHandle;
+ ULONG ErrorLine;
+ INFCONTEXT InfContext;
PIMAGE_NT_HEADERS NtHeader;
PVOID LoadBase;
+ extern BOOLEAN FrLdrBootType;
/* Setup multiboot information structure */
LoaderBlock.CommandLine = reactos_kernel_cmdline;
@@ -108,8 +109,7 @@ VOID LoadReactOSSetup(VOID)
#endif
UiDrawStatusText("");
- extern BOOLEAN FrLdrBootType;
- FrLdrBootType = TRUE;
+ FrLdrBootType = TRUE;
/* Detect hardware */
UiDrawStatusText("Detecting hardware...");
diff --git a/reactos/boot/freeldr/freeldr/rtl/libsupp.c b/reactos/boot/freeldr/freeldr/rtl/libsupp.c
index fafba51fef9..84acfdc99b0 100644
--- a/reactos/boot/freeldr/freeldr/rtl/libsupp.c
+++ b/reactos/boot/freeldr/freeldr/rtl/libsupp.c
@@ -42,5 +42,5 @@ NTAPI
RtlpFreeMemory(PVOID Mem,
ULONG Tag)
{
- return MmHeapFree(Mem);
+ MmHeapFree(Mem);
}
diff --git a/reactos/boot/freeldr/freeldr/setupldr_main.rbuild b/reactos/boot/freeldr/freeldr/setupldr_main.rbuild
index 3220c051c3b..4d7e5714544 100644
--- a/reactos/boot/freeldr/freeldr/setupldr_main.rbuild
+++ b/reactos/boot/freeldr/freeldr/setupldr_main.rbuild
@@ -19,9 +19,9 @@
setupldr.c
-
-
- setupldr2.c
-
-
+
+
+ setupldr2.c
+
+
diff --git a/reactos/boot/freeldr/freeldr/ui/tui.c b/reactos/boot/freeldr/freeldr/ui/tui.c
index 5fbf5f278ab..38081d59d09 100644
--- a/reactos/boot/freeldr/freeldr/ui/tui.c
+++ b/reactos/boot/freeldr/freeldr/ui/tui.c
@@ -27,9 +27,9 @@ PVOID TextVideoBuffer = NULL;
*/
int TuiPrintf(const char *format, ... )
{
+ char c, *ptr, str[16];
va_list ap;
va_start(ap,format);
- char c, *ptr, str[16];
while ((c = *(format++)))
{
@@ -41,25 +41,11 @@ int TuiPrintf(const char *format, ... )
{
switch (c = *(format++))
{
- case 'd': case 'u': case 'x':
- if (c == 'x')
- _itoa(va_arg(ap, unsigned long), str, 16);
- else
- _itoa(va_arg(ap, unsigned long), str, 10);
-
- ptr = str;
-
- while (*ptr)
- {
- MachConsPutChar(*(ptr++));
- }
+ case 'c':
+ MachConsPutChar((va_arg(ap, int)) & 0xff);
break;
-
- case 'c': MachConsPutChar((va_arg(ap,int))&0xff); break;
-
case 's':
- ptr = va_arg(ap,char *);
-
+ ptr = va_arg(ap, char *);
while ((c = *(ptr++)))
{
MachConsPutChar(c);
@@ -68,6 +54,20 @@ int TuiPrintf(const char *format, ... )
case '%':
MachConsPutChar(c);
break;
+ case 'l':
+ c = *(format++);
+ /* Fall through. */
+ case 'd': case 'u': case 'x':
+ if (c == 'x')
+ _itoa(va_arg(ap, unsigned long), str, 16);
+ else
+ _itoa(va_arg(ap, unsigned long), str, 10);
+ ptr = str;
+ while (*ptr)
+ {
+ MachConsPutChar(*(ptr++));
+ }
+ break;
default:
printf("\nprintf() invalid format specifier - %%%c\n", c);
break;
@@ -76,7 +76,6 @@ int TuiPrintf(const char *format, ... )
}
va_end(ap);
-
return 0;
}
diff --git a/reactos/boot/freeldr/freeldr/video/fade.c b/reactos/boot/freeldr/freeldr/video/fade.c
index 14cedf980e1..b653ce6b739 100644
--- a/reactos/boot/freeldr/freeldr/video/fade.c
+++ b/reactos/boot/freeldr/freeldr/video/fade.c
@@ -38,7 +38,10 @@ VOID VideoFadeIn(PPALETTE_ENTRY Palette, ULONG ColorCount)
{
ULONG Index;
ULONG Color;
- PALETTE_ENTRY PaletteColors[ColorCount];
+ PPALETTE_ENTRY PaletteColors;
+
+ PaletteColors = MmHeapAlloc(sizeof(PALETTE_ENTRY) * ColorCount);
+ if (!PaletteColors) return;
for (Index=0; Index
-
+
-
+
-fno-unit-at-a-time
diff --git a/reactos/dll/win32/crypt32/crypt32.spec b/reactos/dll/win32/crypt32/crypt32.spec
index 3591d17d234..534bee7319f 100644
--- a/reactos/dll/win32/crypt32/crypt32.spec
+++ b/reactos/dll/win32/crypt32/crypt32.spec
@@ -20,6 +20,7 @@
@ stdcall CertCreateCTLContext(long ptr long)
@ stdcall CertCreateCertificateChainEngine(ptr ptr)
@ stdcall CertCreateCertificateContext(long ptr long)
+@ stdcall CertCreateContext(long long ptr long long ptr)
@ stdcall CertCreateSelfSignCertificate(long ptr long ptr ptr ptr ptr ptr)
@ stdcall CertDeleteCRLFromStore(ptr)
@ stdcall CertDeleteCTLFromStore(ptr)
@@ -162,7 +163,7 @@
@ stdcall CryptQueryObject(long ptr long long long ptr ptr ptr ptr ptr ptr)
@ stdcall CryptRegisterDefaultOIDFunction(long str long wstr)
@ stdcall CryptRegisterOIDFunction(long str str wstr str)
-@ stub CryptRegisterOIDInfo
+@ stdcall CryptRegisterOIDInfo(ptr long)
@ stdcall CryptSIPAddProvider(ptr)
@ stdcall CryptSIPCreateIndirectData(ptr ptr ptr)
@ stdcall CryptSIPGetSignedDataMsg(ptr ptr long ptr ptr)
diff --git a/reactos/dll/win32/crypt32/crypt32_De.rc b/reactos/dll/win32/crypt32/crypt32_De.rc
index 1d9cbb790e0..0a8bd3871e4 100644
--- a/reactos/dll/win32/crypt32/crypt32_De.rc
+++ b/reactos/dll/win32/crypt32/crypt32_De.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptres.h"
+
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
#pragma code_page(65001)
@@ -239,5 +241,3 @@ STRINGTABLE DISCARDABLE
IDS_NETSCAPE_SMIME_CA "S/MIME Zertifikationsautorität"
IDS_NETSCAPE_SIGN_CA "Zertifikationsautorität der Signatur"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/crypt32/crypt32_En.rc b/reactos/dll/win32/crypt32/crypt32_En.rc
index e24ce860f67..4670029f310 100644
--- a/reactos/dll/win32/crypt32/crypt32_En.rc
+++ b/reactos/dll/win32/crypt32/crypt32_En.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptres.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/crypt32/crypt32_Fr.rc b/reactos/dll/win32/crypt32/crypt32_Fr.rc
index 08a1898852e..030a3a98500 100644
--- a/reactos/dll/win32/crypt32/crypt32_Fr.rc
+++ b/reactos/dll/win32/crypt32/crypt32_Fr.rc
@@ -1,7 +1,8 @@
/*
* crypt32 dll French resources
*
- * Copyright 2006-2008 Jonathan Ernst
+ * Copyright 2006-2009 Jonathan Ernst
+ * Copyright 2009 Frédéric Delanoy
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -18,220 +19,225 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptres.h"
+
+#pragma code_page(65001)
+
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
- IDS_AUTHORITY_KEY_ID "Identifiant de l'authorit de la cl"
- IDS_KEY_ATTRIBUTES "Attributs de la cl"
- IDS_KEY_USAGE_RESTRICTION "Restrictions de l'utilisation de la cl"
- IDS_SUBJECT_ALT_NAME "Subject Alternative Name"
- IDS_ISSUER_ALT_NAME "Issuer Alternative Name"
- IDS_BASIC_CONSTRAINTS "Basic Constraints"
- IDS_KEY_USAGE "Utilisation de la cl"
- IDS_CERT_POLICIES "Certificate Policies"
- IDS_SUBJECT_KEY_IDENTIFIER "Subject Key Identifier"
- IDS_CRL_REASON_CODE "CRL Reason Code"
- IDS_CRL_DIST_POINTS "CRL Distribution Points"
- IDS_ENHANCED_KEY_USAGE "Enhanced Key Usage"
- IDS_AUTHORITY_INFO_ACCESS "Authority Information Access"
- IDS_CERT_EXTENSIONS "Certificate Extensions"
- IDS_NEXT_UPDATE_LOCATION "Next Update Location"
- IDS_YES_OR_NO_TRUST "Yes or No Trust"
- IDS_EMAIL_ADDRESS "Email Address"
- IDS_UNSTRUCTURED_NAME "Unstructured Name"
- IDS_CONTENT_TYPE "Content Type"
- IDS_MESSAGE_DIGEST "Message Digest"
- IDS_SIGNING_TIME "Signing Time"
- IDS_COUNTER_SIGN "Counter Sign"
- IDS_CHALLENGE_PASSWORD "Challenge Password"
- IDS_UNSTRUCTURED_ADDRESS "Unstructured Address"
- IDS_SMIME_CAPABILITIES "SMIME Capabilities"
- IDS_PREFER_SIGNED_DATA "Prefer Signed Data"
- IDS_CPS "CPS"
+ IDS_AUTHORITY_KEY_ID "Identifiant de l'autorité de la clé"
+ IDS_KEY_ATTRIBUTES "Attributs de la clé"
+ IDS_KEY_USAGE_RESTRICTION "Restrictions de l'utilisation de la clé"
+ IDS_SUBJECT_ALT_NAME "Nom alternatif du sujet"
+ IDS_ISSUER_ALT_NAME "Nom alternatif de l'émetteur"
+ IDS_BASIC_CONSTRAINTS "Contraintes de base"
+ IDS_KEY_USAGE "Utilisation de la clé"
+ IDS_CERT_POLICIES "Politiques de certificats"
+ IDS_SUBJECT_KEY_IDENTIFIER "Identifiant de clé du sujet"
+ IDS_CRL_REASON_CODE "Code de raison pour la LRC"
+ IDS_CRL_DIST_POINTS "Points de distribution de LRC"
+ IDS_ENHANCED_KEY_USAGE "Utilisation complémentaire de la clé"
+ IDS_AUTHORITY_INFO_ACCESS "Accès aux informations de l'autorité"
+ IDS_CERT_EXTENSIONS "Extensions de certificats"
+ IDS_NEXT_UPDATE_LOCATION "Emplacement de la mise à jour suivante"
+ IDS_YES_OR_NO_TRUST "Confiance Oui ou Non"
+ IDS_EMAIL_ADDRESS "Adresse électronique"
+ IDS_UNSTRUCTURED_NAME "Nom non structuré"
+ IDS_CONTENT_TYPE "Type de contenu"
+ IDS_MESSAGE_DIGEST "Empreinte du message"
+ IDS_SIGNING_TIME "Heure de la signature"
+ IDS_COUNTER_SIGN "Contresignature"
+ IDS_CHALLENGE_PASSWORD "Mot de passe défi"
+ IDS_UNSTRUCTURED_ADDRESS "Adresse non structurée"
+ IDS_SMIME_CAPABILITIES "Aptitudes SMIME"
+ IDS_PREFER_SIGNED_DATA "Préférer les données signées"
+ IDS_CPS "Énoncé des pratiques de certification (CPS)"
IDS_USER_NOTICE "Notice utilisateur"
- IDS_OCSP "On-line Certificate Status Protocol"
- IDS_CA_ISSUER "Certification Authority Issuer"
- IDS_CERT_TEMPLATE_NAME "Certification Template Name"
- IDS_CERT_TYPE "Certificate Type"
+ IDS_OCSP "Protocole de vérification en ligne de certificat"
+ IDS_CA_ISSUER "Émetteur de l'autorité de certification"
+ IDS_CERT_TEMPLATE_NAME "Nom de modèle de certification"
+ IDS_CERT_TYPE "Type de certificat"
IDS_CERT_MANIFOLD "Certificate Manifold"
IDS_NETSCAPE_CERT_TYPE "Type de certificat Netscape"
IDS_NETSCAPE_BASE_URL "URL Netscape de base"
- IDS_NETSCAPE_REVOCATION_URL "URL Netscape de rvocation"
- IDS_NETSCAPE_CA_REVOCATION_URL "URL Netscape de rvocation du certificat"
+ IDS_NETSCAPE_REVOCATION_URL "URL Netscape de révocation"
+ IDS_NETSCAPE_CA_REVOCATION_URL "URL Netscape de révocation de l'AC"
IDS_NETSCAPE_CERT_RENEWAL_URL "URL Netscape de renouvellement du certificat"
- IDS_NETSCAPE_CA_POLICY_URL "Netscape CA Policy URL"
- IDS_NETSCAPE_SSL_SERVER_NAME "Netscape SSL ServerName"
+ IDS_NETSCAPE_CA_POLICY_URL "URL Netscape des stratégies d'ACL"
+ IDS_NETSCAPE_SSL_SERVER_NAME "Nom du serveur SSL de Netscape"
IDS_NETSCAPE_COMMENT "Commentaire Netscape"
IDS_SPC_SP_AGENCY_INFO "SpcSpAgencyInfo"
IDS_SPC_FINANCIAL_CRITERIA "SpcFinancialCriteria"
IDS_SPC_MINIMAL_CRITERIA "SpcMinimalCriteria"
- IDS_COUNTRY "Pays/Rgion"
+ IDS_COUNTRY "Pays/Région"
IDS_ORGANIZATION "Organisation"
- IDS_ORGANIZATIONAL_UNIT "Unit d'organisation"
+ IDS_ORGANIZATIONAL_UNIT "Unité d'organisation"
IDS_COMMON_NAME "Nom commun"
- IDS_LOCALITY "Locality"
- IDS_STATE_OR_PROVINCE "tat ou province"
+ IDS_LOCALITY "Localité"
+ IDS_STATE_OR_PROVINCE "État ou province"
IDS_TITLE "Titre"
- IDS_GIVEN_NAME "Nom donn"
+ IDS_GIVEN_NAME "Nom donné"
IDS_INITIALS "Initiales"
IDS_SUR_NAME "Nom de famille"
- IDS_DOMAIN_COMPONENT "Domain Component"
+ IDS_DOMAIN_COMPONENT "Composant de domaine"
IDS_STREET_ADDRESS "Adresse"
- IDS_SERIAL_NUMBER "Numro de srie"
+ IDS_SERIAL_NUMBER "Numéro de série"
IDS_CA_VERSION "Version du CA"
- IDS_CROSS_CA_VERSION "Cross CA Version"
- IDS_SERIALIZED_SIG_SERIAL_NUMBER "Serialized Signature Serial Number"
+ IDS_CROSS_CA_VERSION "Version de certification croisées d'AC"
+ IDS_SERIALIZED_SIG_SERIAL_NUMBER "Numéro de série de signature sérialisée"
IDS_PRINCIPAL_NAME "Nom principal"
- IDS_WINDOWS_PRODUCT_UPDATE "Mise jour de Windows"
- IDS_ENROLLMENT_NAME_VALUE_PAIR "Enrollment Name Value Pair"
- IDS_OS_VERSION "Version du systme d'exploitation"
- IDS_ENROLLMENT_CSP "Enrollment CSP"
- IDS_CRL_NUMBER "Numro CRL"
- IDS_DELTA_CRL_INDICATOR "Delta CRL Indicator"
- IDS_ISSUING_DIST_POINT "Issuing Distribution Point"
- IDS_FRESHEST_CRL "Freshest CRL"
+ IDS_WINDOWS_PRODUCT_UPDATE "Mise à jour de Windows"
+ IDS_ENROLLMENT_NAME_VALUE_PAIR "Paire nom/value d'enrôlement"
+ IDS_OS_VERSION "Version du système d'exploitation"
+ IDS_ENROLLMENT_CSP "Fournisseur de service cryptographique (CSP) d'enrôlement"
+ IDS_CRL_NUMBER "Numéro de la LRC"
+ IDS_DELTA_CRL_INDICATOR "Indicateur de delta-LRC"
+ IDS_ISSUING_DIST_POINT "Point de distribution d'émission"
+ IDS_FRESHEST_CRL "LRC la plus récente"
IDS_NAME_CONSTRAINTS "Contraintes de nom"
- IDS_POLICY_MAPPINGS "Policy Mappings"
- IDS_POLICY_CONSTRAINTS "Policy Constraints"
- IDS_CROSS_CERT_DIST_POINTS "Cross-Certificate Distribution Points"
- IDS_APPLICATION_POLICIES "Application Policies"
- IDS_APPLICATION_POLICY_MAPPINGS "Application Policy Mappings"
- IDS_APPLICATION_POLICY_CONSTRAINTS "Application Policy Constraints"
- IDS_CMC_DATA "Donnes CMC"
- IDS_CMC_RESPONSE "Rponse CMC"
- IDS_UNSIGNED_CMC_REQUEST "Unsigned CMC Request"
- IDS_CMC_STATUS_INFO "CMC Status Info"
- IDS_CMC_EXTENSIONS "CMC Extensions"
- IDS_CMC_ATTRIBUTES "CMC Attributes"
- IDS_PKCS_7_DATA "Donnes PKCS 7"
- IDS_PKCS_7_SIGNED "Sign avec PKCS 7"
- IDS_PKCS_7_ENVELOPED "Envelopp avec PKCS 7"
- IDS_PKCS_7_SIGNED_ENVELOPED "Envelopp et sign avec PKCS 7"
- IDS_PKCS_7_DIGESTED "Hach avec PKCS 7"
- IDS_PKCS_7_ENCRYPTED "Chiffr avec PKCS 7"
- IDS_PREVIOUS_CA_CERT_HASH "Previous CA Certificate Hash"
- IDS_CRL_VIRTUAL_BASE "Virtual Base CRL Number"
- IDS_CRL_NEXT_PUBLISH "Next CRL Publish"
+ IDS_POLICY_MAPPINGS "Mappings de politiques"
+ IDS_POLICY_CONSTRAINTS "Contraintes de politiques"
+ IDS_CROSS_CERT_DIST_POINTS "Points de distribution de certificats croisés"
+ IDS_APPLICATION_POLICIES "Politiques applicatives"
+ IDS_APPLICATION_POLICY_MAPPINGS "Mappings de politiques applicatives"
+ IDS_APPLICATION_POLICY_CONSTRAINTS "Contraintes de politiques applicatives"
+ IDS_CMC_DATA "Données CMC"
+ IDS_CMC_RESPONSE "Réponse CMC"
+ IDS_UNSIGNED_CMC_REQUEST "Requête CMC non signée"
+ IDS_CMC_STATUS_INFO "Informations sur le statut CMC"
+ IDS_CMC_EXTENSIONS "Extensions CMC"
+ IDS_CMC_ATTRIBUTES "Attributs CMC"
+ IDS_PKCS_7_DATA "Données PKCS 7"
+ IDS_PKCS_7_SIGNED "Signé avec PKCS 7"
+ IDS_PKCS_7_ENVELOPED "Enveloppé avec PKCS 7"
+ IDS_PKCS_7_SIGNED_ENVELOPED "Enveloppé et signé avec PKCS 7"
+ IDS_PKCS_7_DIGESTED "Haché avec PKCS 7"
+ IDS_PKCS_7_ENCRYPTED "Chiffré avec PKCS 7"
+ IDS_PREVIOUS_CA_CERT_HASH "Empreinte précédente du certificat de l'AC"
+ IDS_CRL_VIRTUAL_BASE "Numéro de LRC de base virtuelle"
+ IDS_CRL_NEXT_PUBLISH "Prochaine publication de LRC"
IDS_CA_EXCHANGE "Certificat de chiffrement CA"
- IDS_KEY_RECOVERY_AGENT "Key Recovery Agent"
- IDS_CERTIFICATE_TEMPLATE "Certificate Template Information"
- IDS_ENTERPRISE_ROOT_OID "Enterprise Root OID"
+ IDS_KEY_RECOVERY_AGENT "Agent de recouvrement de clé"
+ IDS_CERTIFICATE_TEMPLATE "Informations sur le modèle de certificats"
+ IDS_ENTERPRISE_ROOT_OID "OID racine de l'entreprise"
IDS_RDN_DUMMY_SIGNER "Signataire factice"
- IDS_ARCHIVED_KEY_ATTR "Cl de chiffrement prive"
- IDS_CRL_SELF_CDP "Published CRL Locations"
- IDS_REQUIRE_CERT_CHAIN_POLICY "Enforce Certificate Chain Policy"
- IDS_TRANSACTION_ID "Transaction Id"
- IDS_SENDER_NONCE "Sender Nonce"
- IDS_RECIPIENT_NONCE "Recipient Nonce"
- IDS_REG_INFO "Reg Info"
- IDS_GET_CERTIFICATE "Get Certificate"
- IDS_GET_CRL "Get CRL"
- IDS_REVOKE_REQUEST "Revoke Request"
- IDS_QUERY_PENDING "Query Pending"
- IDS_SORTED_CTL "Certificate Trust List"
- IDS_ARCHIVED_KEY_CERT_HASH "Archived Key Certificate Hash"
- IDS_PRIVATE_KEY_USAGE_PERIOD "Private Key Usage Period"
- IDS_CLIENT_INFORMATION "Client Information"
- IDS_SERVER_AUTHENTICATION "Server Authentication"
- IDS_CLIENT_AUTHENTICATION "Client Authentication"
- IDS_CODE_SIGNING "Code Signing"
- IDS_SECURE_EMAIL "Secure Email"
- IDS_TIME_STAMPING "Time Stamping"
- IDS_MICROSOFT_TRUST_LIST_SIGNING "Microsoft Trust List Signing"
- IDS_MICROSOFT_TIME_STAMPING "Microsoft Time Stamping"
- IDS_IPSEC_END_SYSTEM "IP security end system"
- IDS_IPSEC_TUNNEL "IP security tunnel termination"
- IDS_IPSEC_USER "IP security user"
- IDS_EFS "Encrypting File System"
- IDS_WHQL_CRYPTO "Windows Hardware Driver Verification"
- IDS_NT5_CRYPTO "Windows System Component Verification"
- IDS_OEM_WHQL_CRYPTO "OEM Windows System Component Verification"
- IDS_EMBEDDED_NT_CRYPTO "Embedded Windows System Component Verification"
- IDS_KEY_PACK_LICENSES "Key Pack Licenses"
- IDS_LICENSE_SERVER "License Server Verification"
- IDS_SMART_CARD_LOGON "Smart Card Logon"
- IDS_DIGITAL_RIGHTS "Digital Rights"
- IDS_QUALIFIED_SUBORDINATION "Qualified Subordination"
- IDS_KEY_RECOVERY "Rcupration de cl"
+ IDS_ARCHIVED_KEY_ATTR "Clé de chiffrement privée"
+ IDS_CRL_SELF_CDP "Emplacement des LRC publiées"
+ IDS_REQUIRE_CERT_CHAIN_POLICY "Requérir une polique de chaîne de certification"
+ IDS_TRANSACTION_ID "Identifiant de transaction"
+ IDS_SENDER_NONCE "Nonce de l'émetteur"
+ IDS_RECIPIENT_NONCE "Nonce du récepteur"
+ IDS_REG_INFO "Informations d'enregistrement"
+ IDS_GET_CERTIFICATE "Obtenir un certificat"
+ IDS_GET_CRL "Obtenir une LRC"
+ IDS_REVOKE_REQUEST "Révoquer une requête"
+ IDS_QUERY_PENDING "Requête en attente"
+ IDS_SORTED_CTL "Liste de certificats de confiance"
+ IDS_ARCHIVED_KEY_CERT_HASH "Empreinte du certificat de clé archivée"
+ IDS_PRIVATE_KEY_USAGE_PERIOD "Période d'utilisation de la clé privée"
+ IDS_CLIENT_INFORMATION "Informations sur le client"
+ IDS_SERVER_AUTHENTICATION "Authentification du serveur"
+ IDS_CLIENT_AUTHENTICATION "Authentification du client"
+ IDS_CODE_SIGNING "Signature de code"
+ IDS_SECURE_EMAIL "Messagerie sécurisé"
+ IDS_TIME_STAMPING "Horodatage"
+ IDS_MICROSOFT_TRUST_LIST_SIGNING "Signature de la liste de confiance Microsoft"
+ IDS_MICROSOFT_TIME_STAMPING "Horodatage Microsoft"
+ IDS_IPSEC_END_SYSTEM "Système terminal IPsec"
+ IDS_IPSEC_TUNNEL "Terminaison du tunnel IPsec"
+ IDS_IPSEC_USER "Utilisateur IPsec"
+ IDS_EFS "Système de fichiers chiffré (EFS)"
+ IDS_WHQL_CRYPTO "Vérification des pilotes matériels de Windows"
+ IDS_NT5_CRYPTO "Vérification des composants système de Windows"
+ IDS_OEM_WHQL_CRYPTO "Vérification des composants système de Windows OEM"
+ IDS_EMBEDDED_NT_CRYPTO "Vérification des composants système de Windows embarqué"
+ IDS_KEY_PACK_LICENSES "Licences de jeux de clés"
+ IDS_LICENSE_SERVER "Vérification du serveur de licence"
+ IDS_SMART_CARD_LOGON "Connexion avec carte à puce"
+ IDS_DIGITAL_RIGHTS "Droits numériques"
+ IDS_QUALIFIED_SUBORDINATION "Subordination conditionnelle"
+ IDS_KEY_RECOVERY "Recouvrement de clé"
IDS_DOCUMENT_SIGNING "Signature de document"
- IDS_IPSEC_IKE_INTERMEDIATE "IP security IKE intermediate"
- IDS_FILE_RECOVERY "Rcupration de fichier"
+ IDS_IPSEC_IKE_INTERMEDIATE "Intermédiaire IKE IPsec"
+ IDS_FILE_RECOVERY "Restauration de fichier"
IDS_ROOT_LIST_SIGNER "Signataires de la liste racine"
- IDS_ANY_APPLICATION_POLICIES "All application policies"
- IDS_DS_EMAIL_REPLICATION "Directory Service Email Replication"
- IDS_ENROLLMENT_AGENT "Certificate Request Agent"
- IDS_LIFETIME_SIGNING "Lifetime Signing"
- IDS_ANY_CERT_POLICY "All issuance policies"
+ IDS_ANY_APPLICATION_POLICIES "Toutes les politiques applicatives"
+ IDS_DS_EMAIL_REPLICATION "Réplication de courriers électroniques du service d'annuaire"
+ IDS_ENROLLMENT_AGENT "Agent de demande de certificat"
+ IDS_LIFETIME_SIGNING "Signature à vie"
+ IDS_ANY_CERT_POLICY "Toutes les politiques d'émission"
}
STRINGTABLE DISCARDABLE
{
- IDS_LOCALIZEDNAME_ROOT "Autorits de certification de confiance"
+ IDS_LOCALIZEDNAME_ROOT "Autorités de certification de confiance"
IDS_LOCALIZEDNAME_MY "Personnel"
- IDS_LOCALIZEDNAME_CA "Autorits intermdiaires"
+ IDS_LOCALIZEDNAME_CA "Autorités intermédiaires"
IDS_LOCALIZEDNAME_ADDRESSBOOK "Autres personnes"
+ IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Éditeurs de confiance"
}
STRINGTABLE DISCARDABLE
{
- IDS_KEY_ID "KeyID="
- IDS_CERT_ISSUER "Certificate Issuer"
- IDS_CERT_SERIAL_NUMBER "Certificate Serial Number="
- IDS_ALT_NAME_OTHER_NAME "Other Name="
- IDS_ALT_NAME_RFC822_NAME "Email Address="
- IDS_ALT_NAME_DNS_NAME "DNS Name="
- IDS_ALT_NAME_DIRECTORY_NAME "Directory Address"
+ IDS_KEY_ID "ID de clé ="
+ IDS_CERT_ISSUER "Émetteur du certificat"
+ IDS_CERT_SERIAL_NUMBER "Numéro de série du certificat ="
+ IDS_ALT_NAME_OTHER_NAME "Autre nom ="
+ IDS_ALT_NAME_RFC822_NAME "Adresse électronique ="
+ IDS_ALT_NAME_DNS_NAME "Nom DNS ="
+ IDS_ALT_NAME_DIRECTORY_NAME "Adresse du répertoire"
IDS_ALT_NAME_URL "URL="
- IDS_ALT_NAME_IP_ADDRESS "Adresse IP="
- IDS_ALT_NAME_MASK "Mask="
- IDS_ALT_NAME_REGISTERED_ID "Registered ID="
- IDS_USAGE_UNKNOWN "Unknown Key Usage"
- IDS_SUBJECT_TYPE "Subject Type="
- IDS_SUBJECT_TYPE_CA "CA"
- IDS_SUBJECT_TYPE_END_CERT "End Entity"
- IDS_PATH_LENGTH "Path Length Constraint="
+ IDS_ALT_NAME_IP_ADDRESS "Adresse IP ="
+ IDS_ALT_NAME_MASK "Masque ="
+ IDS_ALT_NAME_REGISTERED_ID "ID enregistré ="
+ IDS_USAGE_UNKNOWN "Utilisation de la clé inconnue"
+ IDS_SUBJECT_TYPE "Type de sujet ="
+ IDS_SUBJECT_TYPE_CA "AC"
+ IDS_SUBJECT_TYPE_END_CERT "Entité terminale"
+ IDS_PATH_LENGTH "Contrainte de longueur de chemin ="
IDS_PATH_LENGTH_NONE "Aucune"
- IDS_INFO_NOT_AVAILABLE "Information Not Available"
- IDS_AIA "Authority Info Access"
- IDS_ACCESS_METHOD "Access Method="
+ IDS_INFO_NOT_AVAILABLE "Informations non disponibles"
+ IDS_AIA "Accès aux informations de l'autorité"
+ IDS_ACCESS_METHOD "Méthode d'accès ="
IDS_ACCESS_METHOD_OCSP "OCSP"
- IDS_ACCESS_METHOD_CA_ISSUERS "CA Issuers"
- IDS_ACCESS_METHOD_UNKNOWN "Unknown Access Method"
- IDS_ACCESS_LOCATION "Alternative Name"
- IDS_CRL_DIST_POINT "CRL Distribution Point"
- IDS_CRL_DIST_POINT_NAME "Distribution Point Name"
- IDS_CRL_DIST_POINT_FULL_NAME "Full Name"
- IDS_CRL_DIST_POINT_RDN_NAME "RDN Name"
- IDS_CRL_DIST_POINT_REASON "CRL Reason="
- IDS_CRL_DIST_POINT_ISSUER "CRL Issuer"
- IDS_REASON_KEY_COMPROMISE "Key Compromise"
- IDS_REASON_CA_COMPROMISE "CA Compromise"
- IDS_REASON_AFFILIATION_CHANGED "Affiliation Changed"
- IDS_REASON_SUPERSEDED "Superseded"
- IDS_REASON_CESSATION_OF_OPERATION "Operation Ceased"
- IDS_REASON_CERTIFICATE_HOLD "Certificate Hold"
- IDS_FINANCIAL_CRITERIA "Financial Information="
- IDS_FINANCIAL_CRITERIA_AVAILABLE "Available"
- IDS_FINANCIAL_CRITERIA_NOT_AVAILABLE "Not Available"
- IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA "Meets Criteria="
+ IDS_ACCESS_METHOD_CA_ISSUERS "Émetteurs de l'AC"
+ IDS_ACCESS_METHOD_UNKNOWN "Méthode d'accès inconnue"
+ IDS_ACCESS_LOCATION "Nom alternatif"
+ IDS_CRL_DIST_POINT "Point de distribution de LRC"
+ IDS_CRL_DIST_POINT_NAME "Nom du point de distribution"
+ IDS_CRL_DIST_POINT_FULL_NAME "Nom complet"
+ IDS_CRL_DIST_POINT_RDN_NAME "Nom distingué relatif (RDN)"
+ IDS_CRL_DIST_POINT_REASON "Raison de la LRC ="
+ IDS_CRL_DIST_POINT_ISSUER "Émetteur de la LRC"
+ IDS_REASON_KEY_COMPROMISE "Clé compromise"
+ IDS_REASON_CA_COMPROMISE "AC compromise"
+ IDS_REASON_AFFILIATION_CHANGED "Affiliation modifiée"
+ IDS_REASON_SUPERSEDED "Supplanté"
+ IDS_REASON_CESSATION_OF_OPERATION "Cessation de opérations"
+ IDS_REASON_CERTIFICATE_HOLD "Certificat suspendu"
+ IDS_FINANCIAL_CRITERIA "Informations financières ="
+ IDS_FINANCIAL_CRITERIA_AVAILABLE "Disponible"
+ IDS_FINANCIAL_CRITERIA_NOT_AVAILABLE "Non disponible"
+ IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA "Respecte les critères ="
IDS_YES "Oui"
IDS_NO "Non"
- IDS_DIGITAL_SIGNATURE "Signature numrique"
- IDS_NON_REPUDIATION "Non-rpudiation"
- IDS_KEY_ENCIPHERMENT "Key Encipherment"
- IDS_DATA_ENCIPHERMENT "Data Encipherment"
- IDS_KEY_AGREEMENT "Key Agreement"
- IDS_CERT_SIGN "Certificate Signing"
- IDS_OFFLINE_CRL_SIGN "Off-line CRL Signing"
- IDS_CRL_SIGN "CRL Signing"
+ IDS_DIGITAL_SIGNATURE "Signature numérique"
+ IDS_NON_REPUDIATION "Non-répudiation"
+ IDS_KEY_ENCIPHERMENT "Chiffrement de la clé"
+ IDS_DATA_ENCIPHERMENT "Chiffrement de données"
+ IDS_KEY_AGREEMENT "Accord sur la clé"
+ IDS_CERT_SIGN "Signature de certificat"
+ IDS_OFFLINE_CRL_SIGN "Signature de LRC hors-ligne"
+ IDS_CRL_SIGN "Signature de LRC"
IDS_ENCIPHER_ONLY "Chiffrement seul"
- IDS_DECIPHER_ONLY "Dchiffrement seul"
- IDS_NETSCAPE_SSL_CLIENT "SSL Client Authentication"
- IDS_NETSCAPE_SSL_SERVER "SSL Server Authentication"
+ IDS_DECIPHER_ONLY "Déchiffrement seul"
+ IDS_NETSCAPE_SSL_CLIENT "Authentification de client SSL"
+ IDS_NETSCAPE_SSL_SERVER "Authentification de serveur SSL"
IDS_NETSCAPE_SMIME "S/MIME"
IDS_NETSCAPE_SIGN "Signature"
- IDS_NETSCAPE_SSL_CA "SSL CA"
- IDS_NETSCAPE_SMIME_CA "S/MIME CA"
+ IDS_NETSCAPE_SSL_CA "AC SSL"
+ IDS_NETSCAPE_SMIME_CA "AC S/MIME"
IDS_NETSCAPE_SIGN_CA "Signature CA"
}
diff --git a/reactos/dll/win32/crypt32/crypt32_Ko.rc b/reactos/dll/win32/crypt32/crypt32_Ko.rc
index 51e3fc32f67..1a0535300a5 100644
--- a/reactos/dll/win32/crypt32/crypt32_Ko.rc
+++ b/reactos/dll/win32/crypt32/crypt32_Ko.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptres.h"
+
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/crypt32/crypt32_Nl.rc b/reactos/dll/win32/crypt32/crypt32_Nl.rc
index 70ea2bac05d..e12d25d775f 100644
--- a/reactos/dll/win32/crypt32/crypt32_Nl.rc
+++ b/reactos/dll/win32/crypt32/crypt32_Nl.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptres.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/crypt32/crypt32_No.rc b/reactos/dll/win32/crypt32/crypt32_No.rc
index 18de84b8c4b..26652860105 100644
--- a/reactos/dll/win32/crypt32/crypt32_No.rc
+++ b/reactos/dll/win32/crypt32/crypt32_No.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptres.h"
+
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/crypt32/crypt32_Pt.rc b/reactos/dll/win32/crypt32/crypt32_Pt.rc
index 424f8ea7aee..5c5d3b701fb 100644
--- a/reactos/dll/win32/crypt32/crypt32_Pt.rc
+++ b/reactos/dll/win32/crypt32/crypt32_Pt.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptres.h"
+
LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/crypt32/crypt32_Ro.rc b/reactos/dll/win32/crypt32/crypt32_Ro.rc
new file mode 100644
index 00000000000..65d1c1eb91b
--- /dev/null
+++ b/reactos/dll/win32/crypt32/crypt32_Ro.rc
@@ -0,0 +1,243 @@
+/*
+ * crypt32 dll Romanian resources
+ *
+ * Copyright (C) 2009 Paul Chitescu
+ *
+ * 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 "cryptres.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_AUTHORITY_KEY_ID "Identificatorul cheii autorității"
+ IDS_KEY_ATTRIBUTES "Atributele cheii"
+ IDS_KEY_USAGE_RESTRICTION "Restricții de folosire a cheii"
+ IDS_SUBJECT_ALT_NAME "Nume alternativ al subiectului"
+ IDS_ISSUER_ALT_NAME "Nume alternativ al emitentului"
+ IDS_BASIC_CONSTRAINTS "Constrângeri de bază"
+ IDS_KEY_USAGE "Folosirea cheii"
+ IDS_CERT_POLICIES "Politicile certificatului"
+ IDS_SUBJECT_KEY_IDENTIFIER "Identificatorul subiectului cheii"
+ IDS_CRL_REASON_CODE "Codul motivului CRL"
+ IDS_CRL_DIST_POINTS "Puncte de distribuire CRL"
+ IDS_ENHANCED_KEY_USAGE "Extensii de folosirea a cheii"
+ IDS_AUTHORITY_INFO_ACCESS "Acces la informațiile de autoritate"
+ IDS_CERT_EXTENSIONS "Extensiile certificatului"
+ IDS_NEXT_UPDATE_LOCATION "Următoarea locație de actualizare"
+ IDS_YES_OR_NO_TRUST "Încredere Da sau Nu"
+ IDS_EMAIL_ADDRESS "Adresă de e-mail"
+ IDS_UNSTRUCTURED_NAME "Nume nestructurat"
+ IDS_CONTENT_TYPE "Tipul conținutului"
+ IDS_MESSAGE_DIGEST "Rezumatul mesajului"
+ IDS_SIGNING_TIME "Momentul semnării"
+ IDS_COUNTER_SIGN "Contrasemnat"
+ IDS_CHALLENGE_PASSWORD "Parola de provocare"
+ IDS_UNSTRUCTURED_ADDRESS "Adresă nestructurată"
+ IDS_SMIME_CAPABILITIES "Capabilități S/MIME"
+ IDS_PREFER_SIGNED_DATA "Preferă datele semnate"
+ IDS_CPS "CPS"
+ IDS_USER_NOTICE "Notiță utilizator"
+ IDS_OCSP "Protocol online de verificare a stării certificatului"
+ IDS_CA_ISSUER "Autoritatea de certificare emitentă"
+ IDS_CERT_TEMPLATE_NAME "Numele șablonului de certificat"
+ IDS_CERT_TYPE "Tipul certificatului"
+ IDS_CERT_MANIFOLD "Ramurile certificatului"
+ IDS_NETSCAPE_CERT_TYPE "Tipul certificatului Netscape"
+ IDS_NETSCAPE_BASE_URL "URL-ul de bază Netscape"
+ IDS_NETSCAPE_REVOCATION_URL "URL-ul de revocare Netscape"
+ IDS_NETSCAPE_CA_REVOCATION_URL "URL-ul de revocare a CA Netscape"
+ IDS_NETSCAPE_CERT_RENEWAL_URL "URL-ul de înnoire a certificatului Netscape"
+ IDS_NETSCAPE_CA_POLICY_URL "URL-ul politicii CA Netscape"
+ IDS_NETSCAPE_SSL_SERVER_NAME "Nume server SSL Netscape"
+ IDS_NETSCAPE_COMMENT "Comentariul Netscape"
+ IDS_SPC_SP_AGENCY_INFO "InformațiiAgențieSpcSp"
+ IDS_SPC_FINANCIAL_CRITERIA "CriteriiFinanciareSpc"
+ IDS_SPC_MINIMAL_CRITERIA "CriteriiMinimaleSpc"
+ IDS_COUNTRY "Țara/regiunea"
+ IDS_ORGANIZATION "Organizația"
+ IDS_ORGANIZATIONAL_UNIT "Unitatea organizațională"
+ IDS_COMMON_NAME "Nume uzual"
+ IDS_LOCALITY "Localitatea"
+ IDS_STATE_OR_PROVINCE "Statul sau provincia"
+ IDS_TITLE "Titlul"
+ IDS_GIVEN_NAME "Prenume"
+ IDS_INITIALS "Inițiale"
+ IDS_SUR_NAME "Nume"
+ IDS_DOMAIN_COMPONENT "Componentă de domeniu"
+ IDS_STREET_ADDRESS "Adresa"
+ IDS_SERIAL_NUMBER "Număr de serie"
+ IDS_CA_VERSION "Versiunea CA"
+ IDS_CROSS_CA_VERSION "Versiunea încrucișată CA"
+ IDS_SERIALIZED_SIG_SERIAL_NUMBER "Număr de serie al semnăturii serializate"
+ IDS_PRINCIPAL_NAME "Nume principal"
+ IDS_WINDOWS_PRODUCT_UPDATE "Actualizarea produsului Windows"
+ IDS_ENROLLMENT_NAME_VALUE_PAIR "Pereche nume-valoare de înscriere"
+ IDS_OS_VERSION "Versiunea sistemului de operare"
+ IDS_ENROLLMENT_CSP "CSP de înscriere"
+ IDS_CRL_NUMBER "Numărul CRL"
+ IDS_DELTA_CRL_INDICATOR "Indicator diferență CRL"
+ IDS_ISSUING_DIST_POINT "Punct de distribuție emitent"
+ IDS_FRESHEST_CRL "Cel mai proaspăt CRL"
+ IDS_NAME_CONSTRAINTS "Constrângeri de nume"
+ IDS_POLICY_MAPPINGS "Mapări de politică"
+ IDS_POLICY_CONSTRAINTS "Constrângeri de politică"
+ IDS_CROSS_CERT_DIST_POINTS "Puncte încrucișate de distribuție certificate"
+ IDS_APPLICATION_POLICIES "Politici de aplicație"
+ IDS_APPLICATION_POLICY_MAPPINGS "Mapări de politică aplicație"
+ IDS_APPLICATION_POLICY_CONSTRAINTS "Constrângeri de politică aplicație"
+ IDS_CMC_DATA "Date CMC"
+ IDS_CMC_RESPONSE "Răspuns CMC"
+ IDS_UNSIGNED_CMC_REQUEST "Cerere CMC nesemnată"
+ IDS_CMC_STATUS_INFO "Informații de stare CMC"
+ IDS_CMC_EXTENSIONS "Extensii CMC"
+ IDS_CMC_ATTRIBUTES "Atribute CMC"
+ IDS_PKCS_7_DATA "Date PKCS 7"
+ IDS_PKCS_7_SIGNED "PKCS 7 semnat"
+ IDS_PKCS_7_ENVELOPED "PKCS 7 încapsulat"
+ IDS_PKCS_7_SIGNED_ENVELOPED "PKCS 7 semnat și încapsulat"
+ IDS_PKCS_7_DIGESTED "PKCS 7 rezumat"
+ IDS_PKCS_7_ENCRYPTED "PKCS 7 criptat"
+ IDS_PREVIOUS_CA_CERT_HASH "Rezumatul certificatului CA anterior"
+ IDS_CRL_VIRTUAL_BASE "Baza virtuală a numerelor CRL"
+ IDS_CRL_NEXT_PUBLISH "Următorul editor CRL"
+ IDS_CA_EXCHANGE "Certificat de criptare CA"
+ IDS_KEY_RECOVERY_AGENT "Agent de recuperare a cheilor"
+ IDS_CERTIFICATE_TEMPLATE "Șablon de informații de certificat"
+ IDS_ENTERPRISE_ROOT_OID "OID rădăcină al întreprinderii"
+ IDS_RDN_DUMMY_SIGNER "Semnatar implicit"
+ IDS_ARCHIVED_KEY_ATTR "Cheie privată criptată"
+ IDS_CRL_SELF_CDP "Locații CRL publicate"
+ IDS_REQUIRE_CERT_CHAIN_POLICY "Impune politica de certificare în lanț"
+ IDS_TRANSACTION_ID "Identificator de tranzacție"
+ IDS_SENDER_NONCE "Identificator unic al expeditorului"
+ IDS_RECIPIENT_NONCE "Identificator unic al destinatarului"
+ IDS_REG_INFO "Informații de înregistrare"
+ IDS_GET_CERTIFICATE "Obținere certificat"
+ IDS_GET_CRL "Obținere CRL"
+ IDS_REVOKE_REQUEST "Cerere de revocare"
+ IDS_QUERY_PENDING "Interogare în curs"
+ IDS_SORTED_CTL "Lista certificatelor de încredere"
+ IDS_ARCHIVED_KEY_CERT_HASH "Rezumatul certificatului cheii arhivate"
+ IDS_PRIVATE_KEY_USAGE_PERIOD "Perioada de folosire a cheii private"
+ IDS_CLIENT_INFORMATION "Informații client"
+ IDS_SERVER_AUTHENTICATION "Autentificare server"
+ IDS_CLIENT_AUTHENTICATION "Autentificare client"
+ IDS_CODE_SIGNING "Semnarea codului"
+ IDS_SECURE_EMAIL "E-mail securizat"
+ IDS_TIME_STAMPING "Marcare temporală"
+ IDS_MICROSOFT_TRUST_LIST_SIGNING "Semnare listă de încredere Microsoft"
+ IDS_MICROSOFT_TIME_STAMPING "Marcare temporală Microsoft"
+ IDS_IPSEC_END_SYSTEM "Sistem terminal de securitate IP"
+ IDS_IPSEC_TUNNEL "Capăt de tunel de securitate IP"
+ IDS_IPSEC_USER "Utilizator de securitate IP"
+ IDS_EFS "Sistem de fișiere criptat"
+ IDS_WHQL_CRYPTO "Verificarea driverelor hardware Windows"
+ IDS_NT5_CRYPTO "Verificarea componentelor sistem Windows"
+ IDS_OEM_WHQL_CRYPTO "Verificarea componentelor sistem Windows OEM"
+ IDS_EMBEDDED_NT_CRYPTO "Verificarea componentelor sistem Windows Embedded"
+ IDS_KEY_PACK_LICENSES "Licențiere pachet de chei"
+ IDS_LICENSE_SERVER "Verificarea serverului de licență"
+ IDS_SMART_CARD_LOGON "Log on cu Smart Card"
+ IDS_DIGITAL_RIGHTS "Drepturi digitale"
+ IDS_QUALIFIED_SUBORDINATION "Subordonare calificată"
+ IDS_KEY_RECOVERY "Recuperare de chei"
+ IDS_DOCUMENT_SIGNING "Semnare de documente"
+ IDS_IPSEC_IKE_INTERMEDIATE "Intermediar IKE de securitate IP"
+ IDS_FILE_RECOVERY "Recuperare de fișiere"
+ IDS_ROOT_LIST_SIGNER "Semnatarul listei rădăcină"
+ IDS_ANY_APPLICATION_POLICIES "Toate politicile de aplicație"
+ IDS_DS_EMAIL_REPLICATION "Replicarea serviciilor repertoar de e-mail"
+ IDS_ENROLLMENT_AGENT "Agent de cerere de certificate"
+ IDS_LIFETIME_SIGNING "Semnare pe toată durata vieții"
+ IDS_ANY_CERT_POLICY "Toate politicile de emitere"
+}
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_LOCALIZEDNAME_ROOT "Autorități de încredere de bază de certificare"
+ IDS_LOCALIZEDNAME_MY "Personale"
+ IDS_LOCALIZEDNAME_CA "Autorități intermediare de certificare"
+ IDS_LOCALIZEDNAME_ADDRESSBOOK "Alte persoane"
+ IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Editor de încredere"
+}
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_KEY_ID "KeyID="
+ IDS_CERT_ISSUER "Emitentul certificatului"
+ IDS_CERT_SERIAL_NUMBER "Numărul de serie al certificatului="
+ IDS_ALT_NAME_OTHER_NAME "Nume alternativ="
+ IDS_ALT_NAME_RFC822_NAME "Addresa de e-mail="
+ IDS_ALT_NAME_DNS_NAME "Nume de DNS="
+ IDS_ALT_NAME_DIRECTORY_NAME "Adresa de repertoar"
+ IDS_ALT_NAME_URL "URL="
+ IDS_ALT_NAME_IP_ADDRESS "Adresa IP="
+ IDS_ALT_NAME_MASK "Masca="
+ IDS_ALT_NAME_REGISTERED_ID "Identificator înregistrat="
+ IDS_USAGE_UNKNOWN "Folosire necunoscută a cheii"
+ IDS_SUBJECT_TYPE "Tipul subiectului="
+ IDS_SUBJECT_TYPE_CA "CA"
+ IDS_SUBJECT_TYPE_END_CERT "Entitate finală"
+ IDS_PATH_LENGTH "Constrângere de lungime a căii="
+ IDS_PATH_LENGTH_NONE "Fără"
+ IDS_INFO_NOT_AVAILABLE "Informație indisponibilă"
+ IDS_AIA "Acces la informațiile de autoritate"
+ IDS_ACCESS_METHOD "Metoda de acces="
+ IDS_ACCESS_METHOD_OCSP "OCSP"
+ IDS_ACCESS_METHOD_CA_ISSUERS "Emitenți CA"
+ IDS_ACCESS_METHOD_UNKNOWN "Metodă de acces necunoscută"
+ IDS_ACCESS_LOCATION "Nume alternativ"
+ IDS_CRL_DIST_POINT "Punct de distribuție CRL"
+ IDS_CRL_DIST_POINT_NAME "Numele punctului de distribuție"
+ IDS_CRL_DIST_POINT_FULL_NAME "Nume complet"
+ IDS_CRL_DIST_POINT_RDN_NAME "Nume RDN"
+ IDS_CRL_DIST_POINT_REASON "Motiv CRL="
+ IDS_CRL_DIST_POINT_ISSUER "Emitent CRL"
+ IDS_REASON_KEY_COMPROMISE "Cheia compromisă"
+ IDS_REASON_CA_COMPROMISE "CA compromisă"
+ IDS_REASON_AFFILIATION_CHANGED "Afiliere schimbată"
+ IDS_REASON_SUPERSEDED "Înlocuit"
+ IDS_REASON_CESSATION_OF_OPERATION "Încetarea operațiunilor"
+ IDS_REASON_CERTIFICATE_HOLD "Certificat reținut"
+ IDS_FINANCIAL_CRITERIA "Informația financiară="
+ IDS_FINANCIAL_CRITERIA_AVAILABLE "Disponibilă"
+ IDS_FINANCIAL_CRITERIA_NOT_AVAILABLE "Indisponibilă"
+ IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA "Îndeplinește criteriul="
+ IDS_YES "Da"
+ IDS_NO "Nu"
+ IDS_DIGITAL_SIGNATURE "Semnătură digitală"
+ IDS_NON_REPUDIATION "Non-repudiere"
+ IDS_KEY_ENCIPHERMENT "Cifrare cheie"
+ IDS_DATA_ENCIPHERMENT "Cifrare date"
+ IDS_KEY_AGREEMENT "Înțelegere la cheie"
+ IDS_CERT_SIGN "Semnare certificat"
+ IDS_OFFLINE_CRL_SIGN "Semnare CRL offline"
+ IDS_CRL_SIGN "Semnare CRL"
+ IDS_ENCIPHER_ONLY "Doar cifrează"
+ IDS_DECIPHER_ONLY "Doar descifrează"
+ IDS_NETSCAPE_SSL_CLIENT "Autentificare client SSL"
+ IDS_NETSCAPE_SSL_SERVER "Autentificare server SSL"
+ IDS_NETSCAPE_SMIME "S/MIME"
+ IDS_NETSCAPE_SIGN "Semnătură"
+ IDS_NETSCAPE_SSL_CA "SSL CA"
+ IDS_NETSCAPE_SMIME_CA "S/MIME CA"
+ IDS_NETSCAPE_SIGN_CA "Semnătură CA"
+}
diff --git a/reactos/dll/win32/crypt32/crypt32_Sv.rc b/reactos/dll/win32/crypt32/crypt32_Sv.rc
index a0e9df5a011..4a242fe10a6 100644
--- a/reactos/dll/win32/crypt32/crypt32_Sv.rc
+++ b/reactos/dll/win32/crypt32/crypt32_Sv.rc
@@ -17,6 +17,9 @@
* 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 "cryptres.h"
+
#pragma code_page(65001)
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
@@ -160,5 +163,3 @@ STRINGTABLE DISCARDABLE
IDS_FILE_RECOVERY "File Recovery"
IDS_ROOT_LIST_SIGNER "Root List Signer"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/crypt32/crypt32_private.h b/reactos/dll/win32/crypt32/crypt32_private.h
index 46d4797b680..07c63825b58 100644
--- a/reactos/dll/win32/crypt32/crypt32_private.h
+++ b/reactos/dll/win32/crypt32/crypt32_private.h
@@ -79,7 +79,7 @@ typedef struct _CRYPT_DIGESTED_DATA
CRYPT_HASH_BLOB hash;
} CRYPT_DIGESTED_DATA;
-BOOL CRYPT_AsnEncodePKCSDigestedData(CRYPT_DIGESTED_DATA *digestedData,
+BOOL CRYPT_AsnEncodePKCSDigestedData(const CRYPT_DIGESTED_DATA *digestedData,
void *pvData, DWORD *pcbData);
typedef struct _CRYPT_SIGNED_INFO
diff --git a/reactos/dll/win32/crypt32/cryptres.h b/reactos/dll/win32/crypt32/cryptres.h
index fe2fd91b580..f9845be25ab 100644
--- a/reactos/dll/win32/crypt32/cryptres.h
+++ b/reactos/dll/win32/crypt32/cryptres.h
@@ -18,6 +18,8 @@
#ifndef __WINE_CRYPTRES_H__
#define __WINE_CRYPTRES_H__
+#include
+
#define IDS_AUTHORITY_KEY_ID 1000
#define IDS_KEY_ATTRIBUTES 1001
#define IDS_KEY_USAGE_RESTRICTION 1002
diff --git a/reactos/dll/win32/crypt32/decode.c b/reactos/dll/win32/crypt32/decode.c
index 2c2b543e852..7a33e6afa5e 100644
--- a/reactos/dll/win32/crypt32/decode.c
+++ b/reactos/dll/win32/crypt32/decode.c
@@ -523,7 +523,7 @@ static BOOL CRYPT_AsnDecodeSequence(struct AsnDecodeSequenceItem items[],
for (i = 0; i < cItem; i++)
{
bytesNeeded += items[i].size;
- structSize += items[i].minSize;
+ structSize = max( structSize, items[i].offset + items[i].minSize );
}
if (pcbDecoded)
*pcbDecoded = 1 + lenBytes + cbDecoded;
diff --git a/reactos/dll/win32/crypt32/encode.c b/reactos/dll/win32/crypt32/encode.c
index 14d193fb3a6..258384c7318 100644
--- a/reactos/dll/win32/crypt32/encode.c
+++ b/reactos/dll/win32/crypt32/encode.c
@@ -564,13 +564,12 @@ static BOOL WINAPI CRYPT_AsnEncodeCRLEntries(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded)
{
- DWORD cCRLEntry = *(const DWORD *)pvStructInfo;
DWORD bytesNeeded, dataLen, lenBytes, i;
- const CRL_ENTRY *rgCRLEntry = *(const CRL_ENTRY *const *)
- ((const BYTE *)pvStructInfo + sizeof(DWORD));
+ const CRL_INFO *info = pvStructInfo;
+ const CRL_ENTRY *rgCRLEntry = info->rgCRLEntry;
BOOL ret = TRUE;
- for (i = 0, dataLen = 0; ret && i < cCRLEntry; i++)
+ for (i = 0, dataLen = 0; ret && i < info->cCRLEntry; i++)
{
DWORD size;
@@ -594,7 +593,7 @@ static BOOL WINAPI CRYPT_AsnEncodeCRLEntries(DWORD dwCertEncodingType,
*pbEncoded++ = ASN_SEQUENCEOF;
CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes);
pbEncoded += lenBytes;
- for (i = 0; i < cCRLEntry; i++)
+ for (i = 0; i < info->cCRLEntry; i++)
{
DWORD size = dataLen;
@@ -659,7 +658,7 @@ static BOOL WINAPI CRYPT_AsnEncodeCRLInfo(DWORD dwCertEncodingType,
}
if (info->cCRLEntry)
{
- items[cItem].pvStructInfo = &info->cCRLEntry;
+ items[cItem].pvStructInfo = info;
items[cItem].encodeFunc = CRYPT_AsnEncodeCRLEntries;
cItem++;
}
@@ -1078,7 +1077,7 @@ static BOOL WINAPI CRYPT_AsnEncodeNameValue(DWORD dwCertEncodingType,
}
static BOOL CRYPT_AsnEncodeRdnAttr(DWORD dwCertEncodingType,
- CERT_RDN_ATTR *attr, CryptEncodeObjectExFunc nameValueEncodeFunc,
+ const CERT_RDN_ATTR *attr, CryptEncodeObjectExFunc nameValueEncodeFunc,
BYTE *pbEncoded, DWORD *pcbEncoded)
{
DWORD bytesNeeded = 0, lenBytes, size;
@@ -1268,7 +1267,7 @@ static BOOL WINAPI CRYPT_DEREncodeItemsAsSet(DWORD dwCertEncodingType,
return ret;
}
-static BOOL CRYPT_AsnEncodeRdn(DWORD dwCertEncodingType, CERT_RDN *rdn,
+static BOOL CRYPT_AsnEncodeRdn(DWORD dwCertEncodingType, const CERT_RDN *rdn,
CryptEncodeObjectExFunc nameValueEncodeFunc, BYTE *pbEncoded,
DWORD *pcbEncoded)
{
@@ -1881,7 +1880,7 @@ static BOOL WINAPI CRYPT_AsnEncodePKCSContentInfoInternal(
cItem, dwFlags, pEncodePara, pbEncoded, pcbEncoded);
}
-BOOL CRYPT_AsnEncodePKCSDigestedData(CRYPT_DIGESTED_DATA *digestedData,
+BOOL CRYPT_AsnEncodePKCSDigestedData(const CRYPT_DIGESTED_DATA *digestedData,
void *pvData, DWORD *pcbData)
{
struct AsnEncodeSequenceItem items[] = {
diff --git a/reactos/dll/win32/crypt32/msg.c b/reactos/dll/win32/crypt32/msg.c
index a16eef12cf8..0b4027d17b0 100644
--- a/reactos/dll/win32/crypt32/msg.c
+++ b/reactos/dll/win32/crypt32/msg.c
@@ -1340,7 +1340,7 @@ static BOOL CSignedEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData,
}
static HCRYPTMSG CSignedEncodeMsg_Open(DWORD dwFlags,
- const void *pvMsgEncodeInfo, LPSTR pszInnerContentObjID,
+ const void *pvMsgEncodeInfo, LPCSTR pszInnerContentObjID,
PCMSG_STREAM_INFO pStreamInfo)
{
const CMSG_SIGNED_ENCODE_INFO_WITH_CMS *info = pvMsgEncodeInfo;
@@ -1553,7 +1553,7 @@ static BOOL CDecodeMsg_CopyData(CRYPT_DATA_BLOB *blob, const BYTE *pbData,
return ret;
}
-static BOOL CDecodeMsg_DecodeDataContent(CDecodeMsg *msg, CRYPT_DER_BLOB *blob)
+static BOOL CDecodeMsg_DecodeDataContent(CDecodeMsg *msg, const CRYPT_DER_BLOB *blob)
{
BOOL ret;
CRYPT_DATA_BLOB *data;
@@ -1613,7 +1613,7 @@ static inline void CRYPT_FixUpAlgorithmID(CRYPT_ALGORITHM_IDENTIFIER *id)
}
static BOOL CDecodeMsg_DecodeHashedContent(CDecodeMsg *msg,
- CRYPT_DER_BLOB *blob)
+ const CRYPT_DER_BLOB *blob)
{
BOOL ret;
CRYPT_DIGESTED_DATA *digestedData;
diff --git a/reactos/dll/win32/crypt32/object.c b/reactos/dll/win32/crypt32/object.c
index e880f089090..f505b7d804d 100644
--- a/reactos/dll/win32/crypt32/object.c
+++ b/reactos/dll/win32/crypt32/object.c
@@ -1080,7 +1080,7 @@ static BOOL WINAPI CRYPT_FormatBasicConstraints2(DWORD dwCertEncodingType,
return ret;
}
-static BOOL CRYPT_FormatHexStringWithPrefix(CRYPT_DATA_BLOB *blob, int id,
+static BOOL CRYPT_FormatHexStringWithPrefix(const CRYPT_DATA_BLOB *blob, int id,
LPWSTR str, DWORD *pcbStr)
{
WCHAR buf[MAX_STRING_RESOURCE_LEN];
@@ -1114,13 +1114,13 @@ static BOOL CRYPT_FormatHexStringWithPrefix(CRYPT_DATA_BLOB *blob, int id,
return ret;
}
-static BOOL CRYPT_FormatKeyId(CRYPT_DATA_BLOB *keyId, LPWSTR str,
+static BOOL CRYPT_FormatKeyId(const CRYPT_DATA_BLOB *keyId, LPWSTR str,
DWORD *pcbStr)
{
return CRYPT_FormatHexStringWithPrefix(keyId, IDS_KEY_ID, str, pcbStr);
}
-static BOOL CRYPT_FormatCertSerialNumber(CRYPT_DATA_BLOB *serialNum, LPWSTR str,
+static BOOL CRYPT_FormatCertSerialNumber(const CRYPT_DATA_BLOB *serialNum, LPWSTR str,
DWORD *pcbStr)
{
return CRYPT_FormatHexStringWithPrefix(serialNum, IDS_CERT_SERIAL_NUMBER,
diff --git a/reactos/dll/win32/crypt32/oid.c b/reactos/dll/win32/crypt32/oid.c
index 927481ff256..f0ea8ea8767 100644
--- a/reactos/dll/win32/crypt32/oid.c
+++ b/reactos/dll/win32/crypt32/oid.c
@@ -664,6 +664,16 @@ error_close_key:
return TRUE;
}
+/***********************************************************************
+ * CryptRegisterOIDInfo (CRYPT32.@)
+ */
+BOOL WINAPI CryptRegisterOIDInfo(PCCRYPT_OID_INFO pInfo, DWORD dwFlags)
+{
+ FIXME("(%p, %x): stub\n", pInfo, dwFlags );
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
/***********************************************************************
* CryptUnregisterOIDFunction (CRYPT32.@)
*/
diff --git a/reactos/dll/win32/crypt32/str.c b/reactos/dll/win32/crypt32/str.c
index d3bca2b7c0a..c0b76779a0a 100644
--- a/reactos/dll/win32/crypt32/str.c
+++ b/reactos/dll/win32/crypt32/str.c
@@ -341,7 +341,7 @@ static DWORD CRYPT_AddPrefixW(LPCWSTR prefix, LPWSTR psz, DWORD csz)
static const WCHAR indent[] = { ' ',' ',' ',' ',' ',0 };
DWORD cert_name_to_str_with_indent(DWORD dwCertEncodingType, DWORD indentLevel,
- PCERT_NAME_BLOB pName, DWORD dwStrType, LPWSTR psz, DWORD csz)
+ const CERT_NAME_BLOB *pName, DWORD dwStrType, LPWSTR psz, DWORD csz)
{
static const DWORD unsupportedFlags = CERT_NAME_STR_NO_QUOTING_FLAG |
CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG;
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg.rbuild b/reactos/dll/win32/cryptdlg/cryptdlg.rbuild
index cc86691a7fd..6a56a7a294e 100644
--- a/reactos/dll/win32/cryptdlg/cryptdlg.rbuild
+++ b/reactos/dll/win32/cryptdlg/cryptdlg.rbuild
@@ -15,5 +15,11 @@
wintrust
ntdll
main.c
- cryptdlg.rc
+ cryptdlg_De.rc
+ cryptdlg_En.rc
+ cryptdlg_Fr.rc
+ cryptdlg_Ko.rc
+ cryptdlg_Lt.rc
+ cryptdlg_Nl.rc
+ cryptdlg_Ro.rc
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_De.rc b/reactos/dll/win32/cryptdlg/cryptdlg_De.rc
new file mode 100644
index 00000000000..d3181ef51b0
--- /dev/null
+++ b/reactos/dll/win32/cryptdlg/cryptdlg_De.rc
@@ -0,0 +1,38 @@
+/*
+ * cryptdlg dll resources
+ *
+ * Copyright 2009 André Hentschel
+ *
+ * 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 "cryptres.h"
+
+LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_CERT_POLICY "Zertifikatsrichtlinie"
+ IDS_POLICY_ID "Richtlinien Qualifizierung: "
+ IDS_POLICY_QUALIFIER_INFO "Richtlinien Qualifizierungs Information"
+ IDS_POLICY_QUALIFIER_ID "Richtlinien Qualifizierungs-ID="
+ IDS_CPS "CPS"
+ IDS_USER_NOTICE "Benutzerbenachrichtigung"
+ IDS_QUALIFIER "Qualifizierung"
+ IDS_NOTICE_REF "Benachrichtigungsbezug"
+ IDS_ORGANIZATION "Organisation="
+ IDS_NOTICE_NUM "Benachrichtigungsnummer="
+ IDS_NOTICE_TEXT "Benachrichtigungstext="
+}
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_En.rc b/reactos/dll/win32/cryptdlg/cryptdlg_En.rc
index 99126c42898..3ab5f94cbbd 100644
--- a/reactos/dll/win32/cryptdlg/cryptdlg_En.rc
+++ b/reactos/dll/win32/cryptdlg/cryptdlg_En.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptres.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_Fr.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Fr.rc
index 23de9ebd572..f71be3ae0fd 100644
--- a/reactos/dll/win32/cryptdlg/cryptdlg_Fr.rc
+++ b/reactos/dll/win32/cryptdlg/cryptdlg_Fr.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptres.h"
+
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_Ko.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Ko.rc
index 3778a57b71d..548a74d7939 100644
--- a/reactos/dll/win32/cryptdlg/cryptdlg_Ko.rc
+++ b/reactos/dll/win32/cryptdlg/cryptdlg_Ko.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptres.h"
+
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_Lt.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Lt.rc
new file mode 100644
index 00000000000..a9674946ba5
--- /dev/null
+++ b/reactos/dll/win32/cryptdlg/cryptdlg_Lt.rc
@@ -0,0 +1,41 @@
+/*
+ * cryptdlg dll Lithuanian resources
+ *
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * 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 "cryptres.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_CERT_POLICY "Liudijimo politika"
+ IDS_POLICY_ID "Politikos identifikatorius: "
+ IDS_POLICY_QUALIFIER_INFO "Politikos kvalifikatoriaus informacija"
+ IDS_POLICY_QUALIFIER_ID "Politikos kvalifikatoriaus identifikatorius="
+ IDS_CPS "CPS"
+ IDS_USER_NOTICE "Naudotojo pranešimas"
+ IDS_QUALIFIER "Kvalifikatorius"
+ IDS_NOTICE_REF "Pranešimo nuoroda"
+ IDS_ORGANIZATION "Organizacija="
+ IDS_NOTICE_NUM "Pranešimo numeris="
+ IDS_NOTICE_TEXT "Pranešimo tekstas="
+}
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_Nl.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Nl.rc
index 27b09357eb0..3e8aca0d11a 100644
--- a/reactos/dll/win32/cryptdlg/cryptdlg_Nl.rc
+++ b/reactos/dll/win32/cryptdlg/cryptdlg_Nl.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptres.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_Ro.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Ro.rc
new file mode 100644
index 00000000000..17b60e0ef5c
--- /dev/null
+++ b/reactos/dll/win32/cryptdlg/cryptdlg_Ro.rc
@@ -0,0 +1,41 @@
+/*
+ * cryptdlg dll Romanian resources
+ *
+ * Copyright 2009 Paul Chitescu
+ *
+ * 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 "cryptres.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_CERT_POLICY "Politica certificatului"
+ IDS_POLICY_ID "Identificatorul politicii: "
+ IDS_POLICY_QUALIFIER_INFO "Informația calificatorului politicii"
+ IDS_POLICY_QUALIFIER_ID "Identificatorul calificatorului politicii="
+ IDS_CPS "CPS"
+ IDS_USER_NOTICE "Notiță utilizator"
+ IDS_QUALIFIER "Calificator"
+ IDS_NOTICE_REF "Referința notiței"
+ IDS_ORGANIZATION "Organizația="
+ IDS_NOTICE_NUM "Numărul notiței="
+ IDS_NOTICE_TEXT "Textul notiței="
+}
diff --git a/reactos/dll/win32/cryptdlg/cryptres.h b/reactos/dll/win32/cryptdlg/cryptres.h
index b64459aca78..4d3c2d2ffb3 100644
--- a/reactos/dll/win32/cryptdlg/cryptres.h
+++ b/reactos/dll/win32/cryptdlg/cryptres.h
@@ -18,6 +18,8 @@
#ifndef __CRYPTRES_H__
#define __CRYPTRES_H__
+#include
+
#define IDS_CERT_POLICY 100
#define IDS_POLICY_ID 101
#define IDS_POLICY_QUALIFIER_INFO 102
diff --git a/reactos/dll/win32/cryptui/cryptui.rbuild b/reactos/dll/win32/cryptui/cryptui.rbuild
index 932bffe383c..b8cffc0a9a1 100644
--- a/reactos/dll/win32/cryptui/cryptui.rbuild
+++ b/reactos/dll/win32/cryptui/cryptui.rbuild
@@ -9,6 +9,11 @@
main.c
cryptui.rc
+ cryptui_De.rc
+ cryptui_En.rc
+ cryptui_Fr.rc
+ cryptui_Ko.rc
+ cryptui_Nl.rc
wine
kernel32
user32
diff --git a/reactos/dll/win32/cryptui/cryptui.rc b/reactos/dll/win32/cryptui/cryptui.rc
index 4b170e3f4bf..00d490273ef 100644
--- a/reactos/dll/win32/cryptui/cryptui.rc
+++ b/reactos/dll/win32/cryptui/cryptui.rc
@@ -17,11 +17,6 @@
* 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 "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "commctrl.h"
-#include "dlgs.h"
#include "cryptuires.h"
@@ -45,7 +40,3 @@ IDB_CERT_WATERMARK BITMAP LOADONCALL DISCARDABLE certwatermark.bmp
/* @makedep: certheader.bmp */
IDB_CERT_HEADER BITMAP LOADONCALL DISCARDABLE certheader.bmp
-
-#include "cryptui_En.rc"
-#include "cryptui_Ko.rc"
-#include "cryptui_Nl.rc"
diff --git a/reactos/dll/win32/cryptui/cryptui_De.rc b/reactos/dll/win32/cryptui/cryptui_De.rc
new file mode 100644
index 00000000000..d34d88332cc
--- /dev/null
+++ b/reactos/dll/win32/cryptui/cryptui_De.rc
@@ -0,0 +1,465 @@
+/*
+ * cryptui dll resources
+ *
+ * Copyright 2009 André Hentschel
+ *
+ * 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 "cryptuires.h"
+
+#pragma code_page(65001)
+
+LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_CERTIFICATE "Zertifikat"
+ IDS_CERTIFICATEINFORMATION "Zertifikatsinformationen"
+ IDS_CERT_INFO_BAD_SIG "Das Zertifikat hat einen ungültige Signatur. Das Zertifikat wurde eventuell manipuliert."
+ IDS_CERT_INFO_UNTRUSTED_CA "Dieses Stammzertifikat ist nicht vertrauenswürdig. Installieren Sie das Zertifikat zu den vertrauenswürdigen Stammzertifikatsstellen, um die Vertrauensstellung zu aktivieren."
+ IDS_CERT_INFO_UNTRUSTED_ROOT "Das Zertifikat hat kein gültiges Stammzertifikat."
+ IDS_CERT_INFO_PARTIAL_CHAIN "Der Zertifikats-Aussteller konnte nicht gefunden werden."
+ IDS_CERT_INFO_BAD_PURPOSES "Die geplanten Zwecke des Zertifikats konnten nicht verifiziert werden."
+ IDS_CERT_INFO_PURPOSES "Dieses Zertifikat dient folgenden Zwecken:"
+ IDS_SUBJECT_HEADING "Ausgestellt für: "
+ IDS_ISSUER_HEADING "Ausgestellt von: "
+ IDS_VALID_FROM "Gültig ab "
+ IDS_VALID_TO " bis "
+ IDS_CERTIFICATE_BAD_SIGNATURE "Das Zertifikat hat einen ungültige Signatur."
+ IDS_CERTIFICATE_BAD_TIME "Dieses Zertifikat ist entweder abgelaufen oder noch nicht gültig."
+ IDS_CERTIFICATE_BAD_TIMENEST "Das Zertifikat überschreitet die Gültigkeit des Ausstellers."
+ IDS_CERTIFICATE_REVOKED "Das Zertifikat wurde vom Aussteller zurückgezogen."
+ IDS_CERTIFICATE_VALID "Dieses Zertifikat ist gültig."
+ IDS_FIELD "Feld"
+ IDS_VALUE "Wert"
+ IDS_FIELDS_ALL ""
+ IDS_FIELDS_V1 "Nur Version-1-Felder"
+ IDS_FIELDS_EXTENSIONS "Nur Erweiterungen"
+ IDS_FIELDS_CRITICAL_EXTENSIONS "Nur kritische Erweiterungen"
+ IDS_FIELDS_PROPERTIES "Nur Eigenschaften"
+ IDS_FIELD_VERSION "Version"
+ IDS_FIELD_SERIAL_NUMBER "Seriennummer"
+ IDS_FIELD_ISSUER "Aussteller"
+ IDS_FIELD_VALID_FROM "Gültig ab"
+ IDS_FIELD_VALID_TO "Gültig bis"
+ IDS_FIELD_SUBJECT "Antragsteller"
+ IDS_FIELD_PUBLIC_KEY "Öffentlicher Schlüssel"
+ IDS_FIELD_PUBLIC_KEY_FORMAT "%s (%d Bits)"
+ IDS_PROP_HASH "SHA1 Hash"
+ IDS_PROP_ENHKEY_USAGE "Erweiterte Schlüsselnutzung (Eigenschaft)"
+ IDS_PROP_FRIENDLY_NAME "Angezeigter Name"
+ IDS_PROP_DESCRIPTION "Beschreibung"
+ IDS_CERTIFICATE_PROPERTIES "Zertifikatseigenschaften"
+ IDS_CERTIFICATE_PURPOSE_ERROR "Bitte geben Sie die OID im Format 1.2.3.4 an"
+ IDS_CERTIFICATE_PURPOSE_EXISTS "Die eingegebene OID existiert bereits."
+ IDS_SELECT_STORE_TITLE "Zertifikatsspeicher wählen"
+ IDS_SELECT_STORE "Bitte wählen Sie einen Zertifikatsspeicher."
+ IDS_IMPORT_WIZARD "Importassistent für die Zertifikatsverwaltung"
+ IDS_IMPORT_TYPE_MISMATCH "Die Datei enthält Objekte, die nicht den Kriterien entsprechen. Bitte wählen Sie eine andere Datei."
+ IDS_IMPORT_FILE_TITLE "Zu importierende Datei"
+ IDS_IMPORT_FILE_SUBTITLE "Geben Sie die zu importierende Datei an."
+ IDS_IMPORT_STORE_TITLE "Zertifikatsspeicher wählen"
+ IDS_IMPORT_STORE_SUBTITLE "Zertifikatsspeicher sind Systemspeicher für Zertifikate."
+ IDS_IMPORT_FILTER_CERT "X.509 Zertifikat (*.cer; *.crt)"
+ IDS_IMPORT_FILTER_PFX "Privater Informationsaustausch (*.pfx; *.p12)"
+ IDS_IMPORT_FILTER_CRL "Zertifikatssperrliste (*.crl)"
+ IDS_IMPORT_FILTER_CTL "Zertifikatsvertrauensliste (*.stl)"
+ IDS_IMPORT_FILTER_SERIALIZED_STORE "Microsoft Speicher serieller Zertifikate (*.sst)"
+ IDS_IMPORT_FILTER_CMS "CMS/PKCS #7 Zertifikate (*.spc; *.p7b)"
+ IDS_IMPORT_FILTER_ALL "Alle Dateien (*.*)"
+ IDS_IMPORT_EMPTY_FILE "Bitte wählen Sie eine Datei."
+ IDS_IMPORT_BAD_FORMAT "Unbekanntes Format. Wählen Sie eine andere Datei."
+ IDS_IMPORT_OPEN_FAILED "Konnte die Datei nicht öffnen: "
+ IDS_IMPORT_DEST_DETERMINED "Automatisch ausgewählt"
+ IDS_IMPORT_SELECT_STORE "Bitte wählen Sie einen Speicher"
+ IDS_IMPORT_STORE_SELECTION "Zertifikatsspeicher gewählt"
+ IDS_IMPORT_DEST_AUTOMATIC "Automatisch ausgewählt"
+ IDS_IMPORT_FILE "Datei"
+ IDS_IMPORT_CONTENT "Inhalt"
+ IDS_IMPORT_CONTENT_CERT "Zertifikat"
+ IDS_IMPORT_CONTENT_CRL "Zertifikatssperrliste"
+ IDS_IMPORT_CONTENT_CTL "Zertifikatsvertrauensliste"
+ IDS_IMPORT_CONTENT_CMS "CMS/PKCS #7 Zertifikat"
+ IDS_IMPORT_CONTENT_PFX "Privater Informationsaustausch"
+ IDS_IMPORT_CONTENT_STORE "Zertifikatsspeicher"
+ IDS_IMPORT_SUCCEEDED "Importvorgang erfolgreich."
+ IDS_IMPORT_FAILED "Importvorgang gescheitert."
+ IDS_WIZARD_TITLE_FONT "Arial"
+ IDS_PURPOSE_ALL ""
+ IDS_PURPOSE_ADVANCED ""
+ IDS_SUBJECT_COLUMN "Ausgestellt für"
+ IDS_ISSUER_COLUMN "Ausgestellt von"
+ IDS_EXPIRATION_COLUMN "Verfallsdatum"
+ IDS_FRIENDLY_NAME_COLUMN "Angezeigter Name"
+ IDS_ALLOWED_PURPOSE_ALL ""
+ IDS_ALLOWED_PURPOSE_NONE ""
+ IDS_WARN_REMOVE_MY "Sie sind danach nicht länger fähig Nachrichten mit diesem Zertifikat zu entschlüsseln oder zu unterzeichnen.\nSind Sie sicher, dass Sie es löschen möchten?"
+ IDS_WARN_REMOVE_PLURAL_MY "Sie sind danach nicht länger fähig Nachrichten mit diesen Zertifikaten zu entschlüsseln oder zu unterzeichnen.\nSind Sie sicher, dass Sie sie löschen möchten?"
+ IDS_WARN_REMOVE_ADDRESSBOOK "Sie sind danach nicht länger fähig Nachrichten mit diesem Zertifikat zu entschlüsseln oder zu unterzeichnen.\nSind Sie sicher, dass Sie es löschen möchten?"
+ IDS_WARN_REMOVE_PLURAL_ADDRESSBOOK "Sie sind danach nicht länger fähig Nachrichten mit diesen Zertifikaten zu entschlüsseln oder zu unterzeichnen.\nSind Sie sicher, dass Sie sie löschen möchten?"
+ IDS_WARN_REMOVE_CA "Von dieser CA ausgestellte Zertifikate werden nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie es löschen möchten?"
+ IDS_WARN_REMOVE_PLURAL_CA "Von diesen CAs ausgestellte Zertifikate werden nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie sie löschen möchten?"
+ IDS_WARN_REMOVE_ROOT "Von dieser Stamm-CA ausgestellte Zertifikate werden nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie es löschen möchten?"
+ IDS_WARN_REMOVE_PLURAL_ROOT "Von diesen Stamm-CAs ausgestellte Zertifikate werden nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie sie löschen möchten?"
+ IDS_WARN_REMOVE_TRUSTEDPUBLISHER "Software die von diesem Hersteller signiert ist wird nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie ihn löschen möchten?"
+ IDS_WARN_REMOVE_PLURAL_TRUSTEDPUBLISHER "Software die von diesen Herstellern signiert ist wird nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie sie löschen möchten?"
+ IDS_WARN_REMOVE_DEFAULT "Sind Sie sicher, dass Sie dieses Zertifikat entfernen möchten?"
+ IDS_WARN_REMOVE_PLURAL_DEFAULT "Sind Sie sicher, dass Sie diese Zertifikate entfernen möchten?"
+ IDS_CERT_MGR "Zertifikate"
+ IDS_PURPOSE_SERVER_AUTH "Garantiert die Identität eines entfernten Computers"
+ IDS_PURPOSE_CLIENT_AUTH "Beweist Ihre Identität für einen entfernten Computers"
+ IDS_PURPOSE_CODE_SIGNING "Schützt Software vor Manipulation nach der Veröffentlichung"
+ IDS_PURPOSE_EMAIL_PROTECTION "Sichert E-Mail Nachrichten"
+ IDS_PURPOSE_IPSEC "Erlaubt sichere Kommunikation über das Internet"
+ IDS_PURPOSE_TIMESTAMP_SIGNING "Erlaubt Daten mit der aktuellen Zeit zu signieren"
+ IDS_PURPOSE_CTL_USAGE_SIGNING "Erlaubt Ihnen eine Zertifikatsvertrauensliste zu signieren"
+ IDS_PURPOSE_EFS "Erlaubt es lokale Daten zu verschlüsseln"
+ IDS_PURPOSE_EFS_RECOVERY "Datenwiederherstellung"
+ IDS_PURPOSE_WHQL "Windows Hardware Treiber Verifizierung"
+ IDS_PURPOSE_NT5 "Windows System Komponenten Verifizierung"
+ IDS_PURPOSE_OEM_WHQL "OEM Windows System Komponenten Verifizierung"
+ IDS_PURPOSE_EMBEDDED_NT "Embedded Windows System Komponenten Verifizierung"
+ IDS_PURPOSE_ROOT_LIST_SIGNER "Stammlisten Signierer"
+ IDS_PURPOSE_QUALIFIED_SUBORDINATION "Qualifizierte Unterordnung"
+ IDS_PURPOSE_KEY_RECOVERY "Schlüsselwiederherstellung"
+ IDS_PURPOSE_DOCUMENT_SIGNING "Dokument signieren"
+ IDS_PURPOSE_LIFETIME_SIGNING "Lebensdauer signieren"
+ IDS_PURPOSE_DRM "Digitale Rechte"
+ IDS_PURPOSE_LICENSES "Lizenzschlüssel"
+ IDS_PURPOSE_LICENSE_SERVER "Lizenz Server Verifizierung"
+ IDS_PURPOSE_ENROLLMENT_AGENT "Zertifikatsanfrage"
+ IDS_PURPOSE_SMARTCARD_LOGON "Smart Card Anmeldung"
+ IDS_PURPOSE_CA_EXCHANGE "Private Schlüsselarchive"
+ IDS_PURPOSE_KEY_RECOVERY_AGENT "Schlüsselwiederherstellung"
+ IDS_PURPOSE_DS_EMAIL_REPLICATION "Verzeichnissdienst E-Mail-Replikation"
+ IDS_EXPORT_WIZARD "Exportassistent für die Zertifikatsverwaltung"
+ IDS_EXPORT_FORMAT_TITLE "Export Format"
+ IDS_EXPORT_FORMAT_SUBTITLE "Wählen Sie ein Dateiformat."
+ IDS_EXPORT_FILE_TITLE "Export Dateiname"
+ IDS_EXPORT_FILE_SUBTITLE "Geben Sie die Datei an, in die Sie exportieren möchten."
+ IDS_EXPORT_FILE_EXISTS "Die angegebene Datei existiert bereits. Möchten Sie sie ersetzen?"
+ IDS_EXPORT_FILTER_CERT "DER-codiertes binäres X.509 (*.cer)"
+ IDS_EXPORT_FILTER_BASE64_CERT "Base64-codiertes X.509 (*.cer)"
+ IDS_EXPORT_FILTER_CRL "Zertifikatssperrliste (*.crl)"
+ IDS_EXPORT_FILTER_CTL "Zertifikatsvertrauensliste (*.stl)"
+ IDS_EXPORT_FILTER_CMS "CMS/PKCS #7 Zertifikate (*.p7b)"
+ IDS_EXPORT_FILTER_PFX "Privater Informationsaustausch (*.pfx)"
+ IDS_EXPORT_FILTER_SERIALIZED_CERT_STORE "Zertifikatsspeicher (*.sst)"
+ IDS_EXPORT_FORMAT "Dateiformat"
+ IDS_EXPORT_INCLUDE_CHAIN "Alle Zertifikate im Zertifizierungspfad einbeziehen"
+ IDS_EXPORT_KEYS "Schlüssel exportieren"
+ IDS_YES "Ja"
+ IDS_NO "Nein"
+ IDS_EXPORT_SUCCEEDED "Exportvorgang erfolgreich."
+ IDS_EXPORT_FAILED "Exportvorgang gescheitert."
+ IDS_EXPORT_PRIVATE_KEY_TITLE "Privaten Schlüssel exportieren"
+ IDS_EXPORT_PRIVATE_KEY_SUBTITLE "Das Zertifikat enthält einen privaten Schlüssel der eventuell mit dem Zertifikat exportiert wird."
+ IDS_EXPORT_PASSWORD_TITLE "Passwort eingeben"
+ IDS_EXPORT_PASSWORD_SUBTITLE "Der private Schlüssel sollte Passwortgeschützt sein."
+ IDS_EXPORT_PASSWORD_MISMATCH "Die Passwörter sind unterschiedlich."
+ IDS_EXPORT_PRIVATE_KEY_UNAVAILABLE "Hinweis: Der private Schlüssel des Zertifikats konnte nicht geöffnet werden."
+ IDS_EXPORT_PRIVATE_KEY_NON_EXPORTABLE "Hinweis: Der private Schlüssel des Zertifikats kann nicht exportiert werden."
+}
+
+IDD_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Allgemein"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "", -1, "Static", WS_BORDER|SS_WHITERECT, 6,10,241,200
+ CONTROL "", IDC_CERTIFICATE_ICON,"RichEdit20W",
+ ES_READONLY|WS_DISABLED,8,11,26,26
+ CONTROL "", IDC_CERTIFICATE_INFO,"RichEdit20W",
+ ES_READONLY|WS_DISABLED,34,11,212,26
+ CONTROL "", -1, "Static", SS_BLACKFRAME, 16,37,222,1
+ CONTROL "", IDC_CERTIFICATE_STATUS,"RichEdit20W",
+ ES_READONLY|ES_MULTILINE,8,38,238,78
+ CONTROL "", -1, "Static", SS_BLACKFRAME, 16,116,222,1
+ CONTROL "", IDC_CERTIFICATE_NAMES,"RichEdit20W",
+ ES_READONLY|ES_MULTILINE|WS_DISABLED,8,118,238,90
+ PUSHBUTTON "&Zertifikat installieren...", IDC_ADDTOSTORE,93,216,80,14
+ PUSHBUTTON "Au&sstellererklärung", IDC_ISSUERSTATEMENT,177,216,70,14
+END
+
+IDD_DETAIL DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Details"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Anzeigen:", -1, 6,12,40,14
+ COMBOBOX IDC_DETAIL_SELECT, 43,10,100,14,
+ CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP
+ CONTROL "", IDC_DETAIL_LIST, "SysListView32",
+ LVS_REPORT|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 6,28,241,100
+ CONTROL "", IDC_DETAIL_VALUE, "RichEdit20W",
+ ES_READONLY|ES_MULTILINE|WS_TABSTOP, 6,136,241,70
+ PUSHBUTTON "&Eigenschaften bearbeiten...", IDC_EDITPROPERTIES,75,216,98,14
+ PUSHBUTTON "In &Datei kopieren...", IDC_EXPORT,177,216,70,14
+END
+
+IDD_HIERARCHY DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Zertifizierungspfad"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "&Zertifizierungspfad", -1,6,10,245,165, BS_GROUPBOX
+ CONTROL "",IDC_CERTPATH, "SysTreeView32", TVS_HASLINES|WS_BORDER,
+ 13,22,231,130
+ PUSHBUTTON "&Zertifikat anzeigen", IDC_VIEWCERTIFICATE,175,156,70,14
+ LTEXT "Zertifizierungs&status:", IDC_CERTIFICATESTATUS,6,183,70,14
+ CONTROL "", IDC_CERTIFICATESTATUSTEXT,"RichEdit20W",
+ WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,195,245,36
+END
+
+IDD_USERNOTICE DIALOG DISCARDABLE 0, 0, 255, 256
+CAPTION "Haftungsausschluss"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "", IDC_USERNOTICE,"RichEdit20W",
+ WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,10,241,200
+ PUSHBUTTON "Schließen", IDOK,95,216,70,14
+ PUSHBUTTON "weitere &Informationen", IDC_CPS,171,216,76,14
+END
+
+IDD_CERT_PROPERTIES_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Allgemein"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Name:", -1, 6,14,60,14
+ EDITTEXT IDC_FRIENDLY_NAME, 60,12,191,14, ES_AUTOHSCROLL|WS_TABSTOP
+ LTEXT "&Beschreibung:", -1, 6,32,60,14
+ EDITTEXT IDC_DESCRIPTION, 60,30,191,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL
+ GROUPBOX "Zertifikatszwecke", -1,6,48,245,165, BS_GROUPBOX
+ AUTORADIOBUTTON "&Alle Zwecke für dieses Zertifikat aktivieren",
+ IDC_ENABLE_ALL_PURPOSES, 12,58,180,14, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "A&lle Zwecke für dieses Zertifikat deaktivieren",
+ IDC_DISABLE_ALL_PURPOSES, 12,70,180,14, BS_AUTORADIOBUTTON
+ AUTORADIOBUTTON "Nur &folgende Zwecke aktivieren:",
+ IDC_ENABLE_SELECTED_PURPOSES, 12,82,180,14, BS_AUTORADIOBUTTON
+ CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 24,100,220,90
+ PUSHBUTTON "&Zweck hinzufügen...", IDC_ADD_PURPOSE,173,194,71,14
+END
+
+IDD_ADD_CERT_PURPOSE DIALOG DISCARDABLE 0,0,200,68
+CAPTION "Zweck hinzufügen"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Geben Sie die Objekt-ID (OID) für den Zertifikatszweck an, den Sie hinzufügen möchten:",
+ -1, 6,6,190,28
+ EDITTEXT IDC_NEW_PURPOSE, 6,28,190,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL
+ PUSHBUTTON "OK", IDOK, 33,48,60,14
+ PUSHBUTTON "Abbrechen", IDCANCEL, 100,48,60,14
+END
+
+IDD_SELECT_STORE DIALOG DISCARDABLE 0,0,200,136
+CAPTION "Zertifikatsspeicher wählen"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Zertifikatsspeicher wählen den Sie benutzen möchten:", IDC_STORE_TEXT, 6,6,190,28
+ CONTROL "",IDC_STORE_LIST, "SysTreeView32", TVS_HASLINES|WS_BORDER|WS_TABSTOP,
+ 6,28,188,70
+ CHECKBOX "&Physikalischen Speicher anzeigen", IDC_SHOW_PHYSICAL_STORES, 6,102,90,14,
+ BS_AUTOCHECKBOX|WS_TABSTOP
+ PUSHBUTTON "OK", IDOK, 90,118,50,14, BS_DEFPUSHBUTTON
+ PUSHBUTTON "Abbrechen", IDCANCEL, 144,118,50,14
+END
+
+IDD_IMPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Importassistent für die Zertifikatsverwaltung"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Willkommen", IDC_IMPORT_TITLE,
+ 115,1,195,40
+ LTEXT "Dieser Assistent hilft ihnen Zertifikate, Zertifikatssperrlisten und Zertifikatsvertrauenslisten aus einer Datei zu importieren.",
+ -1, 115,33,195,24
+ LTEXT "Ein Zertifikat dient zur Identifikation von Ihnen oder ihrem Computer. Es kann auch für die Authentifizierung und zum Unterzeichnen genutzt werden. Zertifikatsspeicher sind Sammlungen von Zertifikaten, Zertifikatssperrlisten und Zertifikatsvertrauenslisten.",
+ -1, 115,64,195,40
+ LTEXT "Klicken Sie Weiter um fortzufahren.",
+ -1, 115,111,195,8
+END
+
+IDD_IMPORT_FILE DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Importassistent für die Zertifikatsverwaltung"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Dateiname:", -1, 21,1,195,10
+ EDITTEXT IDC_IMPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+ PUSHBUTTON "D&urchsuchen...", IDC_IMPORT_BROWSE_FILE, 236,11,60,14
+ LTEXT "Hinweis: Es können mehrere Zertifikate in einer Datei folgender Formate gespeichert werden:",
+ -1, 21,26,265,16
+ LTEXT "Syntaxstandard kryptografischer Meldungen /PKCS #7 Messages (.p7b)",
+ -1, 31,49,265,10
+ LTEXT "Privater Informationsaustausch/PKCS #12 (.pfx, .p12)",
+ -1, 31,64,265,10
+ LTEXT "Microsoft Speicher serieller Zertifikate (.sst)",
+ -1, 31,79,265,10
+END
+
+IDD_IMPORT_STORE DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Importassistent für die Zertifikatsverwaltung"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Wine kann automatisch einen Zertifikatsspeicher wählen, oder Sie wählen einen aus.",
+ -1, 21,1,195,20
+ AUTORADIOBUTTON "A&utomatisch einen Zertifikatsspeicher wählen",
+ IDC_IMPORT_AUTO_STORE, 31,18,180,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "&Alle Zertifikate im folgendem Zertifikatsspeicher speichern:",
+ IDC_IMPORT_SPECIFY_STORE, 31,30,180,12, BS_AUTORADIOBUTTON
+ EDITTEXT IDC_IMPORT_STORE, 44,49,185,14, ES_READONLY
+ PUSHBUTTON "&Durchsuchen...", IDC_IMPORT_BROWSE_STORE, 236,49,60,14
+END
+
+IDD_IMPORT_FINISH DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Importassistent für die Zertifikatsverwaltung"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Fertigstellen des Assistenten", IDC_IMPORT_TITLE,
+ 115,1,195,40
+ LTEXT "Importvorgang ordnungsgemäß abgeschlossen.",
+ -1, 115,33,195,24
+ LTEXT "Sie haben folgende Einstellungen gewählt:",
+ -1, 115,57,195,12
+ CONTROL "", IDC_IMPORT_SETTINGS, "SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 115,67,174,100
+END
+
+IDD_CERT_MGR DIALOG DISCARDABLE 0,0,335,270
+CAPTION "Zertifikatsverwaltung"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Geplanter Zweck:", -1, 7,9,100,12
+ COMBOBOX IDC_MGR_PURPOSE_SELECTION, 83,7,245,14,
+ CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP
+ CONTROL "", IDC_MGR_STORES, "SysTabControl32",
+ WS_CLIPSIBLINGS|WS_TABSTOP, 7,25,321,140
+ CONTROL "", IDC_MGR_CERTS, "SysListView32",
+ LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, 15,46,305,111
+ PUSHBUTTON "&Importieren...", IDC_MGR_IMPORT, 7,172,51,14
+ PUSHBUTTON "&Exportieren...", IDC_MGR_EXPORT, 62,172,51,14, WS_DISABLED
+ PUSHBUTTON "&Entfernen", IDC_MGR_REMOVE, 117,172,51,14, WS_DISABLED
+ PUSHBUTTON "&Erweitert...", IDC_MGR_ADVANCED, 277,172,51,14
+ GROUPBOX "Beabsichtigte Zwecke des Zertifikates", -1,7,194,321,47, BS_GROUPBOX
+ LTEXT "", IDC_MGR_PURPOSES, 13,208,252,30
+ PUSHBUTTON "&Anzeigen...", IDC_MGR_VIEW, 269,218,51,14, WS_DISABLED
+ PUSHBUTTON "&Schließen", IDCANCEL, 277,249,51,14, BS_DEFPUSHBUTTON
+END
+
+IDD_CERT_MGR_ADVANCED DIALOG DISCARDABLE 0,0,248,176
+CAPTION "Erweiterte Optionen"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Zertifikatszweck", -1, 7,7,234,141, BS_GROUPBOX
+ LTEXT "Wählen Sie mindestens einen Zweck, der als Erweitert aufgeführt werden soll.",
+ -1, 14,18,220,16
+ LTEXT "&Zertifikatszwecke:", -1, 14,41,90,12, WS_TABSTOP
+ CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 14,51,220,90
+ PUSHBUTTON "OK", IDOK, 132,155,51,14, BS_DEFPUSHBUTTON
+ PUSHBUTTON "Abbrechen", IDCANCEL, 190,155,51,14
+END
+
+IDD_EXPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Exportassistent für die Zertifikatsverwaltung"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Willkommen", IDC_EXPORT_TITLE,
+ 115,1,195,40
+ LTEXT "Dieser Assistent hilft ihnen Zertifikate, Zertifikatssperrlisten und Zertifikatsvertrauenslisten in eine Datei zu exportieren.",
+ -1, 115,33,195,16
+ LTEXT "Ein Zertifikat dient zur Identifikation von Ihnen oder ihrem Computer. Es kann auch für die Authentifizierung und zum Unterzeichnen genutzt werden. Zertifikatsspeicher sind Sammlungen von Zertifikaten, Zertifikatssperrlisten und Zertifikatsvertrauenslisten.",
+ -1, 115,56,195,40
+ LTEXT "Klicken Sie Weiter um fortzufahren.",
+ -1, 115,103,195,8
+END
+
+IDD_EXPORT_PRIVATE_KEY DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Exportassistent für die Zertifikatsverwaltung"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Wenn Sie sich entscheiden den privaten Schlüssel zu exportieren, werden Sie später nach einem Passwort gefragt.", -1, 21,1,195,23
+ LTEXT "Privaten Schlüssel exportieren?", -1, 21,24,195,15
+ AUTORADIOBUTTON "&Ja, privaten Schlüssel exportieren",
+ IDC_EXPORT_PRIVATE_KEY_YES, 31,36,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "&Nein, privaten Schlüssel nicht exportieren",
+ IDC_EXPORT_PRIVATE_KEY_NO, 31,48,200,12, BS_AUTORADIOBUTTON
+ LTEXT "", IDC_EXPORT_PRIVATE_KEY_UNAVAILABLE, 21,60,200,24
+END
+
+IDD_EXPORT_PASSWORD DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Exportassistent für die Zertifikatsverwaltung"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Passwort:", -1, 21,1,195,10
+ EDITTEXT IDC_EXPORT_PASSWORD, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+ LTEXT "Passwort &bestätigen:", -1, 21,35,195,10
+ EDITTEXT IDC_EXPORT_PASSWORD_CONFIRM, 21,45,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+END
+
+IDD_EXPORT_FORMAT DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Exportassistent für die Zertifikatsverwaltung"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Wählen Sie das gewünschte Format:", -1, 21,1,195,10
+ AUTORADIOBUTTON "&DER-codiertes X.509 (.cer)",
+ IDC_EXPORT_FORMAT_DER, 31,18,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "B&ase64-codiertes X.509 (.cer):",
+ IDC_EXPORT_FORMAT_BASE64, 31,30,200,12, BS_AUTORADIOBUTTON
+ AUTORADIOBUTTON "&Syntaxstandard kryptografischer Meldungen/PKCS #7 Zertifikate (.p7b)",
+ IDC_EXPORT_FORMAT_CMS, 31,42,250,12, BS_AUTORADIOBUTTON
+ CHECKBOX "&Wenn möglich alle Zertifikate im Zertifizierungspfad einbeziehen",
+ IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,250,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ AUTORADIOBUTTON "&Privater Informationsaustausch/PKCS #12 (.pfx)",
+ IDC_EXPORT_FORMAT_PFX, 31,72,250,12, BS_AUTORADIOBUTTON|WS_DISABLED
+ CHECKBOX "W&enn möglich alle Zertifikate im Zertifizierungspfad einbeziehen",
+ IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,250,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ CHECKBOX "&Verstärkte Sicherheit aktivieren",
+ IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,200,8,
+ BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ CHECKBOX "Priva&ten Schlüssel löschen wenn der Export erfolgreich war",
+ IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,250,8,
+ BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+END
+
+IDD_EXPORT_FILE DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Exportassistent für die Zertifikatsverwaltung"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Dateiname:", -1, 21,1,195,10
+ EDITTEXT IDC_EXPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+ PUSHBUTTON "&Durchsuchen...", IDC_EXPORT_BROWSE_FILE, 236,11,60,14
+END
+
+IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Exportassistent für die Zertifikatsverwaltung"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Fertigstellen des Assistenten", IDC_EXPORT_TITLE,
+ 115,1,195,40
+ LTEXT "Exportvorgang ordnungsgemäß abgeschlossen.",
+ -1, 115,33,195,24
+ LTEXT "Sie haben folgende Einstellungen gewählt:",
+ -1, 115,57,195,12
+ CONTROL "", IDC_EXPORT_SETTINGS, "SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 115,67,174,100
+END
diff --git a/reactos/dll/win32/cryptui/cryptui_En.rc b/reactos/dll/win32/cryptui/cryptui_En.rc
index b10e1015522..1335f0ebe3b 100644
--- a/reactos/dll/win32/cryptui/cryptui_En.rc
+++ b/reactos/dll/win32/cryptui/cryptui_En.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptuires.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/cryptui/cryptui_Fr.rc b/reactos/dll/win32/cryptui/cryptui_Fr.rc
new file mode 100644
index 00000000000..22fceda0cda
--- /dev/null
+++ b/reactos/dll/win32/cryptui/cryptui_Fr.rc
@@ -0,0 +1,466 @@
+/*
+ * cryptui dll French resources
+ *
+ * Copyright 2009 Frédéric Delanoy
+ *
+ * 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 "cryptuires.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_CERTIFICATE "Certificat"
+ IDS_CERTIFICATEINFORMATION "Informations sur le certificat"
+ IDS_CERT_INFO_BAD_SIG "Ce certificat a une signature invalide. Le certificat peut avoir été modifié ou corrompu."
+ IDS_CERT_INFO_UNTRUSTED_CA "Ce certificat racine n'est pas approuvé. Pour lui faire confiance, ajoutez-le au magasin de certificats racine de confiance de votre système."
+ IDS_CERT_INFO_UNTRUSTED_ROOT "Ce certificat n'a pu être validé par un certificat racine de confiance."
+ IDS_CERT_INFO_PARTIAL_CHAIN "L'émetteur de ce certificat n'a pas été trouvé."
+ IDS_CERT_INFO_BAD_PURPOSES "Impossible de vérifier tous les rôles prévus pour ce certificat."
+ IDS_CERT_INFO_PURPOSES "Ce certificat n'est prévu que pour les rôles suivants :"
+ IDS_SUBJECT_HEADING "Émis pour : "
+ IDS_ISSUER_HEADING "Émis par : "
+ IDS_VALID_FROM "Valide à partir du "
+ IDS_VALID_TO " jusqu'au "
+ IDS_CERTIFICATE_BAD_SIGNATURE "Ce certificat a une signature invalide."
+ IDS_CERTIFICATE_BAD_TIME "Ce certificat a expiré ou n'est pas encore valable."
+ IDS_CERTIFICATE_BAD_TIMENEST "La période de validité de ce certificat dépasse celle de son émetteur."
+ IDS_CERTIFICATE_REVOKED "Ce certificat a été révoqué par son émetteur."
+ IDS_CERTIFICATE_VALID "Ce certificat est valide."
+ IDS_FIELD "Champ"
+ IDS_VALUE "Valeur"
+ IDS_FIELDS_ALL ""
+ IDS_FIELDS_V1 "Champs de version 1 uniquement"
+ IDS_FIELDS_EXTENSIONS "Extensions uniquement"
+ IDS_FIELDS_CRITICAL_EXTENSIONS "Extensions critiques uniquement"
+ IDS_FIELDS_PROPERTIES "Propriétés uniquement"
+ IDS_FIELD_VERSION "Version"
+ IDS_FIELD_SERIAL_NUMBER "Numéro de série"
+ IDS_FIELD_ISSUER "Émetteur"
+ IDS_FIELD_VALID_FROM "Valide à partir du"
+ IDS_FIELD_VALID_TO "Valide jusqu'au"
+ IDS_FIELD_SUBJECT "Sujet"
+ IDS_FIELD_PUBLIC_KEY "Clé publique"
+ IDS_FIELD_PUBLIC_KEY_FORMAT "%s (%d bits)"
+ IDS_PROP_HASH "Empreinte SHA1"
+ IDS_PROP_ENHKEY_USAGE "Utilisation complémentaire de la clé (propriété)"
+ IDS_PROP_FRIENDLY_NAME "Nom convivial"
+ IDS_PROP_DESCRIPTION "Description"
+ IDS_CERTIFICATE_PROPERTIES "Propriétés du certificat"
+ IDS_CERTIFICATE_PURPOSE_ERROR "Veuillez entrer l'OID sous la forme 1.2.3.4"
+ IDS_CERTIFICATE_PURPOSE_EXISTS "L'OID que vous avez entré existe déjà."
+ IDS_SELECT_STORE_TITLE "Sélectionnez le magasin de certificats"
+ IDS_SELECT_STORE "Veuillez sélectionner un magasin de certificats."
+ IDS_IMPORT_WIZARD "Assistant d'importation de certificats"
+ IDS_IMPORT_TYPE_MISMATCH "Le fichier contient des objets ne satisfaisant pas aux critères spécifiés. Veuillez sélectionner un autre fichier."
+ IDS_IMPORT_FILE_TITLE "Fichier à importer"
+ IDS_IMPORT_FILE_SUBTITLE "Spécifiez le fichier à importer."
+ IDS_IMPORT_STORE_TITLE "Magasin de certificats"
+ IDS_IMPORT_STORE_SUBTITLE "Les magasins de certificats sont des collections de certificats, de listes de révocation de certificats et de listes de certificats de confiance."
+ IDS_IMPORT_FILTER_CERT "Certificat X.509 (*.cer; *.crt)"
+ IDS_IMPORT_FILTER_PFX "Échange d'informations personnelles (*.pfx; *.p12)"
+ IDS_IMPORT_FILTER_CRL "Liste de révocation de certificats (*.crl)"
+ IDS_IMPORT_FILTER_CTL "Liste de certificats de confiance (*.stl)"
+ IDS_IMPORT_FILTER_SERIALIZED_STORE "Magasin de certificats sérialisés Microsoft (*.sst)"
+ IDS_IMPORT_FILTER_CMS "Messages CMS/PKCS #7 (*.spc; *.p7b)"
+ IDS_IMPORT_FILTER_ALL "Tous les fichiers (*.*)"
+ IDS_IMPORT_EMPTY_FILE "Sélectionnez un fichier."
+ IDS_IMPORT_BAD_FORMAT "Le format du fichier n'est pas reconnu. Sélectionnez un autre fichier."
+ IDS_IMPORT_OPEN_FAILED "N'a pu ouvrir "
+ IDS_IMPORT_DEST_DETERMINED "Déterminé par le programme"
+ IDS_IMPORT_SELECT_STORE "Veuillez sélectionner un magasin"
+ IDS_IMPORT_STORE_SELECTION "Magasin de certificats sélectionné"
+ IDS_IMPORT_DEST_AUTOMATIC "Déterminé automatiquement par le programme"
+ IDS_IMPORT_FILE "Fichier"
+ IDS_IMPORT_CONTENT "Contenu"
+ IDS_IMPORT_CONTENT_CERT "Certificat"
+ IDS_IMPORT_CONTENT_CRL "Liste de révocation de certificats"
+ IDS_IMPORT_CONTENT_CTL "Liste de certificats de confiance"
+ IDS_IMPORT_CONTENT_CMS "Message CMS/PKCS #7"
+ IDS_IMPORT_CONTENT_PFX "Échange d'informations personnelles"
+ IDS_IMPORT_CONTENT_STORE "Magasin de certificats"
+ IDS_IMPORT_SUCCEEDED "L'importation a réussi."
+ IDS_IMPORT_FAILED "L'importation a échoué."
+ IDS_WIZARD_TITLE_FONT "Arial"
+ IDS_PURPOSE_ALL ""
+ IDS_PURPOSE_ADVANCED ""
+ IDS_SUBJECT_COLUMN "Émis pour"
+ IDS_ISSUER_COLUMN "Émis par"
+ IDS_EXPIRATION_COLUMN "Date d'expiration"
+ IDS_FRIENDLY_NAME_COLUMN "Nom convivial"
+ IDS_ALLOWED_PURPOSE_ALL ""
+ IDS_ALLOWED_PURPOSE_NONE ""
+ IDS_WARN_REMOVE_MY "Vous ne pourrez plus déchiffrer ou signer de messages avec ce certificat.\nVoulez-vous réellement supprimer ce certificat ?"
+ IDS_WARN_REMOVE_PLURAL_MY "Vous ne pourrez plus déchiffrer ou signer de messages avec ces certificats.\nVoulez-vous réellement supprimer ces certificats ?"
+ IDS_WARN_REMOVE_ADDRESSBOOK "Vous ne pourrez plus chiffrer ou vérifier de signature de messages avec ce certificat.\nVoulez-vous réellement supprimer ce certificat ?"
+ IDS_WARN_REMOVE_PLURAL_ADDRESSBOOK "Vous ne pourrez plus chiffrer ou vérifier de signature de messages avec ces certificats.\nVoulez-vous réellement supprimer ces certificats ?"
+ IDS_WARN_REMOVE_CA "Les certificats émis par cette autorité de certification ne seront plus considérés comme valables.\nVoulez-vous réellement supprimer ce certificat ?"
+ IDS_WARN_REMOVE_PLURAL_CA "Les certificats émis par cette autorité de certification ne seront plus considérés comme valables.\nVoulez-vous réellement supprimer ces certificats ?"
+ IDS_WARN_REMOVE_ROOT "Les certificats émis par cette autorité de certification racine, ou par toute autorité de certification qu'elle valide, ne seront plus considérés comme valables.\nVoulez-vous réellement supprimer ce certificat racine de confiance ?"
+ IDS_WARN_REMOVE_PLURAL_ROOT "Les certificats émis par ces autorités de certification racines, ou par toute autorité de certification qu'elles valident, ne seront plus considérés comme valables.\nVoulez-vous réellement supprimer ces certificats racines de confiance ?"
+ IDS_WARN_REMOVE_TRUSTEDPUBLISHER "Les logiciels signés par cet éditeur ne seront plus considérés comme valables.\nVoulez-vous réellement supprimer ce certificat ?"
+ IDS_WARN_REMOVE_PLURAL_TRUSTEDPUBLISHER "Les logiciels signés par ces éditeurs ne seront plus considérés comme valables.\nVoulez-vous réellement supprimer ces certificats ?"
+ IDS_WARN_REMOVE_DEFAULT "Voulez-vous réellement supprimer ce certificat ?"
+ IDS_WARN_REMOVE_PLURAL_DEFAULT "Voulez-vous réellement supprimer ces certificats ?"
+ IDS_CERT_MGR "Certificats"
+ IDS_PURPOSE_SERVER_AUTH "Prouve l'identité d'un ordinateur distant"
+ IDS_PURPOSE_CLIENT_AUTH "Prouve votre identité à un ordinateur distant"
+ IDS_PURPOSE_CODE_SIGNING "Garantit que des logiciels proviennent bien d'un éditeur de logiciels donné\nProtège le logiciel contre toute altération après publication"
+ IDS_PURPOSE_EMAIL_PROTECTION "Protège les courriers électroniques"
+ IDS_PURPOSE_IPSEC "Permet des communications sécurisées sur Internet"
+ IDS_PURPOSE_TIMESTAMP_SIGNING "Permet de signer des données avec l'heure courante"
+ IDS_PURPOSE_CTL_USAGE_SIGNING "Permet de signer numériquement une liste de certificats de confiance"
+ IDS_PURPOSE_EFS "Permet le chiffrement de données sur disque"
+ IDS_PURPOSE_EFS_RECOVERY "Restauration de fichier"
+ IDS_PURPOSE_WHQL "Vérification des pilotes matériels de Windows"
+ IDS_PURPOSE_NT5 "Vérification des composants système de Windows"
+ IDS_PURPOSE_OEM_WHQL "Vérification des composants système de Windows OEM"
+ IDS_PURPOSE_EMBEDDED_NT "Vérification des composants système de Windows embarqué"
+ IDS_PURPOSE_ROOT_LIST_SIGNER "Signataire de la liste racine"
+ IDS_PURPOSE_QUALIFIED_SUBORDINATION "Subordination conditionnelle"
+ IDS_PURPOSE_KEY_RECOVERY "Recouvrement de clé"
+ IDS_PURPOSE_DOCUMENT_SIGNING "Signature de documents"
+ IDS_PURPOSE_LIFETIME_SIGNING "Signature à vie"
+ IDS_PURPOSE_DRM "Droits numériques"
+ IDS_PURPOSE_LICENSES "Licences de jeux de clés"
+ IDS_PURPOSE_LICENSE_SERVER "Vérification du serveur de licences"
+ IDS_PURPOSE_ENROLLMENT_AGENT "Agent de demande de certificat"
+ IDS_PURPOSE_SMARTCARD_LOGON "Connexion avec carte à puce"
+ IDS_PURPOSE_CA_EXCHANGE "Archivage de clé privée"
+ IDS_PURPOSE_KEY_RECOVERY_AGENT "Agent de recouvrement de clé"
+ IDS_PURPOSE_DS_EMAIL_REPLICATION "Réplication de courriers électroniques du service d'annuaire"
+ IDS_EXPORT_WIZARD "Assistant Exportation de certificat"
+ IDS_EXPORT_FORMAT_TITLE "Format d'export"
+ IDS_EXPORT_FORMAT_SUBTITLE "Choisissez le format dans lequel le contenu sera sauvé."
+ IDS_EXPORT_FILE_TITLE "Nom du fichier à exporter"
+ IDS_EXPORT_FILE_SUBTITLE "Choisissez le nom du fichier dans lequel le contenu sera sauvé."
+ IDS_EXPORT_FILE_EXISTS "Le fichier spécifié existe déjà. Voulez-vous le remplacer ?"
+ IDS_EXPORT_FILTER_CERT "Binaire codé DER X.509 (*.cer)"
+ IDS_EXPORT_FILTER_BASE64_CERT "Binaire codé Base64 X.509 (*.cer)"
+ IDS_EXPORT_FILTER_CRL "Liste de révocation de certificats (*.crl)"
+ IDS_EXPORT_FILTER_CTL "Liste de certificats de confiance (*.stl)"
+ IDS_EXPORT_FILTER_CMS "Messages CMS/PKCS #7 (*.p7b)"
+ IDS_EXPORT_FILTER_PFX "Échange d'informations personnelles (*.pfx)"
+ IDS_EXPORT_FILTER_SERIALIZED_CERT_STORE "Magasin de certificats sérialisés (*.sst)"
+ IDS_EXPORT_FORMAT "Format de fichier"
+ IDS_EXPORT_INCLUDE_CHAIN "Inclure tous les certificats dans le chemin de certification"
+ IDS_EXPORT_KEYS "Exporter des clés"
+ IDS_YES "Oui"
+ IDS_NO "Non"
+ IDS_EXPORT_SUCCEEDED "L'export a réussi."
+ IDS_EXPORT_FAILED "L'export a échoué."
+ IDS_EXPORT_PRIVATE_KEY_TITLE "Exporter la clé privée"
+ IDS_EXPORT_PRIVATE_KEY_SUBTITLE "Le certificat contient une clé privée qui peut être exportée avec le certificat."
+ IDS_EXPORT_PASSWORD_TITLE "Entrez le mot de passe"
+ IDS_EXPORT_PASSWORD_SUBTITLE "Vous pouvez protéger une clé privée par un mot de passe."
+ IDS_EXPORT_PASSWORD_MISMATCH "Les mots de passe ne correspondent pas."
+ IDS_EXPORT_PRIVATE_KEY_UNAVAILABLE "Note : la clé privée de ce certificat n'a pu être ouverte."
+ IDS_EXPORT_PRIVATE_KEY_NON_EXPORTABLE "Note : la clé privée de ce certificat n'est pas exportable."
+}
+
+IDD_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Général"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "", -1, "Static", WS_BORDER|SS_WHITERECT, 6,10,241,200
+ CONTROL "", IDC_CERTIFICATE_ICON,"RichEdit20W",
+ ES_READONLY|WS_DISABLED,8,11,26,26
+ CONTROL "", IDC_CERTIFICATE_INFO,"RichEdit20W",
+ ES_READONLY|WS_DISABLED,34,11,212,26
+ CONTROL "", -1, "Static", SS_BLACKFRAME, 16,37,222,1
+ CONTROL "", IDC_CERTIFICATE_STATUS,"RichEdit20W",
+ ES_READONLY|ES_MULTILINE,8,38,238,78
+ CONTROL "", -1, "Static", SS_BLACKFRAME, 16,116,222,1
+ CONTROL "", IDC_CERTIFICATE_NAMES,"RichEdit20W",
+ ES_READONLY|ES_MULTILINE|WS_DISABLED,8,118,238,90
+ PUSHBUTTON "&Installer un certificat...", IDC_ADDTOSTORE,103,216,70,14
+ PUSHBUTTON "&Déclaration de l'émetteur", IDC_ISSUERSTATEMENT,177,216,70,14
+END
+
+IDD_DETAIL DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Détails"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Afficher :", -1, 6,12,40,14
+ COMBOBOX IDC_DETAIL_SELECT, 28,10,100,14,
+ CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP
+ CONTROL "", IDC_DETAIL_LIST, "SysListView32",
+ LVS_REPORT|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 6,28,241,100
+ CONTROL "", IDC_DETAIL_VALUE, "RichEdit20W",
+ ES_READONLY|ES_MULTILINE|WS_TABSTOP, 6,136,241,70
+ PUSHBUTTON "É&diter les propriétés...", IDC_EDITPROPERTIES,103,216,70,14
+ PUSHBUTTON "&Copier dans le fichier...", IDC_EXPORT,177,216,70,14
+END
+
+IDD_HIERARCHY DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Chemin de certification"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Chemin de &certification", -1,6,10,245,165, BS_GROUPBOX
+ CONTROL "",IDC_CERTPATH, "SysTreeView32", TVS_HASLINES|WS_BORDER,
+ 13,22,231,130
+ PUSHBUTTON "&Voir le certificat", IDC_VIEWCERTIFICATE,175,156,70,14
+ LTEXT "É&tant du certificat :", IDC_CERTIFICATESTATUS,6,183,70,14
+ CONTROL "", IDC_CERTIFICATESTATUSTEXT,"RichEdit20W",
+ WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,195,245,36
+END
+
+IDD_USERNOTICE DIALOG DISCARDABLE 0, 0, 255, 256
+CAPTION "Avis de non-responsabilité"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "", IDC_USERNOTICE,"RichEdit20W",
+ WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,10,241,200
+ PUSHBUTTON "Fermer", IDOK,103,216,70,14
+ PUSHBUTTON "&Informations complémentaires", IDC_CPS,177,216,70,14
+END
+
+IDD_CERT_PROPERTIES_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Général"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Nom convivial :", -1, 6,14,60,14
+ EDITTEXT IDC_FRIENDLY_NAME, 60,12,191,14, ES_AUTOHSCROLL|WS_TABSTOP
+ LTEXT "&Description:", -1, 6,32,60,14
+ EDITTEXT IDC_DESCRIPTION, 60,30,191,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL
+ GROUPBOX "Rôles du certificat", -1,6,48,245,165, BS_GROUPBOX
+ AUTORADIOBUTTON "Activer &tous les rôles prévus pour ce certificat",
+ IDC_ENABLE_ALL_PURPOSES, 12,58,180,14, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "&Désactiver tous les rôles prévus pour ce certificat",
+ IDC_DISABLE_ALL_PURPOSES, 12,70,180,14, BS_AUTORADIOBUTTON
+ AUTORADIOBUTTON "N'activer &que les rôles suivants pour ce certificat :",
+ IDC_ENABLE_SELECTED_PURPOSES, 12,82,180,14, BS_AUTORADIOBUTTON
+ CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 24,100,220,90
+ PUSHBUTTON "&Ajouter un rôle...", IDC_ADD_PURPOSE,184,194,60,14
+END
+
+IDD_ADD_CERT_PURPOSE DIALOG DISCARDABLE 0,0,200,68
+CAPTION "Ajouter un rôle"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Adjoindre l'identifiant d'objet (OIS) au rôle de certificat à ajouter :",
+ -1, 6,6,190,28
+ EDITTEXT IDC_NEW_PURPOSE, 6,28,190,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL
+ PUSHBUTTON "OK", IDOK, 33,48,60,14
+ PUSHBUTTON "Annuler", IDCANCEL, 100,48,60,14
+END
+
+IDD_SELECT_STORE DIALOG DISCARDABLE 0,0,200,136
+CAPTION "Sélectionner un magasin de certificats"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Sélectionnez le magasin de certificats à utiliser :", IDC_STORE_TEXT, 6,6,190,28
+ CONTROL "",IDC_STORE_LIST, "SysTreeView32", TVS_HASLINES|WS_BORDER|WS_TABSTOP,
+ 6,28,188,70
+ CHECKBOX "&Montrer les magasins (emplacements de stockage) physiques", IDC_SHOW_PHYSICAL_STORES, 6,102,90,14,
+ BS_AUTOCHECKBOX|WS_TABSTOP
+ PUSHBUTTON "OK", IDOK, 90,118,50,14, BS_DEFPUSHBUTTON
+ PUSHBUTTON "Annuler", IDCANCEL, 144,118,50,14
+END
+
+IDD_IMPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistant d'importation de certificats"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Bienvenue dans l'assistant d'importation de certificats", IDC_IMPORT_TITLE,
+ 115,1,195,40
+ LTEXT "Cet assistant vous aide à importer des certificats, des listes de révocation de certificats et des listes de certificats de confiance dans un magasin de certificats à partir d'un fichier.",
+ -1, 115,33,195,16
+ LTEXT "Un certificat peut être utilisé pour vous identifier, ou pour identifier l'ordinateur avec lequel vous communiquez. Il peut également être utilisé à des fins d'authentification ou de signature de messages. Les magasins de certificats sont des collections de certificats, de listes de révocation de certificats et de listes de certificats de confiance.",
+ -1, 115,56,195,40
+ LTEXT "Pour continuer, cliquez Suivant.",
+ -1, 115,103,195,8
+END
+
+IDD_IMPORT_FILE DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistant Importation de certificats"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Nom du fichier :", -1, 21,1,195,10
+ EDITTEXT IDC_IMPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+ PUSHBUTTON "Parco&urir...", IDC_IMPORT_BROWSE_FILE, 236,11,60,14
+ LTEXT "Remarque : les formats de fichiers suivants peuvent contenir plus d'un certificat, liste de révocation de certificats ou liste de certificats de confiance :",
+ -1, 21,26,265,16
+ LTEXT "Standard de syntaxe de message cryptographique - Messages PKCS #7 (.p7b)",
+ -1, 31,49,265,10
+ LTEXT "Échange d'informations personnelles - PKCS #12 (.pfx, .p12)",
+ -1, 31,64,265,10
+ LTEXT "Magasin de certificats sérialisés Microsoft (.sst)",
+ -1, 31,79,265,10
+END
+
+IDD_IMPORT_STORE DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistant Importation de certificats"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Wine peut sélectionner automatiquement un magasin de certificats, ou vous pouvez spécifier l'emplacement des certificats.",
+ -1, 21,1,195,20
+ AUTORADIOBUTTON "Sélectionner &automatiquement un magasin de certificats",
+ IDC_IMPORT_AUTO_STORE, 31,18,180,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "Placer tous les certificats dans le &magasin suivant :",
+ IDC_IMPORT_SPECIFY_STORE, 31,30,180,12, BS_AUTORADIOBUTTON
+ EDITTEXT IDC_IMPORT_STORE, 44,49,185,14, ES_READONLY
+ PUSHBUTTON "&Parcourir...", IDC_IMPORT_BROWSE_STORE, 236,49,60,14
+END
+
+IDD_IMPORT_FINISH DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistant Importation de certificat"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Clôturer l'assistant d'importation de certificat", IDC_IMPORT_TITLE,
+ 115,1,195,40
+ LTEXT "Vous avez terminé avec succès l'assistant d'importation de certificat.",
+ -1, 115,33,195,24
+ LTEXT "Vous avez spécifié les paramètres suivants :",
+ -1, 115,57,195,12
+ CONTROL "", IDC_IMPORT_SETTINGS, "SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 115,67,174,100
+END
+
+IDD_CERT_MGR DIALOG DISCARDABLE 0,0,335,270
+CAPTION "Certificats"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Rôle prévu :", -1, 7,9,100,12
+ COMBOBOX IDC_MGR_PURPOSE_SELECTION, 83,7,245,14,
+ CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP
+ CONTROL "", IDC_MGR_STORES, "SysTabControl32",
+ WS_CLIPSIBLINGS|WS_TABSTOP, 7,25,321,140
+ CONTROL "", IDC_MGR_CERTS, "SysListView32",
+ LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, 15,46,305,111
+ PUSHBUTTON "&Importer...", IDC_MGR_IMPORT, 7,172,51,14
+ PUSHBUTTON "&Exporter...", IDC_MGR_EXPORT, 62,172,51,14, WS_DISABLED
+ PUSHBUTTON "&Supprimer", IDC_MGR_REMOVE, 117,172,51,14, WS_DISABLED
+ PUSHBUTTON "&Avancé...", IDC_MGR_ADVANCED, 277,172,51,14
+ GROUPBOX "Rôles prévus pour le certificat", -1,7,194,321,47, BS_GROUPBOX
+ LTEXT "", IDC_MGR_PURPOSES, 13,208,252,30
+ PUSHBUTTON "&Détails...", IDC_MGR_VIEW, 269,218,51,14, WS_DISABLED
+ PUSHBUTTON "&Fermer", IDCANCEL, 277,249,51,14, BS_DEFPUSHBUTTON
+END
+
+IDD_CERT_MGR_ADVANCED DIALOG DISCARDABLE 0,0,248,176
+CAPTION "Options avancées"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Rôle du certificat", -1, 7,7,234,141, BS_GROUPBOX
+ LTEXT "Sélectionnez un ou plusieurs rôles à lister quand les options avancées sont sélectionnées.",
+ -1, 14,18,220,16
+ LTEXT "&Rôles du certificat :", -1, 14,41,90,12, WS_TABSTOP
+ CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 14,51,220,90
+ PUSHBUTTON "OK", IDOK, 132,155,51,14, BS_DEFPUSHBUTTON
+ PUSHBUTTON "Annuler", IDCANCEL, 190,155,51,14
+END
+
+IDD_EXPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistant d'exportation de certificats"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Bienvenue dans l'assistant d'exportation de certificats", IDC_EXPORT_TITLE,
+ 115,1,195,40
+ LTEXT "Cet assistant vous aide à exporter des certificats, des listes de révocation de certificats et des listes de certificats de confiance dans un fichier à partir d'un magasin de certificats.",
+ -1, 115,33,195,16
+ LTEXT "Un certificat peut être utilisé pour vous identifier, ou pour identifier l'ordinateur avec lequel vous communiquez. Il peut également être utilisé à des fins d'authentification ou de signature de messages. Les magasins de certificats sont des collections de certificats, de listes de révocation de certificats et de listes de certificats de confiance.",
+ -1, 115,56,195,40
+ LTEXT "Pour continuer, cliquez Suivant.",
+ -1, 115,103,195,8
+END
+
+IDD_EXPORT_PRIVATE_KEY DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistant Exportation de certificat"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Si vous choisissez d'exporter la clé privée, on vous demandera un mot de passe pour protéger la clé privée dans une page ultérieure.", -1, 21,1,195,23
+ LTEXT "Voulez-vous exporter la clé privée ?", -1, 21,24,195,15
+ AUTORADIOBUTTON "&Oui, exporter la clé privée",
+ IDC_EXPORT_PRIVATE_KEY_YES, 31,36,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "&Non, ne pas exporter la clé privée",
+ IDC_EXPORT_PRIVATE_KEY_NO, 31,48,200,12, BS_AUTORADIOBUTTON
+ LTEXT "", IDC_EXPORT_PRIVATE_KEY_UNAVAILABLE, 21,60,200,24
+END
+
+IDD_EXPORT_PASSWORD DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistant Exportation de certificat"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Mot de passe :", -1, 21,1,195,10
+ EDITTEXT IDC_EXPORT_PASSWORD, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+ LTEXT "&Confirmez le mot de passe:", -1, 21,35,195,10
+ EDITTEXT IDC_EXPORT_PASSWORD_CONFIRM, 21,45,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+END
+
+IDD_EXPORT_FORMAT DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistant Exportation de certificat"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Sélectionnez le format à utiliser :", -1, 21,1,195,10
+ AUTORADIOBUTTON "Binaire codé &DER X.509 (*.cer)",
+ IDC_EXPORT_FORMAT_DER, 31,18,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "Binaire codé Ba&se64 X.509 (.cer):",
+ IDC_EXPORT_FORMAT_BASE64, 31,30,200,12, BS_AUTORADIOBUTTON
+ AUTORADIOBUTTON "Standard de syntaxe de message cryptographique - Messages PKCS #7 (.p7b)",
+ IDC_EXPORT_FORMAT_CMS, 31,42,200,12, BS_AUTORADIOBUTTON
+ CHECKBOX "&Inclure tous les certificats dans le chemin de certification si possible"
+ IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ AUTORADIOBUTTON "Échange d'informations &Personnelles - PKCS #12 (.pfx)",
+ IDC_EXPORT_FORMAT_PFX, 31,72,200,12, BS_AUTORADIOBUTTON|WS_DISABLED
+ CHECKBOX "Inclure &tous les certificats dans le chemin de certification si possible",
+ IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ CHECKBOX "&Activer le chiffrement fort",
+ IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,200,8,
+ BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ CHECKBOX "&Effacer la clé privée si l'export a réussi",
+ IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,200,8,
+ BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+END
+
+IDD_EXPORT_FILE DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistant Exportation de certificat"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Nom du fichier :", -1, 21,1,195,10
+ EDITTEXT IDC_EXPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+ PUSHBUTTON "Parco&urir...", IDC_EXPORT_BROWSE_FILE, 236,11,60,14
+END
+
+IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistant Exportation de certificat"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Clôturer l'assistant d'exportation de certificat", IDC_EXPORT_TITLE,
+ 115,1,195,40
+ LTEXT "Vous avez terminé avec succès l'assistant d'importation de certificat.",
+ -1, 115,33,195,24
+ LTEXT "Vous avez spécifié les paramètres suivants :",
+ -1, 115,57,195,12
+ CONTROL "", IDC_EXPORT_SETTINGS, "SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 115,67,174,100
+END
diff --git a/reactos/dll/win32/cryptui/cryptui_Ko.rc b/reactos/dll/win32/cryptui/cryptui_Ko.rc
index 57e91386bd8..6cbf6fee8b1 100644
--- a/reactos/dll/win32/cryptui/cryptui_Ko.rc
+++ b/reactos/dll/win32/cryptui/cryptui_Ko.rc
@@ -19,6 +19,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptuires.h"
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
diff --git a/reactos/dll/win32/cryptui/cryptui_Nl.rc b/reactos/dll/win32/cryptui/cryptui_Nl.rc
index d046d376b8a..a346083f29d 100644
--- a/reactos/dll/win32/cryptui/cryptui_Nl.rc
+++ b/reactos/dll/win32/cryptui/cryptui_Nl.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "cryptuires.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/cryptui/cryptuires.h b/reactos/dll/win32/cryptui/cryptuires.h
index b46ea4e128e..716dba5e3a6 100644
--- a/reactos/dll/win32/cryptui/cryptuires.h
+++ b/reactos/dll/win32/cryptui/cryptuires.h
@@ -18,6 +18,10 @@
#ifndef __CRYPTUIRES_H_
#define __CRYPTUIRES_H_
+#include
+#include
+#include
+
#define IDS_CERTIFICATE 1000
#define IDS_CERTIFICATEINFORMATION 1001
#define IDS_CERT_INFO_BAD_SIG 1002
diff --git a/reactos/dll/win32/cryptui/main.c b/reactos/dll/win32/cryptui/main.c
index f15420b4bca..c11868aa456 100644
--- a/reactos/dll/win32/cryptui/main.c
+++ b/reactos/dll/win32/cryptui/main.c
@@ -2146,7 +2146,7 @@ static CRYPT_OBJID_BLOB *find_policy_qualifier(CERT_POLICIES_INFO *policies,
return ret;
}
-static WCHAR *get_cps_str_from_qualifier(CRYPT_OBJID_BLOB *qualifier)
+static WCHAR *get_cps_str_from_qualifier(const CRYPT_OBJID_BLOB *qualifier)
{
LPWSTR qualifierStr = NULL;
CERT_NAME_VALUE *qualifierValue;
@@ -2167,7 +2167,7 @@ static WCHAR *get_cps_str_from_qualifier(CRYPT_OBJID_BLOB *qualifier)
return qualifierStr;
}
-static WCHAR *get_user_notice_from_qualifier(CRYPT_OBJID_BLOB *qualifier)
+static WCHAR *get_user_notice_from_qualifier(const CRYPT_OBJID_BLOB *qualifier)
{
LPWSTR str = NULL;
CERT_POLICY_QUALIFIER_USER_NOTICE *qualifierValue;
@@ -2773,7 +2773,7 @@ static void add_v1_fields(HWND hwnd, struct detail_data *data)
add_v1_field(hwnd, data, &v1_fields[i]);
}
-static WCHAR *crypt_format_extension(PCERT_EXTENSION ext, DWORD formatStrType)
+static WCHAR *crypt_format_extension(const CERT_EXTENSION *ext, DWORD formatStrType)
{
WCHAR *str = NULL;
DWORD size;
@@ -2788,7 +2788,7 @@ static WCHAR *crypt_format_extension(PCERT_EXTENSION ext, DWORD formatStrType)
return str;
}
-static WCHAR *field_format_extension_hex_with_ascii(PCERT_EXTENSION ext)
+static WCHAR *field_format_extension_hex_with_ascii(const CERT_EXTENSION *ext)
{
WCHAR *str = NULL;
@@ -3986,7 +3986,7 @@ static void show_cert_chain(HWND hwnd, struct hierarchy_data *data)
}
}
-static void set_certificate_status(HWND hwnd, CRYPT_PROVIDER_CERT *cert)
+static void set_certificate_status(HWND hwnd, const CRYPT_PROVIDER_CERT *cert)
{
/* Select all the text in the control, the next update will replace it */
SendMessageW(hwnd, EM_SETSEL, 0, -1);
@@ -5602,7 +5602,7 @@ static PCRYPT_KEY_PROV_INFO export_get_private_key_info(PCCERT_CONTEXT cert)
return info;
}
-static BOOL export_acquire_private_key(PCRYPT_KEY_PROV_INFO info,
+static BOOL export_acquire_private_key(const CRYPT_KEY_PROV_INFO *info,
HCRYPTPROV *phProv)
{
BOOL ret;
@@ -5733,7 +5733,7 @@ static BOOL export_info_has_private_key(PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo)
return ret;
}
-static void export_format_enable_controls(HWND hwnd, struct ExportWizData *data)
+static void export_format_enable_controls(HWND hwnd, const struct ExportWizData *data)
{
int defaultFormatID;
@@ -5874,7 +5874,7 @@ static LRESULT CALLBACK export_format_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
return ret;
}
-static void export_password_mismatch(HWND hwnd, struct ExportWizData *data)
+static void export_password_mismatch(HWND hwnd, const struct ExportWizData *data)
{
WCHAR title[MAX_STRING_LEN], error[MAX_STRING_LEN];
LPCWSTR pTitle;
@@ -5979,7 +5979,7 @@ static LRESULT CALLBACK export_password_dlg_proc(HWND hwnd, UINT msg,
return ret;
}
-static LPWSTR export_append_extension(struct ExportWizData *data,
+static LPWSTR export_append_extension(const struct ExportWizData *data,
LPWSTR fileName)
{
static const WCHAR cer[] = { '.','c','e','r',0 };
@@ -6305,7 +6305,7 @@ static LRESULT CALLBACK export_file_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
return ret;
}
-static void show_export_details(HWND lv, struct ExportWizData *data)
+static void show_export_details(HWND lv, const struct ExportWizData *data)
{
WCHAR text[MAX_STRING_LEN];
LVITEMW item;
@@ -6783,7 +6783,7 @@ static LRESULT CALLBACK export_finish_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
}
static BOOL show_export_ui(DWORD dwFlags, HWND hwndParent,
- LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, void *pvoid)
+ LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, const void *pvoid)
{
PROPSHEETHEADERW hdr;
PROPSHEETPAGEW pages[6];
diff --git a/reactos/dll/win32/devmgr/lang/ro-RO.rc b/reactos/dll/win32/devmgr/lang/ro-RO.rc
index 54521f6da34..d5bfb36e8d4 100644
--- a/reactos/dll/win32/devmgr/lang/ro-RO.rc
+++ b/reactos/dll/win32/devmgr/lang/ro-RO.rc
@@ -1,94 +1,96 @@
-// Romanian language resource file (Petru Dimitriu, 2009-24-05)
+// Romanian language resource file (Petru Dimitriu, 2009-07-15)
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
STRINGTABLE
BEGIN
IDS_NAME "Nume"
IDS_TYPE "Tip"
- IDS_MANUFACTURER "Productor: %1"
- IDS_LOCATION "Locaie: %1"
+ IDS_MANUFACTURER "Producător: %1"
+ IDS_LOCATION "Locație: %1"
IDS_STATUS "Stare dispozitiv: %1"
IDS_UNKNOWN "Necunoscut"
- IDS_LOCATIONSTR "Locaie %1!u! (%2)"
+ IDS_LOCATIONSTR "Locație %1!u! (%2)"
IDS_DEVCODE " (Cod %1!u!)"
IDS_DEVCODE2 " (Cod %2!u!)"
IDS_ENABLEDEVICE "Folosire dispozitiv (activare)"
IDS_DISABLEDEVICE "Nu folosi dispozitivul (dezactivare)"
IDS_UNKNOWNDEVICE "Dispozitiv necunoscut"
- IDS_NODRIVERLOADED "Nu exist drivere instalate pentru acest dispozitiv."
+ IDS_NODRIVERLOADED "Nu există drivere instalate pentru acest dispozitiv."
IDS_DEVONPARENT "pe %1"
IDS_TROUBLESHOOTDEV "&Depanare..."
IDS_ENABLEDEV "A&ctivare"
IDS_REINSTALLDRV "Re&instalare driver"
- IDS_PROPERTIES "P&roprieti"
+ IDS_PROPERTIES "P&roprietăți"
IDS_UPDATEDRV "A&ctualizare driver..."
IDS_REBOOT "Repornire &computer..."
IDS_NOTAVAILABLE "Indisponibil"
IDS_NOTDIGITALLYSIGNED "Nesemnat digital"
- IDS_NODRIVERS "Nu sunt necesare fiiere driver pentru acest dispozitiv sau nu a fost ncrcat niciunul."
+ IDS_NODRIVERS "Nu sunt necesare fișiere driver pentru acest dispozitiv sau nu a fost încărcat niciunul."
END
/* error messages, source: http://www.z123.org/techsupport/medm.htm */
STRINGTABLE
BEGIN
- IDS_DEV_NO_PROBLEM "Acest dispozitiv funcioneaz bine."
+ IDS_DEV_NO_PROBLEM "Acest dispozitiv funcționează bine."
IDS_DEV_NOT_CONFIGURED "Acest dispozitiv nu e configurat corect."
- IDS_DEV_DEVLOADER_FAILED "ReactOS nu a putut ncrca driverul deoarece computerul indic dou tipuri de magistrale $1."
- IDS_DEV_DEVLOADER_FAILED2 "ncrctorul sau ncrctoarele pentru dispozitivul $1 nu au putut ncrca driverul."
- IDS_DEV_OUT_OF_MEMORY "Este posibil ca driverul s fie stricat sau sistemul dumneavoastr ruleaz pe puin memorie."
- IDS_DEV_ENTRY_IS_WRONG_TYPE "Acest dispozitiv nu funcioneaz bine deoarece cel puin unul din driverele lui este stricat sau este avariat sistemul de registri."
- IDS_DEV_LACKED_ARBITRATOR "Driverul acestui dispozitiv solicit un tip de resurse cu care ReactOS nu tie s lucreze."
- IDS_DEV_BOOT_CONFIG_CONFLICT "Alt dispozitiv folosete deja resursele acestui dispozitiv."
+ IDS_DEV_DEVLOADER_FAILED "ReactOS nu a putut încărca driverul deoarece computerul indică două tipuri de magistrale $1."
+ IDS_DEV_DEVLOADER_FAILED2 "Încărcătorul sau încărcătoarele pentru dispozitivul $1 nu au putut încărca driverul."
+ IDS_DEV_OUT_OF_MEMORY "Este posibil ca driverul să fie stricat sau sistemul dumneavoastră rulează pe puțină memorie."
+ IDS_DEV_ENTRY_IS_WRONG_TYPE "Acest dispozitiv nu funcționează bine deoarece cel puțin unul din driverele lui este stricat sau este avariat sistemul de registri."
+ IDS_DEV_LACKED_ARBITRATOR "Driverul acestui dispozitiv solicită un tip de resurse cu care ReactOS nu știe să lucreze."
+ IDS_DEV_BOOT_CONFIG_CONFLICT "Alt dispozitiv folosește deja resursele acestui dispozitiv."
IDS_DEV_FAILED_FILTER "Driverele pentru acest dispozitiv trebuiesc reinstalate."
- IDS_DEV_DEVLOADER_NOT_FOUND "Acest dispozitiv nu funcioneaz bine deoarece ReactOS nu poate deschide fiierul $1 care ncarc driverul."
- IDS_DEV_DEVLOADER_NOT_FOUND2 "Acest dispozitiv nu funcioneaz bine deoare fiierul $1 care ncarc driverul este stricat."
- IDS_DEV_DEVLOADER_NOT_FOUND3 "Defeciune dispozitiv: ncercai s schimbai driverul. Dac asta nu rezolv problema, vedei documentaia driverului."
- IDS_DEV_INVALID_DATA "Acest dispozitiv nu funcioneaz bine deoarece sistemul BIOS al computerului raporteaz resursele dispozitivului greit."
- IDS_DEV_INVALID_DATA2 "Acest dispozitiv nu funcioneaz bine deoarece sistemul BIOS al dispozitivului raporteaz resursele dispozitivului greit. "
- IDS_DEV_FAILED_START "Acest dispozitiv fie nu e prezent, fie nu funcioneaz bine, fie nu are toate driverele instalate."
- IDS_DEV_LIAR "ReactOS s-a blocat cnd a ncercat s porneasc dispozitivul i astfel nu va mai ncerca s l porneasc din nou."
- IDS_DEV_NORMAL_CONFLICT "Acest dispozitiv nu are la dispoziie $1 resurse pentru folosiin."
- IDS_DEV_NOT_VERIFIED "Acest dispozitiv fie nu e prezent, fie nu funcioneaz bine, fie nu are toate driverele instalate."
- IDS_DEV_NEED_RESTART "Acest dispozitiv nu poate funciona ."
+ IDS_DEV_DEVLOADER_NOT_FOUND "Acest dispozitiv nu funcționează bine deoarece ReactOS nu poate deschide fișierul $1 care încarcă driverul."
+ IDS_DEV_DEVLOADER_NOT_FOUND2 "Acest dispozitiv nu funcționează bine deoare fișierul $1 care încarcă driverul este stricat."
+ IDS_DEV_DEVLOADER_NOT_FOUND3 "Defecțiune dispozitiv: Încercați să schimbați driverul. Dacă asta nu rezolvă problema, vedeți documentația driverului."
+ IDS_DEV_INVALID_DATA "Acest dispozitiv nu funcționează bine deoarece sistemul BIOS al computerului raportează resursele dispozitivului greșit."
+ IDS_DEV_INVALID_DATA2 "Acest dispozitiv nu funcționează bine deoarece sistemul BIOS al dispozitivului raportează resursele dispozitivului greșit. "
+ IDS_DEV_FAILED_START "Acest dispozitiv fie nu e prezent, fie nu funcționează bine, fie nu are toate driverele instalate."
+ IDS_DEV_LIAR "ReactOS s-a blocat când a încercat să pornească dispozitivul și astfel nu va mai încerca să îl pornească din nou."
+ IDS_DEV_NORMAL_CONFLICT "Acest dispozitiv nu are la dispoziție $1 resurse pentru folosiință."
+ IDS_DEV_NOT_VERIFIED "Acest dispozitiv fie nu e prezent, fie nu funcționează bine, fie nu are toate driverele instalate."
+ IDS_DEV_NEED_RESTART "Acest dispozitiv nu poate funcționa ."
IDS_DEV_REENUMERATION "Acest dispoztiv produce un conflict de resurse."
- IDS_DEV_PARTIAL_LOG_CONF "ReactOS nu a putut identifica toate resursele pe care acest dispozitiv le folosete."
- IDS_DEV_UNKNOWN_RESOURCE "Fiierul de informaii $1 spune acestui sub-dispozitiv s foloseasc o resurs pe care dispozitivul-printe nu o are sau nu o recunoate."
+ IDS_DEV_PARTIAL_LOG_CONF "ReactOS nu a putut identifica toate resursele pe care acest dispozitiv le folosește."
+ IDS_DEV_UNKNOWN_RESOURCE "Fișierul de informații $1 spune acestui sub-dispozitiv să folosească o resursă pe care dispozitivul-părinte nu o are sau nu o recunoaște."
IDS_DEV_REINSTALL "Driverele pentru acest dispozitiv trebuiesc reinstalate."
- IDS_DEV_REGISTRY "Se pare c registrii sunt avariai."
- IDS_DEV_WILL_BE_REMOVED "ReactOS elimin n acest moment dispozitivul."
- IDS_DEV_DISABLED "Acest dispozitiv nu e pornit nc."
+ IDS_DEV_REGISTRY "Se pare că registrii sunt avariați."
+ IDS_DEV_WILL_BE_REMOVED "ReactOS elimină în acest moment dispozitivul."
+ IDS_DEV_DISABLED "Acest dispozitiv nu e pornit încă."
IDS_DEV_DISABLED2 "Acest dispozitiv este dezactivat."
- IDS_DEV_DEVLOADER_NOT_READY "ncrctoarele pentru acest dispozitiv nu pot ncrca driverele necesare."
- IDS_DEV_DEVLOADER_NOT_READY2 "Acest adaptor pentru monitor funcioneaz bine."
- IDS_DEV_DEVLOADER_NOT_READY3 "ncrctoarele pentru acest dispozitiv nu pot ncrca driverele necesare."
- IDS_DEV_DEVICE_NOT_THERE "Acest dispozitiv fie nu e prezent, fie nu funcioneaz bine, fie nu are toate driverele instalate."
- IDS_DEV_MOVED "ReactOS instaleaz n acest moment acest dispozitiv."
- IDS_DEV_TOO_EARLY "ReactOS instaleaz n acest moment acest dispozitiv."
+ IDS_DEV_DEVLOADER_NOT_READY "Încărcătoarele pentru acest dispozitiv nu pot încărca driverele necesare."
+ IDS_DEV_DEVLOADER_NOT_READY2 "Acest adaptor pentru monitor funcționează bine."
+ IDS_DEV_DEVLOADER_NOT_READY3 "Încărcătoarele pentru acest dispozitiv nu pot încărca driverele necesare."
+ IDS_DEV_DEVICE_NOT_THERE "Acest dispozitiv fie nu e prezent, fie nu funcționează bine, fie nu are toate driverele instalate."
+ IDS_DEV_MOVED "ReactOS instalează în acest moment acest dispozitiv."
+ IDS_DEV_TOO_EARLY "ReactOS instalează în acest moment acest dispozitiv."
IDS_DEV_NO_VALID_LOG_CONF "ReactOS nu poate specifica resoursele pentru acest dispozitiv."
IDS_DEV_FAILED_INSTALL "Driverele pentru acest dispozitiv nu sunt instalate."
- IDS_DEV_HARDWARE_DISABLED "Acest dispozitiv este dezactivat deoarece sistemul BIOS al acestuia nu i rezerv nicio resurs."
- IDS_DEV_CANT_SHARE_IRQ "Acest dispozitiv folosete o resurs Interrupt Request - Cerere de ntrerupere (IRQ) care este folosit deja de alt dispozitiv i nu poate fi folosit n comun.\nTrebuie s schimbai setrile care intr n conflict sau s eliminai driverul n mod real care produce conflictul."
- IDS_DEV_FAILED_ADD "Acest dispozitiv nu funcioneaz bine deoarcere $1 nu funcioneaz corect."
- IDS_DEV_DISABLED_SERVICE "ReactOS nu poate instala driverele pentru acest dispozitiv deoarece nu poate accesa locaia unde sunt stocate fiierele de instalare."
- IDS_DEV_TRANSLATION_FAILED "Acest dispozitiv nu rspunde la comenzile driverului."
- IDS_DEV_NO_SOFTCONFIG "ReactOS nu poate determina setrile acestui dispozitiv. Consultai documentaia care a venit cu acesta i folosii fila Resurse pentru a seta configuraia."
- IDS_DEV_BIOS_TABLE "Computerul dumneavoastr nu conine componentele (fizice sau virtuale) necesare pentru a configura i a lucra cu acest dispozitiv. \nPentru a folosi acest dispozitiv, contactai productorul computerului pentru o actualizare a sistemului BIOS i a firmware-ului."
- IDS_DEV_IRQ_TRANSLATION_FAILED "Acest dispozitiv a solicitat o ntrerupere PCI pe cnd el este configurat pentru ntreruperi ISA (sau viceversa). \nV rugm folosii programul de configurare sistem pentru a configura ntreruperile."
- IDS_DEV_FAILED_DRIVER_ENTRY "ReactOS nu poate iniializa driverul pentru acest dispozitiv."
- IDS_DEV_DRIVER_FAILED_PRIOR_UNLOAD "ReactOS nu poate ncrca driverul pentru acest dispozitiv deoarece acesta este deja ncrcat n memorie."
- IDS_DEV_DRIVER_FAILED_LOAD "ReactOS nu poate ncrca driverul pentru acest dispozitiv. Este posibil ca acesta s fie stricat sau s lipseasc."
- IDS_DEV_DRIVER_SERVICE_KEY_INVALID "ReactOS nu poate accesa dispozitivul deoarece cheile din registri pentru acest dispozitiv deoarece acestea lipsesc sau nu sunt corect nregistrate."
- IDS_DEV_LEGACY_SERVICE_NO_DEVICES "ReactOS a ncrcat cu succes driverul pentru acest dispozitiv dar nu gsete dispozitivul."
- IDS_DEV_DUPLICATE_DEVICE "ReactOS nu poate ncrca driverul deoarece exist un dispozitiv dublur care deja funcioneaz."
+ IDS_DEV_HARDWARE_DISABLED "Acest dispozitiv este dezactivat deoarece sistemul BIOS al acestuia nu îi rezervă nicio resursă."
+ IDS_DEV_CANT_SHARE_IRQ "Acest dispozitiv folosește o resursă Interrupt Request - Cerere de Întrerupere (IRQ) care este folosită deja de alt dispozitiv și nu poate fi folosită în comun.\nTrebuie să schimbați setările care intră în conflict sau să eliminați driverul în mod real care produce conflictul."
+ IDS_DEV_FAILED_ADD "Acest dispozitiv nu funcționează bine deoarcere $1 nu funcționează corect."
+ IDS_DEV_DISABLED_SERVICE "ReactOS nu poate instala driverele pentru acest dispozitiv deoarece nu poate accesa locația unde sunt stocate fișierele de instalare."
+ IDS_DEV_TRANSLATION_FAILED "Acest dispozitiv nu răspunde la comenzile driverului."
+ IDS_DEV_NO_SOFTCONFIG "ReactOS nu poate determina setările acestui dispozitiv. Consultați documentația care a venit cu acesta și folosiți fila Resurse pentru a seta configurația."
+ IDS_DEV_BIOS_TABLE "Computerul dumneavoastră nu conține componentele (fizice sau virtuale) necesare pentru a configura și a lucra cu acest dispozitiv. \nPentru a folosi acest dispozitiv, contactați producătorul computerului pentru o actualizare a sistemului BIOS și a firmware-ului."
+ IDS_DEV_IRQ_TRANSLATION_FAILED "Acest dispozitiv a solicitat o întrerupere PCI pe când el este configurat pentru întreruperi ISA (sau viceversa). \nVă rugăm folosiți programul de configurare sistem pentru a configura întreruperile."
+ IDS_DEV_FAILED_DRIVER_ENTRY "ReactOS nu poate inițializa driverul pentru acest dispozitiv."
+ IDS_DEV_DRIVER_FAILED_PRIOR_UNLOAD "ReactOS nu poate încărca driverul pentru acest dispozitiv deoarece acesta este deja încărcat în memorie."
+ IDS_DEV_DRIVER_FAILED_LOAD "ReactOS nu poate încărca driverul pentru acest dispozitiv. Este posibil ca acesta să fie stricat sau să lipsească."
+ IDS_DEV_DRIVER_SERVICE_KEY_INVALID "ReactOS nu poate accesa dispozitivul deoarece cheile din registri pentru acest dispozitiv deoarece acestea lipsesc sau nu sunt corect înregistrate."
+ IDS_DEV_LEGACY_SERVICE_NO_DEVICES "ReactOS a încărcat cu succes driverul pentru acest dispozitiv dar nu găsește dispozitivul."
+ IDS_DEV_DUPLICATE_DEVICE "ReactOS nu poate încărca driverul deoarece există un dispozitiv dublură care deja funcționează."
IDS_DEV_FAILED_POST_START "ReactOS a oprit dispozitivul deoarece acesta a indicat probleme."
- IDS_DEV_HALTED "O aplicaie sau un serviciu a oprit acest dispozitiv."
+ IDS_DEV_HALTED "O aplicație sau un serviciu a oprit acest dispozitiv."
IDS_DEV_PHANTOM "Acest dispozitiv nu este conectat la computer."
- IDS_DEV_SYSTEM_SHUTDOWN "ReactOS nu poate accesa dispozitivul deoarece sistemul de operare este n curs de nchidere."
- IDS_DEV_HELD_FOR_EJECT "ReactOS nu poate folosi acest dispozitiv deoarece acesta a fost pregtit pentru eliminarea n siguran dar nc nu a fost deconectat."
- IDS_DEV_DRIVER_BLOCKED "Software-ul acestui dispozitiv a fost oprit deoarece se cunoate c acesta ntmpin probleme pe ReactOS. Contactai vnztorul driverului pentru unul nou."
+ IDS_DEV_SYSTEM_SHUTDOWN "ReactOS nu poate accesa dispozitivul deoarece sistemul de operare este în curs de închidere."
+ IDS_DEV_HELD_FOR_EJECT "ReactOS nu poate folosi acest dispozitiv deoarece acesta a fost pregătit pentru eliminarea în siguranță dar încă nu a fost deconectat."
+ IDS_DEV_DRIVER_BLOCKED "Software-ul acestui dispozitiv a fost oprit deoarece se cunoaște că acesta întâmpină probleme pe ReactOS. Contactați vânzătorul driverului pentru unul nou."
IDS_DEV_REGISTRY_TOO_LARGE "ReactOS nu poate porni acest dispozitiv deoarece hive-ul de sistem este prea mare."
- IDS_DEV_SETPROPERTIES_FAILED "ReactOS nu a putut schimba setrile acestui dispozitiv."
+ IDS_DEV_SETPROPERTIES_FAILED "ReactOS nu a putut schimba setările acestui dispozitiv."
END
IDD_HARDWARE DIALOGEX DISCARDABLE 0, 0, 300, 400
@@ -99,13 +101,13 @@ BEGIN
CONTROL "",IDC_LV_DEVICES,"SysListView32",LVS_REPORT |
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,16,196,50
- GROUPBOX "Proprieti dispozitiv",IDC_PROPERTIESGROUP,7,76,196,105
+ GROUPBOX "Proprietăți dispozitiv",IDC_PROPERTIESGROUP,7,76,196,105
LTEXT "",IDC_MANUFACTURER,14,88,183,10,SS_ENDELLIPSIS
LTEXT "",IDC_LOCATION,14,100,183,10,SS_ENDELLIPSIS
LTEXT "",IDC_STATUS,14,112,183,30
PUSHBUTTON "&Depanare...",IDC_TROUBLESHOOT,85,140,54,14,
BS_PUSHBUTTON | WS_CHILD | WS_DISABLED | WS_TABSTOP
- PUSHBUTTON "P&roprieti",IDC_PROPERTIES,146,140,50,14
+ PUSHBUTTON "P&roprietăți",IDC_PROPERTIES,146,140,50,14
END
IDD_DEVICEGENERAL DIALOGEX DISCARDABLE 0, 0, 252, 218
@@ -117,9 +119,9 @@ BEGIN
LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
LTEXT "Tip dispozitiv:", -1, 37, 39, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DEVTYPE, 100, 39, 146, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
- LTEXT "Productor:", -1, 37, 53, 60, 8, SS_NOPREFIX
+ LTEXT "Producător:", -1, 37, 53, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DEVMANUFACTURER, 100, 53, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
- LTEXT "Locaie:", -1, 37, 67, 60, 8, SS_NOPREFIX
+ LTEXT "Locație:", -1, 37, 67, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DEVLOCATION, 100, 67, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
GROUPBOX "Stare dispozitiv", IDC_DEVSTATUSGROUP, 7, 83, 238, 100
EDITTEXT IDC_DEVSTATUS, 14, 96, 224, 61, NOT WS_TABSTOP | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL
@@ -137,30 +139,30 @@ BEGIN
LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
LTEXT "Furnizor driver:", -1, 37, 39, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DRVPROVIDER, 100, 39, 146, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
- LTEXT "Dat driver:", -1, 37, 53, 60, 8, SS_NOPREFIX
+ LTEXT "Dată driver:", -1, 37, 53, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DRVDATE, 100, 53, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Versiune driver:", -1, 37, 67, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DRVVERSION, 100, 67, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Semnatar digital:", -1, 37, 81, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DIGITALSIGNER, 100, 81, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
PUSHBUTTON "&Detalii...", IDC_DRIVERDETAILS, 7, 106, 70, 15
- LTEXT "Pentru a vedea detalii despre fiierele driver.", -1, 91, 110, 154, 17, SS_NOPREFIX
+ LTEXT "Pentru a vedea detalii despre fișierele driver.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
-CAPTION "Detalii fiiere driver"
+CAPTION "Detalii fișiere driver"
FONT 8, "MS Shell Dlg"
BEGIN
ICON "", IDC_DEVICON, 7, 7, 20, 20
LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
- LTEXT "&Fiiere driver:", -1, 7, 36, 204, 8
+ LTEXT "&Fișiere driver:", -1, 7, 36, 204, 8
CONTROL "", IDC_DRIVERFILES, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER |
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
LTEXT "Furnizor:", -1, 14, 134, 50, 8
LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
- LTEXT "Versiune fiier:", -1, 14, 150, 50, 8
+ LTEXT "Versiune fișier:", -1, 14, 150, 50, 8
LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
LTEXT "Drept de autor:", -1, 14, 166, 50, 8
LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
@@ -169,3 +171,4 @@ BEGIN
PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
END
+#pragma code_page(default)
diff --git a/reactos/dll/win32/dhcpcsvc/dhcpcsvc.c b/reactos/dll/win32/dhcpcsvc/dhcpcsvc.c
index 3955c33d20e..0c59fb7df90 100644
--- a/reactos/dll/win32/dhcpcsvc/dhcpcsvc.c
+++ b/reactos/dll/win32/dhcpcsvc/dhcpcsvc.c
@@ -36,7 +36,7 @@ DWORD APIENTRY DhcpQueryHWInfo( DWORD AdapterIndex,
Req.Type = DhcpReqQueryHWInfo;
Req.AdapterIndex = AdapterIndex;
- Result = CallNamedPipe
+ Result = CallNamedPipeW
( DHCP_PIPE_NAME, &Req, sizeof(Req), &Reply, sizeof(Reply),
&BytesRead, DHCP_TIMEOUT );
@@ -58,7 +58,7 @@ DWORD APIENTRY DhcpLeaseIpAddress( DWORD AdapterIndex ) {
Req.Type = DhcpReqLeaseIpAddress;
Req.AdapterIndex = AdapterIndex;
- Result = CallNamedPipe
+ Result = CallNamedPipeW
( DHCP_PIPE_NAME, &Req, sizeof(Req), &Reply, sizeof(Reply),
&BytesRead, DHCP_TIMEOUT );
@@ -74,7 +74,7 @@ DWORD APIENTRY DhcpReleaseIpAddressLease( DWORD AdapterIndex ) {
Req.Type = DhcpReqReleaseIpAddress;
Req.AdapterIndex = AdapterIndex;
- Result = CallNamedPipe
+ Result = CallNamedPipeW
( DHCP_PIPE_NAME, &Req, sizeof(Req), &Reply, sizeof(Reply),
&BytesRead, DHCP_TIMEOUT );
@@ -90,7 +90,7 @@ DWORD APIENTRY DhcpRenewIpAddressLease( DWORD AdapterIndex ) {
Req.Type = DhcpReqRenewIpAddress;
Req.AdapterIndex = AdapterIndex;
- Result = CallNamedPipe
+ Result = CallNamedPipeW
( DHCP_PIPE_NAME, &Req, sizeof(Req), &Reply, sizeof(Reply),
&BytesRead, DHCP_TIMEOUT );
@@ -110,7 +110,7 @@ DWORD APIENTRY DhcpStaticRefreshParams( DWORD AdapterIndex,
Req.Body.StaticRefreshParams.IPAddress = Address;
Req.Body.StaticRefreshParams.Netmask = Netmask;
- Result = CallNamedPipe
+ Result = CallNamedPipeW
( DHCP_PIPE_NAME, &Req, sizeof(Req), &Reply, sizeof(Reply),
&BytesRead, DHCP_TIMEOUT );
@@ -195,7 +195,7 @@ DWORD APIENTRY DhcpRosGetAdapterInfo( DWORD AdapterIndex,
Req.Type = DhcpReqGetAdapterInfo;
Req.AdapterIndex = AdapterIndex;
- Result = CallNamedPipe
+ Result = CallNamedPipeW
( DHCP_PIPE_NAME, &Req, sizeof(Req), &Reply, sizeof(Reply),
&BytesRead, DHCP_TIMEOUT );
diff --git a/reactos/dll/win32/gdi32/include/gdi32p.h b/reactos/dll/win32/gdi32/include/gdi32p.h
index 31147d6e7df..9b14a355cc4 100644
--- a/reactos/dll/win32/gdi32/include/gdi32p.h
+++ b/reactos/dll/win32/gdi32/include/gdi32p.h
@@ -115,36 +115,36 @@ typedef struct _LOCALFONT
} LOCALFONT, *PLOCALFONT;
// sdk/winspool.h
-typedef BOOL WINAPI (*ABORTPRINTER) (HANDLE);
-typedef BOOL WINAPI (*CLOSEPRINTER) (HANDLE);
-typedef BOOL WINAPI (*CLOSESPOOLFILEHANDLE) (HANDLE, HANDLE); // W2k8
-typedef HANDLE WINAPI (*COMMITSPOOLDATA) (HANDLE,HANDLE,DWORD); // W2k8
-typedef LONG WINAPI (*DOCUMENTPROPERTIESW) (HWND,HANDLE,LPWSTR,PDEVMODEW,PDEVMODEW,DWORD);
-typedef BOOL WINAPI (*ENDDOCPRINTER) (HANDLE);
-typedef BOOL WINAPI (*ENDPAGEPRINTER) (HANDLE);
-typedef BOOL WINAPI (*GETPRINTERW) (HANDLE,DWORD,LPBYTE,DWORD,LPDWORD);
-typedef BOOL WINAPI (*GETPRINTERDRIVERW) (HANDLE,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD);
-typedef HANDLE WINAPI (*GETSPOOLFILEHANDLE) (HANDLE); // W2k8
-typedef BOOL WINAPI (*ISVALIDDEVMODEW) (PDEVMODEW,size_t);
-typedef BOOL WINAPI (*OPENPRINTERW) (LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW);
-typedef BOOL WINAPI (*READPRINTER) (HANDLE,PVOID,DWORD,PDWORD);
-typedef BOOL WINAPI (*RESETPRINTERW) (HANDLE,LPPRINTER_DEFAULTSW);
-typedef LPWSTR WINAPI (*STARTDOCDLGW) (HANDLE,DOCINFOW *);
-typedef DWORD WINAPI (*STARTDOCPRINTERW) (HANDLE,DWORD,PBYTE);
-typedef BOOL WINAPI (*STARTPAGEPRINTER) (HANDLE);
+typedef BOOL (WINAPI *ABORTPRINTER) (HANDLE);
+typedef BOOL (WINAPI *CLOSEPRINTER) (HANDLE);
+typedef BOOL (WINAPI *CLOSESPOOLFILEHANDLE) (HANDLE, HANDLE); // W2k8
+typedef HANDLE (WINAPI *COMMITSPOOLDATA) (HANDLE,HANDLE,DWORD); // W2k8
+typedef LONG (WINAPI *DOCUMENTPROPERTIESW) (HWND,HANDLE,LPWSTR,PDEVMODEW,PDEVMODEW,DWORD);
+typedef BOOL (WINAPI *ENDDOCPRINTER) (HANDLE);
+typedef BOOL (WINAPI *ENDPAGEPRINTER) (HANDLE);
+typedef BOOL (WINAPI *GETPRINTERW) (HANDLE,DWORD,LPBYTE,DWORD,LPDWORD);
+typedef BOOL (WINAPI *GETPRINTERDRIVERW) (HANDLE,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD);
+typedef HANDLE (WINAPI *GETSPOOLFILEHANDLE) (HANDLE); // W2k8
+typedef BOOL (WINAPI *ISVALIDDEVMODEW) (PDEVMODEW,size_t);
+typedef BOOL (WINAPI *OPENPRINTERW) (LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW);
+typedef BOOL (WINAPI *READPRINTER) (HANDLE,PVOID,DWORD,PDWORD);
+typedef BOOL (WINAPI *RESETPRINTERW) (HANDLE,LPPRINTER_DEFAULTSW);
+typedef LPWSTR (WINAPI *STARTDOCDLGW) (HANDLE,DOCINFOW *);
+typedef DWORD (WINAPI *STARTDOCPRINTERW) (HANDLE,DWORD,PBYTE);
+typedef BOOL (WINAPI *STARTPAGEPRINTER) (HANDLE);
// ddk/winsplp.h
-typedef BOOL WINAPI (*SEEKPRINTER) (HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD,BOOL);
-typedef BOOL WINAPI (*SPLREADPRINTER) (HANDLE,LPBYTE *,DWORD);
+typedef BOOL (WINAPI *SEEKPRINTER) (HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD,BOOL);
+typedef BOOL (WINAPI *SPLREADPRINTER) (HANDLE,LPBYTE *,DWORD);
// Same as ddk/winsplp.h DriverUnloadComplete?
-typedef BOOL WINAPI (*SPLDRIVERUNLOADCOMPLETE) (LPWSTR);
+typedef BOOL (WINAPI *SPLDRIVERUNLOADCOMPLETE) (LPWSTR);
// Driver support:
// DrvDocumentEvent api/winddiui.h not W2k8 DocumentEventAW
-typedef INT WINAPI (*DOCUMENTEVENT) (HANDLE,HDC,INT,ULONG,PVOID,ULONG,PVOID);
+typedef INT (WINAPI *DOCUMENTEVENT) (HANDLE,HDC,INT,ULONG,PVOID,ULONG,PVOID);
// DrvQueryColorProfile
-typedef BOOL WINAPI (*QUERYCOLORPROFILE) (HANDLE,PDEVMODEW,ULONG,VOID*,ULONG,FLONG);
+typedef BOOL (WINAPI *QUERYCOLORPROFILE) (HANDLE,PDEVMODEW,ULONG,VOID*,ULONG,FLONG);
// Unknown:
-typedef DWORD WINAPI (*QUERYSPOOLMODE) (HANDLE,DWORD,DWORD);
-typedef DWORD WINAPI (*QUERYREMOTEFONTS) (DWORD,DWORD,DWORD);
+typedef DWORD (WINAPI *QUERYSPOOLMODE) (HANDLE,DWORD,DWORD);
+typedef DWORD (WINAPI *QUERYREMOTEFONTS) (DWORD,DWORD,DWORD);
extern CLOSEPRINTER fpClosePrinter;
diff --git a/reactos/dll/win32/gdi32/objects/dc.c b/reactos/dll/win32/gdi32/objects/dc.c
index 911fbff8271..20f63471b5e 100644
--- a/reactos/dll/win32/gdi32/objects/dc.c
+++ b/reactos/dll/win32/gdi32/objects/dc.c
@@ -36,7 +36,7 @@ IntCreateDICW ( LPCWSTR lpwszDriver,
}
else
{
- if (lpwszDevice) // First
+ if ((lpwszDevice) && (wcslen(lpwszDevice) != 0)) // First
{
if (!_wcsnicmp(lpwszDevice, L"\\\\.\\DISPLAY",11)) Display = TRUE;
RtlInitUnicodeString(&Device, lpwszDevice);
@@ -64,6 +64,7 @@ IntCreateDICW ( LPCWSTR lpwszDriver,
(PDEVMODEW) lpInitData,
(lpwszOutput ? &Output : NULL),
iType, // DCW 0 and ICW 1.
+ Display,
hspool,
(PVOID) NULL, // NULL for now.
(PVOID) &UMdhpdev );
diff --git a/reactos/dll/win32/hhctrl.ocx/Lt.rc b/reactos/dll/win32/hhctrl.ocx/Lt.rc
new file mode 100644
index 00000000000..fed6b40e400
--- /dev/null
+++ b/reactos/dll/win32/hhctrl.ocx/Lt.rc
@@ -0,0 +1,63 @@
+/*
+ * HTML Help resources
+ * Lithuanian Language Support
+ *
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * 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
+ */
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE
+BEGIN
+ IDS_CONTENTS "&Turinys"
+ IDS_INDEX "&Rodyklė"
+ IDS_SEARCH "&Paieška"
+ IDS_FAVORITES "&Adresynas"
+END
+
+STRINGTABLE
+BEGIN
+ IDTB_EXPAND "Rodyti"
+ IDTB_CONTRACT "Slėpti"
+ IDTB_STOP "Stabdyti"
+ IDTB_REFRESH "Atnaujinti"
+ IDTB_BACK "Atgal"
+ IDTB_HOME "Į pradžią"
+ IDTB_SYNC "Sinchronizuoti"
+ IDTB_PRINT "Spausdinti"
+ IDTB_OPTIONS "Parinktys"
+ IDTB_FORWARD "Pirmyn"
+ IDTB_NOTES "IDTB_NOTES"
+ IDTB_BROWSE_FWD "IDTB_BROWSE_FWD"
+ IDTB_BROWSE_BACK "IDT_BROWSE_BACK"
+ IDTB_CONTENTS "IDTB_CONTENTS"
+ IDTB_INDEX "IDTB_INDEX"
+ IDTB_SEARCH "IDTB_SEARCH"
+ IDTB_HISTORY "IDTB_HISTORY"
+ IDTB_FAVORITES "IDTB_FAVORITES"
+ IDTB_JUMP1 "Nukreipimas1"
+ IDTB_JUMP2 "Nukreipimas2"
+ IDTB_CUSTOMIZE "Adaptuoti"
+ IDTB_ZOOM "Keisti mastelį"
+ IDTB_TOC_NEXT "IDTB_TOC_NEXT"
+ IDTB_TOC_PREV "IDTB_TOC_PREV"
+END
+
+#pragma code_page(default)
diff --git a/reactos/dll/win32/hhctrl.ocx/hhctrl.rc b/reactos/dll/win32/hhctrl.ocx/hhctrl.rc
index e6dc1126418..8618819ed12 100644
--- a/reactos/dll/win32/hhctrl.ocx/hhctrl.rc
+++ b/reactos/dll/win32/hhctrl.ocx/hhctrl.rc
@@ -38,6 +38,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#include "Fi.rc"
#include "Hu.rc"
#include "Ko.rc"
+#include "Lt.rc"
#include "Nl.rc"
#include "No.rc"
#include "Pl.rc"
diff --git a/reactos/dll/win32/iphlpapi/ifenum_reactos.c b/reactos/dll/win32/iphlpapi/ifenum_reactos.c
index 5a10caab17c..a37d5e0d03d 100644
--- a/reactos/dll/win32/iphlpapi/ifenum_reactos.c
+++ b/reactos/dll/win32/iphlpapi/ifenum_reactos.c
@@ -280,7 +280,7 @@ NTSTATUS tdiGetMibForIfEntity
entry->ent.if_descr);
TRACE("} status %08x\n",status);
- return status;
+ return STATUS_SUCCESS;
}
NTSTATUS tdiGetEntityIDSet( HANDLE tcpFile,
diff --git a/reactos/dll/win32/iphlpapi/iphlpapi.rbuild b/reactos/dll/win32/iphlpapi/iphlpapi.rbuild
index 22385f0432c..6582639fe05 100644
--- a/reactos/dll/win32/iphlpapi/iphlpapi.rbuild
+++ b/reactos/dll/win32/iphlpapi/iphlpapi.rbuild
@@ -2,6 +2,7 @@
.
include/reactos/wine
+ include
wine
ntdll
kernel32
diff --git a/reactos/dll/win32/iphlpapi/iphlpapi_main.c b/reactos/dll/win32/iphlpapi/iphlpapi_main.c
index 0e249f83f70..5f8abd17211 100644
--- a/reactos/dll/win32/iphlpapi/iphlpapi_main.c
+++ b/reactos/dll/win32/iphlpapi/iphlpapi_main.c
@@ -48,6 +48,8 @@
#include "resinfo.h"
#include "route.h"
#include "wine/debug.h"
+#include "dhcpcsdk.h"
+#include "dhcp/rosdhcp_public.h"
WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi);
@@ -103,7 +105,7 @@ DWORD getInterfaceGatewayByIndex(DWORD index)
for (ndx = 0; ndx < numRoutes; ndx++)
{
- if ((table->routes[ndx].ifIndex == (index - 1)) && (table->routes[ndx].dest == 0))
+ if ((table->routes[ndx].ifIndex == (index)) && (table->routes[ndx].dest == 0))
retVal = table->routes[ndx].gateway;
}
HeapFree(GetProcessHeap(), 0, table);
@@ -1880,19 +1882,33 @@ DWORD WINAPI GetUniDirectionalAdapterInfo(PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS pIP
* Success: NO_ERROR
* Failure: error code from winerror.h
*
- * NOTES
- * Since GetAdaptersInfo never returns adapters that have DHCP enabled,
- * this function does nothing.
- *
- * FIXME
- * Stub, returns ERROR_NOT_SUPPORTED.
*/
DWORD WINAPI IpReleaseAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo)
{
+ COMM_DHCP_REPLY Reply;
+ COMM_DHCP_REQ Request;
+ DWORD BytesRead;
+
+ Request.AdapterIndex = AdapterInfo->Index;
+ Request.Type = DhcpReqReleaseIpAddress;
+
TRACE("AdapterInfo %p\n", AdapterInfo);
- /* not a stub, never going to support this (and I never mark an adapter as
- DHCP enabled, see GetAdaptersInfo, so this should never get called) */
- return ERROR_NOT_SUPPORTED;
+
+ if (CallNamedPipe(DHCP_PIPE_NAME,
+ &Request,
+ sizeof(Request),
+ &Reply,
+ sizeof(Reply),
+ &BytesRead,
+ NMPWAIT_USE_DEFAULT_WAIT))
+ {
+ if (Reply.Reply)
+ return NO_ERROR;
+
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ return ERROR_PROC_NOT_FOUND;
}
@@ -1907,20 +1923,33 @@ DWORD WINAPI IpReleaseAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo)
* RETURNS
* Success: NO_ERROR
* Failure: error code from winerror.h
- *
- * NOTES
- * Since GetAdaptersInfo never returns adapters that have DHCP enabled,
- * this function does nothing.
- *
- * FIXME
- * Stub, returns ERROR_NOT_SUPPORTED.
*/
DWORD WINAPI IpRenewAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo)
{
+ COMM_DHCP_REPLY Reply;
+ COMM_DHCP_REQ Request;
+ DWORD BytesRead;
+
+ Request.AdapterIndex = AdapterInfo->Index;
+ Request.Type = DhcpReqRenewIpAddress;
+
TRACE("AdapterInfo %p\n", AdapterInfo);
- /* not a stub, never going to support this (and I never mark an adapter as
- DHCP enabled, see GetAdaptersInfo, so this should never get called) */
- return ERROR_NOT_SUPPORTED;
+
+ if (CallNamedPipe(DHCP_PIPE_NAME,
+ &Request,
+ sizeof(Request),
+ &Reply,
+ sizeof(Reply),
+ &BytesRead,
+ NMPWAIT_USE_DEFAULT_WAIT))
+ {
+ if (Reply.Reply)
+ return NO_ERROR;
+
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ return ERROR_PROC_NOT_FOUND;
}
diff --git a/reactos/dll/win32/jscript/array.c b/reactos/dll/win32/jscript/array.c
index 8f0802e8e93..cd40e432517 100644
--- a/reactos/dll/win32/jscript/array.c
+++ b/reactos/dll/win32/jscript/array.c
@@ -829,7 +829,7 @@ HRESULT create_array_constr(script_ctx_t *ctx, DispatchEx **ret)
if(FAILED(hres))
return hres;
- hres = create_builtin_function(ctx, ArrayConstr_value, PROPF_CONSTR, &array->dispex, ret);
+ hres = create_builtin_function(ctx, ArrayConstr_value, NULL, PROPF_CONSTR, &array->dispex, ret);
IDispatchEx_Release(_IDispatchEx_(&array->dispex));
return hres;
diff --git a/reactos/dll/win32/jscript/bool.c b/reactos/dll/win32/jscript/bool.c
index 1add8efb768..7e3bf7ac738 100644
--- a/reactos/dll/win32/jscript/bool.c
+++ b/reactos/dll/win32/jscript/bool.c
@@ -142,7 +142,7 @@ HRESULT create_bool_constr(script_ctx_t *ctx, DispatchEx **ret)
if(FAILED(hres))
return hres;
- hres = create_builtin_function(ctx, BoolConstr_value, PROPF_CONSTR, &bool->dispex, ret);
+ hres = create_builtin_function(ctx, BoolConstr_value, NULL, PROPF_CONSTR, &bool->dispex, ret);
jsdisp_release(&bool->dispex);
return hres;
diff --git a/reactos/dll/win32/jscript/date.c b/reactos/dll/win32/jscript/date.c
index e17ad268f56..9dcc8a7391b 100644
--- a/reactos/dll/win32/jscript/date.c
+++ b/reactos/dll/win32/jscript/date.c
@@ -35,6 +35,10 @@ typedef struct {
DOUBLE time;
LONG bias;
+ SYSTEMTIME standardDate;
+ LONG standardBias;
+ SYSTEMTIME daylightDate;
+ LONG daylightBias;
} DateInstance;
static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
@@ -64,18 +68,18 @@ static const WCHAR getMinutesW[] = {'g','e','t','M','i','n','u','t','e','s',0};
static const WCHAR getUTCMinutesW[] = {'g','e','t','U','T','C','M','i','n','u','t','e','s',0};
static const WCHAR getSecondsW[] = {'g','e','t','S','e','c','o','n','d','s',0};
static const WCHAR getUTCSecondsW[] = {'g','e','t','U','T','C','S','e','c','o','n','d','s',0};
-static const WCHAR getMilisecondsW[] = {'g','e','t','M','i','l','i','s','e','c','o','n','d','s',0};
-static const WCHAR getUTCMilisecondsW[] = {'g','e','t','U','T','C','M','i','l','i','s','e','c','o','n','d','s',0};
+static const WCHAR getMillisecondsW[] = {'g','e','t','M','i','l','l','i','s','e','c','o','n','d','s',0};
+static const WCHAR getUTCMillisecondsW[] = {'g','e','t','U','T','C','M','i','l','l','i','s','e','c','o','n','d','s',0};
static const WCHAR getTimezoneOffsetW[] = {'g','e','t','T','i','m','e','z','o','n','e','O','f','f','s','e','t',0};
static const WCHAR setTimeW[] = {'s','e','t','T','i','m','e',0};
-static const WCHAR setMilisecondsW[] = {'s','e','t','M','i','l','i','s','e','c','o','n','d','s',0};
-static const WCHAR setUTCMilisecondsW[] = {'s','e','t','U','T','C','M','i','l','i','s','e','c','o','n','d','s',0};
+static const WCHAR setMillisecondsW[] = {'s','e','t','M','i','l','l','i','s','e','c','o','n','d','s',0};
+static const WCHAR setUTCMillisecondsW[] = {'s','e','t','U','T','C','M','i','l','l','i','s','e','c','o','n','d','s',0};
static const WCHAR setSecondsW[] = {'s','e','t','S','e','c','o','n','d','s',0};
static const WCHAR setUTCSecondsW[] = {'s','e','t','U','T','C','S','e','c','o','n','d','s',0};
static const WCHAR setMinutesW[] = {'s','e','t','M','i','n','u','t','e','s',0};
static const WCHAR setUTCMinutesW[] = {'s','e','t','U','T','C','M','i','n','u','t','e','s',0};
static const WCHAR setHoursW[] = {'s','e','t','H','o','u','r','s',0};
-static const WCHAR setUTCHoursW[] = {'s','e','t','H','o','u','r','s',0};
+static const WCHAR setUTCHoursW[] = {'s','e','t','U','T','C','H','o','u','r','s',0};
static const WCHAR setDateW[] = {'s','e','t','D','a','t','e',0};
static const WCHAR setUTCDateW[] = {'s','e','t','U','T','C','D','a','t','e',0};
static const WCHAR setMonthW[] = {'s','e','t','M','o','n','t','h',0};
@@ -83,6 +87,347 @@ static const WCHAR setUTCMonthW[] = {'s','e','t','U','T','C','M','o','n','t','h'
static const WCHAR setFullYearW[] = {'s','e','t','F','u','l','l','Y','e','a','r',0};
static const WCHAR setUTCFullYearW[] = {'s','e','t','U','T','C','F','u','l','l','Y','e','a','r',0};
+static const WCHAR UTCW[] = {'U','T','C',0};
+static const WCHAR parseW[] = {'p','a','r','s','e',0};
+
+/*ECMA-262 3rd Edition 15.9.1.2 */
+#define MS_PER_DAY 86400000
+#define MS_PER_HOUR 3600000
+#define MS_PER_MINUTE 60000
+
+/* ECMA-262 3rd Edition 15.9.1.2 */
+static inline DOUBLE day(DOUBLE time)
+{
+ return floor(time / MS_PER_DAY);
+}
+
+/* ECMA-262 3rd Edition 15.9.1.2 */
+static inline DOUBLE time_within_day(DOUBLE time)
+{
+ DOUBLE ret;
+
+ ret = fmod(time, MS_PER_DAY);
+ if(ret < 0)
+ ret += MS_PER_DAY;
+
+ return ret;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.3 */
+static inline DOUBLE days_in_year(DOUBLE year)
+{
+ int y;
+
+ if(year != (int)year)
+ return ret_nan();
+
+ y = year;
+ if(y%4 != 0) return 365;
+ if(y%100 != 0) return 366;
+ if(y%400 != 0) return 365;
+ return 366;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.3 */
+static inline DOUBLE day_from_year(DOUBLE year)
+{
+ if(year != (int)year)
+ return ret_nan();
+
+ return floor(365.0*(year-1970) + floor((year-1969)/4)
+ - floor((year-1901)/100) + floor((year-1601)/400));
+}
+
+static inline int day_from_month(int month, int in_leap_year)
+{
+ switch(month)
+ {
+ case 0:
+ return 0;
+ case 1:
+ return 31;
+ case 2:
+ return 59+in_leap_year;
+ case 3:
+ return 90+in_leap_year;
+ case 4:
+ return 120+in_leap_year;
+ case 5:
+ return 151+in_leap_year;
+ case 6:
+ return 181+in_leap_year;
+ case 7:
+ return 212+in_leap_year;
+ case 8:
+ return 243+in_leap_year;
+ case 9:
+ return 273+in_leap_year;
+ case 10:
+ return 304+in_leap_year;
+ default:
+ return 334+in_leap_year;
+ }
+}
+
+/* ECMA-262 3rd Edition 15.9.1.3 */
+static inline DOUBLE time_from_year(DOUBLE year)
+{
+ return MS_PER_DAY*day_from_year(year);
+}
+
+/* ECMA-262 3rd Edition 15.9.1.3 */
+static inline DOUBLE year_from_time(DOUBLE time)
+{
+ int y;
+
+ if(isnan(time))
+ return ret_nan();
+
+ y = 1970 + time/365.25/MS_PER_DAY;
+
+ if(time_from_year(y) > time)
+ while(time_from_year(y) > time) y--;
+ else
+ while(time_from_year(y+1)<=time) y++;
+
+ return y;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.3 */
+static inline int in_leap_year(DOUBLE time)
+{
+ if(days_in_year(year_from_time(time))==366)
+ return 1;
+ return 0;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.4 */
+static inline int day_within_year(DOUBLE time)
+{
+ return day(time) - day_from_year(year_from_time(time));
+}
+
+/* ECMA-262 3rd Edition 15.9.1.4 */
+static inline DOUBLE month_from_time(DOUBLE time)
+{
+ int ily = in_leap_year(time);
+ int dwy = day_within_year(time);
+
+ if(isnan(time))
+ return ret_nan();
+
+ if(0<=dwy && dwy<31) return 0;
+ if(dwy < 59+ily) return 1;
+ if(dwy < 90+ily) return 2;
+ if(dwy < 120+ily) return 3;
+ if(dwy < 151+ily) return 4;
+ if(dwy < 181+ily) return 5;
+ if(dwy < 212+ily) return 6;
+ if(dwy < 243+ily) return 7;
+ if(dwy < 273+ily) return 8;
+ if(dwy < 304+ily) return 9;
+ if(dwy < 334+ily) return 10;
+ return 11;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.5 */
+static inline DOUBLE date_from_time(DOUBLE time)
+{
+ int dwy = day_within_year(time);
+ int ily = in_leap_year(time);
+ int mft = month_from_time(time);
+
+ if(isnan(time))
+ return ret_nan();
+
+ if(mft==0) return dwy+1;
+ if(mft==1) return dwy-30;
+ if(mft==2) return dwy-58-ily;
+ if(mft==3) return dwy-89-ily;
+ if(mft==4) return dwy-119-ily;
+ if(mft==5) return dwy-150-ily;
+ if(mft==6) return dwy-180-ily;
+ if(mft==7) return dwy-211-ily;
+ if(mft==8) return dwy-242-ily;
+ if(mft==9) return dwy-272-ily;
+ if(mft==10) return dwy-303-ily;
+ return dwy-333-ily;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.6 */
+static inline DOUBLE week_day(DOUBLE time)
+{
+ DOUBLE ret;
+
+ if(isnan(time))
+ return ret_nan();
+
+ ret = fmod(day(time)+4, 7);
+ if(ret<0) ret += 7;
+
+ return ret;
+}
+
+static inline DOUBLE convert_time(int year, SYSTEMTIME st)
+{
+ DOUBLE time;
+ int set_week_day;
+
+ if(st.wMonth == 0)
+ return ret_nan();
+
+ if(st.wYear != 0)
+ year = st.wYear;
+
+ time = time_from_year(year);
+ time += (DOUBLE)day_from_month(st.wMonth-1, in_leap_year(time)) * MS_PER_DAY;
+
+ if(st.wYear == 0) {
+ set_week_day = st.wDayOfWeek-week_day(time);
+ if(set_week_day < 0)
+ set_week_day += 7;
+ time += set_week_day * MS_PER_DAY;
+
+ time += (DOUBLE)(st.wDay-1) * 7 * MS_PER_DAY;
+ if(month_from_time(time) != st.wMonth-1)
+ time -= 7 * MS_PER_DAY;
+ }
+ else
+ time += st.wDay * MS_PER_DAY;
+
+ time += st.wHour * MS_PER_HOUR;
+ time += st.wMinute * MS_PER_MINUTE;
+
+ return time;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.9 */
+static inline DOUBLE daylight_saving_ta(DOUBLE time, DateInstance *date)
+{
+ int year = year_from_time(time);
+ DOUBLE standardTime, daylightTime;
+
+ if(isnan(time))
+ return 0;
+
+ standardTime = convert_time(year, date->standardDate);
+ daylightTime = convert_time(year, date->daylightDate);
+
+ if(isnan(standardTime) || isnan(daylightTime))
+ return 0;
+ else if(standardTime > daylightTime) {
+ if(daylightTime <= time && time < standardTime)
+ return date->daylightBias;
+
+ return date->standardBias;
+ }
+ else {
+ if(standardTime <= time && time < daylightTime)
+ return date->standardBias;
+
+ return date->daylightBias;
+ }
+}
+
+/* ECMA-262 3rd Edition 15.9.1.9 */
+static inline DOUBLE local_time(DOUBLE time, DateInstance *date)
+{
+ return time - (daylight_saving_ta(time, date)+date->bias)*MS_PER_MINUTE;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.9 */
+static inline DOUBLE utc(DOUBLE time, DateInstance *date)
+{
+ time += date->bias * MS_PER_MINUTE;
+ return time + daylight_saving_ta(time, date)*MS_PER_MINUTE;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.10 */
+static inline DOUBLE hour_from_time(DOUBLE time)
+{
+ DOUBLE ret;
+
+ if(isnan(time))
+ return ret_nan();
+
+ ret = fmod(floor(time/MS_PER_HOUR), 24);
+ if(ret<0) ret += 24;
+
+ return ret;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.10 */
+static inline DOUBLE min_from_time(DOUBLE time)
+{
+ DOUBLE ret;
+
+ if(isnan(time))
+ return ret_nan();
+
+ ret = fmod(floor(time/MS_PER_MINUTE), 60);
+ if(ret<0) ret += 60;
+
+ return ret;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.10 */
+static inline DOUBLE sec_from_time(DOUBLE time)
+{
+ DOUBLE ret;
+
+ if(isnan(time))
+ return ret_nan();
+
+ ret = fmod(floor(time/1000), 60);
+ if(ret<0) ret += 60;
+
+ return ret;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.10 */
+static inline DOUBLE ms_from_time(DOUBLE time)
+{
+ DOUBLE ret;
+
+ if(isnan(time))
+ return ret_nan();
+
+ ret = fmod(time, 1000);
+ if(ret<0) ret += 1000;
+
+ return ret;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.11 */
+static inline DOUBLE make_time(DOUBLE hour, DOUBLE min, DOUBLE sec, DOUBLE ms)
+{
+ return hour*MS_PER_HOUR + min*MS_PER_MINUTE + sec*1000 + ms;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.12 */
+static inline DOUBLE make_day(DOUBLE year, DOUBLE month, DOUBLE day)
+{
+ DOUBLE time;
+
+ year += floor(month/12);
+
+ month = fmod(month, 12);
+ if(month<0) month += 12;
+
+ time = time_from_year(year);
+
+ day += floor(time / MS_PER_DAY);
+ day += day_from_month(month, in_leap_year(time));
+
+ return day-1;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.13 */
+static inline DOUBLE make_date(DOUBLE day, DOUBLE time)
+{
+ return day*MS_PER_DAY + time;
+}
+
/* ECMA-262 3rd Edition 15.9.1.14 */
static inline DOUBLE time_clip(DOUBLE time)
{
@@ -93,18 +438,204 @@ static inline DOUBLE time_clip(DOUBLE time)
return floor(time);
}
+static SYSTEMTIME create_systemtime(DOUBLE time)
+{
+ SYSTEMTIME st;
+
+ st.wYear = year_from_time(time);
+ st.wMonth = month_from_time(time) + 1;
+ st.wDayOfWeek = week_day(time);
+ st.wDay = date_from_time(time);
+ st.wHour = hour_from_time(time);
+ st.wMinute = min_from_time(time);
+ st.wSecond = sec_from_time(time);
+ st.wMilliseconds = ms_from_time(time);
+
+ return st;
+}
+
+/* ECMA-262 3rd Edition 15.9.1.2 */
static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ static const WCHAR NaNW[] = { 'N','a','N',0 };
+ static const WCHAR formatW[] = { '%','s',' ','%','s',' ','%','d',' ',
+ '%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ',
+ 'U','T','C','%','c','%','0','2','d','%','0','2','d',' ','%','d','%','s',0 };
+ static const WCHAR formatUTCW[] = { '%','s',' ','%','s',' ','%','d',' ',
+ '%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ',
+ 'U','T','C',' ','%','d','%','s',0 };
+ static const WCHAR ADW[] = { 0 };
+ static const WCHAR BCW[] = { ' ','B','.','C','.',0 };
+
+ static const DWORD week_ids[] = { LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1,
+ LOCALE_SABBREVDAYNAME2, LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4,
+ LOCALE_SABBREVDAYNAME5, LOCALE_SABBREVDAYNAME6 };
+ static const DWORD month_ids[] = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2,
+ LOCALE_SABBREVMONTHNAME3, LOCALE_SABBREVMONTHNAME4,
+ LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6,
+ LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8,
+ LOCALE_SABBREVMONTHNAME9, LOCALE_SABBREVMONTHNAME10,
+ LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 };
+
+ BOOL formatAD = TRUE;
+ BSTR week, month;
+ DateInstance *date;
+ BSTR date_str;
+ DOUBLE time;
+ int len, size, year, day, offset;
+ DWORD lcid_en, week_id, month_id;
+ WCHAR sign = '-';
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ date = (DateInstance*)dispex;
+
+ if(isnan(date->time)) {
+ if(retv) {
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = SysAllocString(NaNW);
+ if(!V_BSTR(retv))
+ return E_OUTOFMEMORY;
+ }
+ return S_OK;
+ }
+
+ time = local_time(date->time, date);
+
+ if(retv) {
+ len = 21;
+
+ lcid_en = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
+
+ week_id = week_ids[(int)week_day(time)];
+ size = GetLocaleInfoW(lcid_en, week_id, NULL, 0);
+ week = SysAllocStringLen(NULL, size);
+ if(!week)
+ return E_OUTOFMEMORY;
+ GetLocaleInfoW(lcid_en, week_id, week, size);
+ len += size-1;
+
+ month_id = month_ids[(int)month_from_time(time)];
+ size = GetLocaleInfoW(lcid_en, month_id, NULL, 0);
+ month = SysAllocStringLen(NULL, size);
+ if(!month) {
+ SysFreeString(week);
+ return E_OUTOFMEMORY;
+ }
+ GetLocaleInfoW(lcid_en, month_id, month, size);
+ len += size-1;
+
+ year = year_from_time(time);
+ if(year<0)
+ year = -year+1;
+ do {
+ year /= 10;
+ len++;
+ } while(year);
+
+ year = year_from_time(time);
+ if(year<0) {
+ formatAD = FALSE;
+ year = -year+1;
+ len += 5;
+ }
+
+ day = date_from_time(time);
+ do {
+ day /= 10;
+ len++;
+ } while(day);
+ day = date_from_time(time);
+
+ offset = date->bias +
+ daylight_saving_ta(time, date);
+
+ if(offset == 0) len -= 5;
+ else if(offset < 0) {
+ sign = '+';
+ offset = -offset;
+ }
+
+ date_str = SysAllocStringLen(NULL, len);
+ if(!date_str) {
+ SysFreeString(week);
+ SysFreeString(month);
+ return E_OUTOFMEMORY;
+ }
+
+ if(offset)
+ sprintfW(date_str, formatW, week, month, day,
+ (int)hour_from_time(time), (int)min_from_time(time),
+ (int)sec_from_time(time), sign, offset/60, offset%60,
+ year, formatAD?ADW:BCW);
+ else
+ sprintfW(date_str, formatUTCW, week, month, day,
+ (int)hour_from_time(time), (int)min_from_time(time),
+ (int)sec_from_time(time), year, formatAD?ADW:BCW);
+
+ SysFreeString(week);
+ SysFreeString(month);
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = date_str;
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.1.5 */
static HRESULT Date_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ static const WCHAR NaNW[] = { 'N','a','N',0 };
+ SYSTEMTIME st;
+ DateInstance *date;
+ BSTR date_str;
+ int date_len, time_len;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ date = (DateInstance*)dispex;
+
+ if(isnan(date->time)) {
+ if(retv) {
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = SysAllocString(NaNW);
+ if(!V_BSTR(retv))
+ return E_OUTOFMEMORY;
+ }
+ return S_OK;
+ }
+
+ st = create_systemtime(local_time(date->time, date));
+
+ if(st.wYear<1601 || st.wYear>9999)
+ return Date_toString(dispex, lcid, flags, dp, retv, ei, caller);
+
+ if(retv) {
+ date_len = GetDateFormatW(lcid, DATE_LONGDATE, &st, NULL, NULL, 0);
+ time_len = GetTimeFormatW(lcid, 0, &st, NULL, NULL, 0);
+ date_str = SysAllocStringLen(NULL, date_len+time_len-1);
+ if(!date_str)
+ return E_OUTOFMEMORY;
+ GetDateFormatW(lcid, DATE_LONGDATE, &st, NULL, date_str, date_len);
+ GetTimeFormatW(lcid, 0, &st, NULL, &date_str[date_len], time_len);
+ date_str[date_len-1] = ' ';
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = date_str;
+ }
+ return S_OK;
}
static HRESULT Date_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
@@ -135,39 +666,381 @@ static HRESULT Date_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
return E_NOTIMPL;
}
+/* ECMA-262 3rd Edition 15.9.5.42 */
static HRESULT Date_toUTCString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ static const WCHAR NaNW[] = { 'N','a','N',0 };
+ static const WCHAR formatADW[] = { '%','s',',',' ','%','d',' ','%','s',' ','%','d',' ',
+ '%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ','U','T','C',0 };
+ static const WCHAR formatBCW[] = { '%','s',',',' ','%','d',' ','%','s',' ','%','d',' ','B','.','C','.',' ',
+ '%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ','U','T','C',0 };
+
+ static const DWORD week_ids[] = { LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1,
+ LOCALE_SABBREVDAYNAME2, LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4,
+ LOCALE_SABBREVDAYNAME5, LOCALE_SABBREVDAYNAME6 };
+ static const DWORD month_ids[] = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2,
+ LOCALE_SABBREVMONTHNAME3, LOCALE_SABBREVMONTHNAME4,
+ LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6,
+ LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8,
+ LOCALE_SABBREVMONTHNAME9, LOCALE_SABBREVMONTHNAME10,
+ LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 };
+
+ BOOL formatAD = TRUE;
+ BSTR week, month;
+ DateInstance *date;
+ BSTR date_str;
+ int len, size, year, day;
+ DWORD lcid_en, week_id, month_id;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ date = (DateInstance*)dispex;
+
+ if(isnan(date->time)) {
+ if(retv) {
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = SysAllocString(NaNW);
+ if(!V_BSTR(retv))
+ return E_OUTOFMEMORY;
+ }
+ return S_OK;
+ }
+
+ if(retv) {
+ len = 17;
+
+ lcid_en = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
+
+ week_id = week_ids[(int)week_day(date->time)];
+ size = GetLocaleInfoW(lcid_en, week_id, NULL, 0);
+ week = SysAllocStringLen(NULL, size);
+ if(!week)
+ return E_OUTOFMEMORY;
+ GetLocaleInfoW(lcid_en, week_id, week, size);
+ len += size-1;
+
+ month_id = month_ids[(int)month_from_time(date->time)];
+ size = GetLocaleInfoW(lcid_en, month_id, NULL, 0);
+ month = SysAllocStringLen(NULL, size);
+ if(!month) {
+ SysFreeString(week);
+ return E_OUTOFMEMORY;
+ }
+ GetLocaleInfoW(lcid_en, month_id, month, size);
+ len += size-1;
+
+ year = year_from_time(date->time);
+ if(year<0)
+ year = -year+1;
+ do {
+ year /= 10;
+ len++;
+ } while(year);
+
+ year = year_from_time(date->time);
+ if(year<0) {
+ formatAD = FALSE;
+ year = -year+1;
+ len += 5;
+ }
+
+ day = date_from_time(date->time);
+ do {
+ day /= 10;
+ len++;
+ } while(day);
+ day = date_from_time(date->time);
+
+ date_str = SysAllocStringLen(NULL, len);
+ if(!date_str) {
+ SysFreeString(week);
+ SysFreeString(month);
+ return E_OUTOFMEMORY;
+ }
+ sprintfW(date_str, formatAD?formatADW:formatBCW, week, day, month, year,
+ (int)hour_from_time(date->time), (int)min_from_time(date->time),
+ (int)sec_from_time(date->time));
+
+ SysFreeString(week);
+ SysFreeString(month);
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = date_str;
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.3 */
static HRESULT Date_toDateString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ static const WCHAR NaNW[] = { 'N','a','N',0 };
+ static const WCHAR formatADW[] = { '%','s',' ','%','s',' ','%','d',' ','%','d',0 };
+ static const WCHAR formatBCW[] = { '%','s',' ','%','s',' ','%','d',' ','%','d',' ','B','.','C','.',0 };
+
+ static const DWORD week_ids[] = { LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1,
+ LOCALE_SABBREVDAYNAME2, LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4,
+ LOCALE_SABBREVDAYNAME5, LOCALE_SABBREVDAYNAME6 };
+ static const DWORD month_ids[] = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2,
+ LOCALE_SABBREVMONTHNAME3, LOCALE_SABBREVMONTHNAME4,
+ LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6,
+ LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8,
+ LOCALE_SABBREVMONTHNAME9, LOCALE_SABBREVMONTHNAME10,
+ LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 };
+
+ BOOL formatAD = TRUE;
+ BSTR week, month;
+ DateInstance *date;
+ BSTR date_str;
+ DOUBLE time;
+ int len, size, year, day;
+ DWORD lcid_en, week_id, month_id;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ date = (DateInstance*)dispex;
+
+ if(isnan(date->time)) {
+ if(retv) {
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = SysAllocString(NaNW);
+ if(!V_BSTR(retv))
+ return E_OUTOFMEMORY;
+ }
+ return S_OK;
+ }
+
+ time = local_time(date->time, date);
+
+ if(retv) {
+ len = 5;
+
+ lcid_en = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
+
+ week_id = week_ids[(int)week_day(time)];
+ size = GetLocaleInfoW(lcid_en, week_id, NULL, 0);
+ week = SysAllocStringLen(NULL, size);
+ if(!week)
+ return E_OUTOFMEMORY;
+ GetLocaleInfoW(lcid_en, week_id, week, size);
+ len += size-1;
+
+ month_id = month_ids[(int)month_from_time(time)];
+ size = GetLocaleInfoW(lcid_en, month_id, NULL, 0);
+ month = SysAllocStringLen(NULL, size);
+ if(!month) {
+ SysFreeString(week);
+ return E_OUTOFMEMORY;
+ }
+ GetLocaleInfoW(lcid_en, month_id, month, size);
+ len += size-1;
+
+ year = year_from_time(time);
+ if(year<0)
+ year = -year+1;
+ do {
+ year /= 10;
+ len++;
+ } while(year);
+
+ year = year_from_time(time);
+ if(year<0) {
+ formatAD = FALSE;
+ year = -year+1;
+ len += 5;
+ }
+
+ day = date_from_time(time);
+ do {
+ day /= 10;
+ len++;
+ } while(day);
+ day = date_from_time(time);
+
+ date_str = SysAllocStringLen(NULL, len);
+ if(!date_str) {
+ SysFreeString(week);
+ SysFreeString(month);
+ return E_OUTOFMEMORY;
+ }
+ sprintfW(date_str, formatAD?formatADW:formatBCW, week, month, day, year);
+
+ SysFreeString(week);
+ SysFreeString(month);
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = date_str;
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.4 */
static HRESULT Date_toTimeString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ static const WCHAR NaNW[] = { 'N','a','N',0 };
+ static const WCHAR formatW[] = { '%','0','2','d',':','%','0','2','d',':','%','0','2','d',
+ ' ','U','T','C','%','c','%','0','2','d','%','0','2','d',0 };
+ static const WCHAR formatUTCW[] = { '%','0','2','d',':','%','0','2','d',
+ ':','%','0','2','d',' ','U','T','C',0 };
+ DateInstance *date;
+ BSTR date_str;
+ DOUBLE time;
+ WCHAR sign;
+ int offset;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ date = (DateInstance*)dispex;
+
+ if(isnan(date->time)) {
+ if(retv) {
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = SysAllocString(NaNW);
+ if(!V_BSTR(retv))
+ return E_OUTOFMEMORY;
+ }
+ return S_OK;
+ }
+
+ time = local_time(date->time, date);
+
+ if(retv) {
+ date_str = SysAllocStringLen(NULL, 17);
+ if(!date_str)
+ return E_OUTOFMEMORY;
+
+ offset = date->bias +
+ daylight_saving_ta(time, date);
+
+ if(offset < 0) {
+ sign = '+';
+ offset = -offset;
+ }
+ else sign = '-';
+
+ if(offset)
+ sprintfW(date_str, formatW, (int)hour_from_time(time),
+ (int)min_from_time(time), (int)sec_from_time(time),
+ sign, offset/60, offset%60);
+ else
+ sprintfW(date_str, formatUTCW, (int)hour_from_time(time),
+ (int)min_from_time(time), (int)sec_from_time(time));
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = date_str;
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.6 */
static HRESULT Date_toLocaleDateString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ static const WCHAR NaNW[] = { 'N','a','N',0 };
+ SYSTEMTIME st;
+ DateInstance *date;
+ BSTR date_str;
+ int len;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ date = (DateInstance*)dispex;
+
+ if(isnan(date->time)) {
+ if(retv) {
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = SysAllocString(NaNW);
+ if(!V_BSTR(retv))
+ return E_OUTOFMEMORY;
+ }
+ return S_OK;
+ }
+
+ st = create_systemtime(local_time(date->time, date));
+
+ if(st.wYear<1601 || st.wYear>9999)
+ return Date_toDateString(dispex, lcid, flags, dp, retv, ei, caller);
+
+ if(retv) {
+ len = GetDateFormatW(lcid, DATE_LONGDATE, &st, NULL, NULL, 0);
+ date_str = SysAllocStringLen(NULL, len);
+ if(!date_str)
+ return E_OUTOFMEMORY;
+ GetDateFormatW(lcid, DATE_LONGDATE, &st, NULL, date_str, len);
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = date_str;
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.7 */
static HRESULT Date_toLocaleTimeString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ static const WCHAR NaNW[] = { 'N','a','N',0 };
+ SYSTEMTIME st;
+ DateInstance *date;
+ BSTR date_str;
+ int len;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ date = (DateInstance*)dispex;
+
+ if(isnan(date->time)) {
+ if(retv) {
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = SysAllocString(NaNW);
+ if(!V_BSTR(retv))
+ return E_OUTOFMEMORY;
+ }
+ return S_OK;
+ }
+
+ st = create_systemtime(local_time(date->time, date));
+
+ if(st.wYear<1601 || st.wYear>9999)
+ return Date_toTimeString(dispex, lcid, flags, dp, retv, ei, caller);
+
+ if(retv) {
+ len = GetTimeFormatW(lcid, 0, &st, NULL, NULL, 0);
+ date_str = SysAllocStringLen(NULL, len);
+ if(!date_str)
+ return E_OUTOFMEMORY;
+ GetTimeFormatW(lcid, 0, &st, NULL, date_str, len);
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = date_str;
+ }
+ return S_OK;
}
/* ECMA-262 3rd Edition 15.9.5.9 */
@@ -188,125 +1061,330 @@ static HRESULT Date_getTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.10 */
static HRESULT Date_getFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ DOUBLE time = local_time(date->time, date);
+
+ num_set_val(retv, year_from_time(time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.11 */
static HRESULT Date_getUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ num_set_val(retv, year_from_time(date->time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.12 */
static HRESULT Date_getMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ DOUBLE time = local_time(date->time, date);
+
+ num_set_val(retv, month_from_time(time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.13 */
static HRESULT Date_getUTCMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ num_set_val(retv, month_from_time(date->time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.14 */
static HRESULT Date_getDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ DOUBLE time = local_time(date->time, date);
+
+ num_set_val(retv, date_from_time(time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.15 */
static HRESULT Date_getUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ num_set_val(retv, date_from_time(date->time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.16 */
static HRESULT Date_getDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ DOUBLE time = local_time(date->time, date);
+
+ num_set_val(retv, week_day(time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.17 */
static HRESULT Date_getUTCDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ num_set_val(retv, week_day(date->time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.18 */
static HRESULT Date_getHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ DOUBLE time = local_time(date->time, date);
+
+ num_set_val(retv, hour_from_time(time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.19 */
static HRESULT Date_getUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ num_set_val(retv, hour_from_time(date->time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.20 */
static HRESULT Date_getMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ DOUBLE time = local_time(date->time, date);
+
+ num_set_val(retv, min_from_time(time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.21 */
static HRESULT Date_getUTCMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ num_set_val(retv, min_from_time(date->time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.22 */
static HRESULT Date_getSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ DOUBLE time = local_time(date->time, date);
+
+ num_set_val(retv, sec_from_time(time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.23 */
static HRESULT Date_getUTCSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ num_set_val(retv, sec_from_time(date->time));
+ }
+ return S_OK;
}
-static HRESULT Date_getMiliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+/* ECMA-262 3rd Edition 15.9.5.24 */
+static HRESULT Date_getMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ DOUBLE time = local_time(date->time, date);
+
+ num_set_val(retv, ms_from_time(time));
+ }
+ return S_OK;
}
-static HRESULT Date_getUTCMiliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+/* ECMA-262 3rd Edition 15.9.5.25 */
+static HRESULT Date_getUTCMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ num_set_val(retv, ms_from_time(date->time));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.26 */
static HRESULT Date_getTimezoneOffset(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ num_set_val(retv, floor(
+ (date->time-local_time(date->time, date))/MS_PER_MINUTE));
+ }
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.27 */
static HRESULT Date_setTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
@@ -322,6 +1400,7 @@ static HRESULT Date_setTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
}
if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
if(retv) num_set_nan(retv);
return S_OK;
}
@@ -339,102 +1418,696 @@ static HRESULT Date_setTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
return S_OK;
}
-static HRESULT Date_setMiliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+/* ECMA-262 3rd Edition 15.9.5.28 */
+static HRESULT Date_setMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ date = (DateInstance*)dispex;
+ t = local_time(date->time, date);
+ t = make_date(day(t), make_time(hour_from_time(t), min_from_time(t),
+ sec_from_time(t), num_val(&v)));
+ date->time = time_clip(utc(t, date));
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
-static HRESULT Date_setUTCMiliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+/* ECMA-262 3rd Edition 15.9.5.29 */
+static HRESULT Date_setUTCMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ date = (DateInstance*)dispex;
+ t = date->time;
+ t = make_date(day(t), make_time(hour_from_time(t), min_from_time(t),
+ sec_from_time(t), num_val(&v)));
+ date->time = time_clip(t);
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.30 */
static HRESULT Date_setSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t, sec, ms;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ date = (DateInstance*)dispex;
+ t = local_time(date->time, date);
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ sec = num_val(&v);
+
+ if(arg_cnt(dp) > 1) {
+ hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ ms = num_val(&v);
+ }
+ else ms = ms_from_time(t);
+
+ t = make_date(day(t), make_time(hour_from_time(t),
+ min_from_time(t), sec, ms));
+ date->time = time_clip(utc(t, date));
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.31 */
static HRESULT Date_setUTCSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t, sec, ms;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ date = (DateInstance*)dispex;
+ t = date->time;
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ sec = num_val(&v);
+
+ if(arg_cnt(dp) > 1) {
+ hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ ms = num_val(&v);
+ }
+ else ms = ms_from_time(t);
+
+ t = make_date(day(t), make_time(hour_from_time(t),
+ min_from_time(t), sec, ms));
+ date->time = time_clip(t);
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.33 */
static HRESULT Date_setMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t, min, sec, ms;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ date = (DateInstance*)dispex;
+ t = local_time(date->time, date);
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ min = num_val(&v);
+
+ if(arg_cnt(dp) > 1) {
+ hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ sec = num_val(&v);
+ }
+ else sec = sec_from_time(t);
+
+ if(arg_cnt(dp) > 2) {
+ hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ ms = num_val(&v);
+ }
+ else ms = ms_from_time(t);
+
+ t = make_date(day(t), make_time(hour_from_time(t),
+ min, sec, ms));
+ date->time = time_clip(utc(t, date));
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.34 */
static HRESULT Date_setUTCMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t, min, sec, ms;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ date = (DateInstance*)dispex;
+ t = date->time;
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ min = num_val(&v);
+
+ if(arg_cnt(dp) > 1) {
+ hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ sec = num_val(&v);
+ }
+ else sec = sec_from_time(t);
+
+ if(arg_cnt(dp) > 2) {
+ hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ ms = num_val(&v);
+ }
+ else ms = ms_from_time(t);
+
+ t = make_date(day(t), make_time(hour_from_time(t),
+ min, sec, ms));
+ date->time = time_clip(t);
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.35 */
static HRESULT Date_setHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t, hour, min, sec, ms;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ date = (DateInstance*)dispex;
+ t = local_time(date->time, date);
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ hour = num_val(&v);
+
+ if(arg_cnt(dp) > 1) {
+ hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ min = num_val(&v);
+ }
+ else min = min_from_time(t);
+
+ if(arg_cnt(dp) > 2) {
+ hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ sec = num_val(&v);
+ }
+ else sec = sec_from_time(t);
+
+ if(arg_cnt(dp) > 3) {
+ hres = to_number(dispex->ctx, get_arg(dp, 3), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ ms = num_val(&v);
+ }
+ else ms = ms_from_time(t);
+
+ t = make_date(day(t), make_time(hour, min, sec, ms));
+ date->time = time_clip(utc(t, date));
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.36 */
static HRESULT Date_setUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t, hour, min, sec, ms;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ date = (DateInstance*)dispex;
+ t = date->time;
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ hour = num_val(&v);
+
+ if(arg_cnt(dp) > 1) {
+ hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ min = num_val(&v);
+ }
+ else min = min_from_time(t);
+
+ if(arg_cnt(dp) > 2) {
+ hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ sec = num_val(&v);
+ }
+ else sec = sec_from_time(t);
+
+ if(arg_cnt(dp) > 3) {
+ hres = to_number(dispex->ctx, get_arg(dp, 3), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ ms = num_val(&v);
+ }
+ else ms = ms_from_time(t);
+
+ t = make_date(day(t), make_time(hour, min, sec, ms));
+ date->time = time_clip(t);
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.36 */
static HRESULT Date_setDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ date = (DateInstance*)dispex;
+ t = local_time(date->time, date);
+ t = make_date(make_day(year_from_time(t), month_from_time(t),
+ num_val(&v)), time_within_day(t));
+ date->time = time_clip(utc(t, date));
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.37 */
static HRESULT Date_setUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ date = (DateInstance*)dispex;
+ t = date->time;
+ t = make_date(make_day(year_from_time(t), month_from_time(t),
+ num_val(&v)), time_within_day(t));
+ date->time = time_clip(t);
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.38 */
static HRESULT Date_setMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t, month, ddate;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ date = (DateInstance*)dispex;
+ t = local_time(date->time, date);
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ month = num_val(&v);
+
+ if(arg_cnt(dp) > 1) {
+ hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ ddate = num_val(&v);
+ }
+ else ddate = date_from_time(t);
+
+ t = make_date(make_day(year_from_time(t), month, ddate),
+ time_within_day(t));
+ date->time = time_clip(utc(t, date));
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.39 */
static HRESULT Date_setUTCMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t, month, ddate;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ date = (DateInstance*)dispex;
+ t = date->time;
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ month = num_val(&v);
+
+ if(arg_cnt(dp) > 1) {
+ hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ ddate = num_val(&v);
+ }
+ else ddate = date_from_time(t);
+
+ t = make_date(make_day(year_from_time(t), month, ddate),
+ time_within_day(t));
+ date->time = time_clip(t);
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.40 */
static HRESULT Date_setFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t, year, month, ddate;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ date = (DateInstance*)dispex;
+ t = local_time(date->time, date);
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ year = num_val(&v);
+
+ if(arg_cnt(dp) > 1) {
+ hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ month = num_val(&v);
+ }
+ else month = month_from_time(t);
+
+ if(arg_cnt(dp) > 2) {
+ hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ ddate = num_val(&v);
+ }
+ else ddate = date_from_time(t);
+
+ t = make_date(make_day(year, month, ddate), time_within_day(t));
+ date->time = time_clip(utc(t, date));
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.5.41 */
static HRESULT Date_setUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+ DateInstance *date;
+ DOUBLE t, year, month, ddate;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE)) {
+ FIXME("throw TypeError\n");
+ return E_FAIL;
+ }
+
+ if(!arg_cnt(dp)) {
+ FIXME("throw ArgumentNotOptional\n");
+ if(retv) num_set_nan(retv);
+ return S_OK;
+ }
+
+ date = (DateInstance*)dispex;
+ t = date->time;
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ year = num_val(&v);
+
+ if(arg_cnt(dp) > 1) {
+ hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ month = num_val(&v);
+ }
+ else month = month_from_time(t);
+
+ if(arg_cnt(dp) > 2) {
+ hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &v);
+ if(FAILED(hres))
+ return hres;
+ ddate = num_val(&v);
+ }
+ else ddate = date_from_time(t);
+
+ t = make_date(make_day(year, month, ddate), time_within_day(t));
+ date->time = time_clip(t);
+
+ if(retv)
+ num_set_val(retv, date->time);
+
+ return S_OK;
}
static HRESULT Date_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
@@ -449,7 +2122,7 @@ static const builtin_prop_t Date_props[] = {
{getDayW, Date_getDay, PROPF_METHOD},
{getFullYearW, Date_getFullYear, PROPF_METHOD},
{getHoursW, Date_getHours, PROPF_METHOD},
- {getMilisecondsW, Date_getMiliseconds, PROPF_METHOD},
+ {getMillisecondsW, Date_getMilliseconds, PROPF_METHOD},
{getMinutesW, Date_getMinutes, PROPF_METHOD},
{getMonthW, Date_getMonth, PROPF_METHOD},
{getSecondsW, Date_getSeconds, PROPF_METHOD},
@@ -459,7 +2132,7 @@ static const builtin_prop_t Date_props[] = {
{getUTCDayW, Date_getUTCDay, PROPF_METHOD},
{getUTCFullYearW, Date_getUTCFullYear, PROPF_METHOD},
{getUTCHoursW, Date_getUTCHours, PROPF_METHOD},
- {getUTCMilisecondsW, Date_getUTCMiliseconds, PROPF_METHOD},
+ {getUTCMillisecondsW, Date_getUTCMilliseconds, PROPF_METHOD},
{getUTCMinutesW, Date_getUTCMinutes, PROPF_METHOD},
{getUTCMonthW, Date_getUTCMonth, PROPF_METHOD},
{getUTCSecondsW, Date_getUTCSeconds, PROPF_METHOD},
@@ -469,7 +2142,7 @@ static const builtin_prop_t Date_props[] = {
{setDateW, Date_setDate, PROPF_METHOD},
{setFullYearW, Date_setFullYear, PROPF_METHOD},
{setHoursW, Date_setHours, PROPF_METHOD},
- {setMilisecondsW, Date_setMiliseconds, PROPF_METHOD},
+ {setMillisecondsW, Date_setMilliseconds, PROPF_METHOD},
{setMinutesW, Date_setMinutes, PROPF_METHOD},
{setMonthW, Date_setMonth, PROPF_METHOD},
{setSecondsW, Date_setSeconds, PROPF_METHOD},
@@ -477,7 +2150,7 @@ static const builtin_prop_t Date_props[] = {
{setUTCDateW, Date_setUTCDate, PROPF_METHOD},
{setUTCFullYearW, Date_setUTCFullYear, PROPF_METHOD},
{setUTCHoursW, Date_setUTCHours, PROPF_METHOD},
- {setUTCMilisecondsW, Date_setUTCMiliseconds, PROPF_METHOD},
+ {setUTCMillisecondsW, Date_setUTCMilliseconds, PROPF_METHOD},
{setUTCMinutesW, Date_setUTCMinutes, PROPF_METHOD},
{setUTCMonthW, Date_setUTCMonth, PROPF_METHOD},
{setUTCSecondsW, Date_setUTCSeconds, PROPF_METHOD},
@@ -523,11 +2196,113 @@ static HRESULT create_date(script_ctx_t *ctx, BOOL use_constr, DOUBLE time, Disp
date->time = time;
date->bias = tzi.Bias;
+ date->standardDate = tzi.StandardDate;
+ date->standardBias = tzi.StandardBias;
+ date->daylightDate = tzi.DaylightDate;
+ date->daylightBias = tzi.DaylightBias;
*ret = &date->dispex;
return S_OK;
}
+static HRESULT DateConstr_parse(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+ VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ FIXME("\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT DateConstr_UTC(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+ VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ VARIANT year, month, vdate, hours, minutes, seconds, ms;
+ DOUBLE y;
+ int arg_no = arg_cnt(dp);
+ HRESULT hres;
+
+ TRACE("\n");
+
+ if(arg_no>0) {
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &year);
+ if(FAILED(hres))
+ return hres;
+ y = num_val(&year);
+ if(0<=y && y<=99)
+ y += 1900;
+ }
+ else y = 1900;
+
+ if(arg_no>1) {
+ hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &month);
+ if(FAILED(hres))
+ return hres;
+ }
+ else {
+ V_VT(&month) = VT_R8;
+ V_R8(&month) = 0;
+ }
+
+ if(arg_no>2) {
+ hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &vdate);
+ if(FAILED(hres))
+ return hres;
+ }
+ else {
+ V_VT(&vdate) = VT_R8;
+ V_R8(&vdate) = 1;
+ }
+
+ if(arg_no>3) {
+ hres = to_number(dispex->ctx, get_arg(dp, 3), ei, &hours);
+ if(FAILED(hres))
+ return hres;
+ }
+ else {
+ V_VT(&hours) = VT_R8;
+ V_R8(&hours) = 0;
+ }
+
+ if(arg_no>4) {
+ hres = to_number(dispex->ctx, get_arg(dp, 4), ei, &minutes);
+ if(FAILED(hres))
+ return hres;
+ }
+ else {
+ V_VT(&minutes) = VT_R8;
+ V_R8(&minutes) = 0;
+ }
+
+ if(arg_no>5) {
+ hres = to_number(dispex->ctx, get_arg(dp, 5), ei, &seconds);
+ if(FAILED(hres))
+ return hres;
+ }
+ else {
+ V_VT(&seconds) = VT_R8;
+ V_R8(&seconds) = 0;
+ }
+
+ if(arg_no>6) {
+ hres = to_number(dispex->ctx, get_arg(dp, 6), ei, &ms);
+ if(FAILED(hres))
+ return hres;
+ }
+ else {
+ V_VT(&ms) = VT_R8;
+ V_R8(&ms) = 0;
+ }
+
+ if(retv) {
+ V_VT(retv) = VT_R8;
+ V_R8(retv) = time_clip(make_date(
+ make_day(y, num_val(&month), num_val(&vdate)),
+ make_time(num_val(&hours), num_val(&minutes),
+ num_val(&seconds), num_val(&ms))));
+ }
+
+ return S_OK;
+}
+
static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
@@ -578,9 +2353,20 @@ static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
break;
}
- default:
- FIXME("unimplemented argcnt %d\n", arg_cnt(dp));
- return E_NOTIMPL;
+ /* ECMA-262 3rd Edition 15.9.3.1 */
+ default: {
+ VARIANT ret_date;
+ DateInstance *di;
+
+ DateConstr_UTC(dispex, lcid, flags, dp, &ret_date, ei, sp);
+
+ hres = create_date(dispex->ctx, TRUE, num_val(&ret_date), &date);
+ if(FAILED(hres))
+ return hres;
+
+ di = (DateInstance*)date;
+ di->time = utc(di->time, di);
+ }
}
V_VT(retv) = VT_DISPATCH;
@@ -595,6 +2381,20 @@ static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
return S_OK;
}
+static const builtin_prop_t DateConstr_props[] = {
+ {UTCW, DateConstr_UTC, PROPF_METHOD},
+ {parseW, DateConstr_parse, PROPF_METHOD}
+};
+
+static const builtin_info_t DateConstr_info = {
+ JSCLASS_FUNCTION,
+ {NULL, Function_value, 0},
+ sizeof(DateConstr_props)/sizeof(*DateConstr_props),
+ DateConstr_props,
+ NULL,
+ NULL
+};
+
HRESULT create_date_constr(script_ctx_t *ctx, DispatchEx **ret)
{
DispatchEx *date;
@@ -604,7 +2404,7 @@ HRESULT create_date_constr(script_ctx_t *ctx, DispatchEx **ret)
if(FAILED(hres))
return hres;
- hres = create_builtin_function(ctx, DateConstr_value, PROPF_CONSTR, date, ret);
+ hres = create_builtin_function(ctx, DateConstr_value, &DateConstr_info, PROPF_CONSTR, date, ret);
jsdisp_release(date);
return hres;
diff --git a/reactos/dll/win32/jscript/dispex.c b/reactos/dll/win32/jscript/dispex.c
index 86410af4ec7..a387ecdbff6 100644
--- a/reactos/dll/win32/jscript/dispex.c
+++ b/reactos/dll/win32/jscript/dispex.c
@@ -293,7 +293,7 @@ static HRESULT prop_get(DispatchEx *This, dispex_prop_t *prop, LCID lcid, DISPPA
case PROP_BUILTIN:
if(prop->u.p->flags & PROPF_METHOD) {
DispatchEx *obj;
- hres = create_builtin_function(This->ctx, prop->u.p->invoke, prop->u.p->flags, NULL, &obj);
+ hres = create_builtin_function(This->ctx, prop->u.p->invoke, NULL, prop->u.p->flags, NULL, &obj);
if(FAILED(hres))
break;
diff --git a/reactos/dll/win32/jscript/function.c b/reactos/dll/win32/jscript/function.c
index 314d58558e8..d780aeebde1 100644
--- a/reactos/dll/win32/jscript/function.c
+++ b/reactos/dll/win32/jscript/function.c
@@ -341,7 +341,7 @@ static HRESULT Function_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags,
return E_NOTIMPL;
}
-static HRESULT Function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+HRESULT Function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
FunctionInstance *function;
@@ -435,7 +435,8 @@ static HRESULT FunctionProt_value(DispatchEx *dispex, LCID lcid, WORD flags, DIS
return E_NOTIMPL;
}
-static HRESULT create_function(script_ctx_t *ctx, DWORD flags, BOOL funcprot, DispatchEx *prototype, FunctionInstance **ret)
+static HRESULT create_function(script_ctx_t *ctx, const builtin_info_t *builtin_info, DWORD flags,
+ BOOL funcprot, DispatchEx *prototype, FunctionInstance **ret)
{
FunctionInstance *function;
HRESULT hres;
@@ -446,6 +447,8 @@ static HRESULT create_function(script_ctx_t *ctx, DWORD flags, BOOL funcprot, Di
if(funcprot)
hres = init_dispex(&function->dispex, ctx, &Function_info, prototype);
+ else if(builtin_info)
+ hres = init_dispex_from_constr(&function->dispex, ctx, builtin_info, ctx->function_constr);
else
hres = init_dispex_from_constr(&function->dispex, ctx, &Function_info, ctx->function_constr);
if(FAILED(hres))
@@ -473,13 +476,13 @@ static HRESULT create_function(script_ctx_t *ctx, DWORD flags, BOOL funcprot, Di
return S_OK;
}
-HRESULT create_builtin_function(script_ctx_t *ctx, builtin_invoke_t value_proc, DWORD flags,
- DispatchEx *prototype, DispatchEx **ret)
+HRESULT create_builtin_function(script_ctx_t *ctx, builtin_invoke_t value_proc,
+ const builtin_info_t *builtin_info, DWORD flags, DispatchEx *prototype, DispatchEx **ret)
{
FunctionInstance *function;
HRESULT hres;
- hres = create_function(ctx, flags, FALSE, prototype, &function);
+ hres = create_function(ctx, builtin_info, flags, FALSE, prototype, &function);
if(FAILED(hres))
return hres;
@@ -502,7 +505,7 @@ HRESULT create_source_function(parser_ctx_t *ctx, parameter_t *parameters, sourc
if(FAILED(hres))
return hres;
- hres = create_function(ctx->script, PROPF_CONSTR, FALSE, prototype, &function);
+ hres = create_function(ctx->script, NULL, PROPF_CONSTR, FALSE, prototype, &function);
jsdisp_release(prototype);
if(FAILED(hres))
return hres;
@@ -534,13 +537,13 @@ HRESULT init_function_constr(script_ctx_t *ctx)
FunctionInstance *prot, *constr;
HRESULT hres;
- hres = create_function(ctx, PROPF_CONSTR, TRUE, NULL, &prot);
+ hres = create_function(ctx, NULL, PROPF_CONSTR, TRUE, NULL, &prot);
if(FAILED(hres))
return hres;
prot->value_proc = FunctionProt_value;
- hres = create_function(ctx, PROPF_CONSTR, TRUE, &prot->dispex, &constr);
+ hres = create_function(ctx, NULL, PROPF_CONSTR, TRUE, &prot->dispex, &constr);
jsdisp_release(&prot->dispex);
if(FAILED(hres))
return hres;
diff --git a/reactos/dll/win32/jscript/jscript.h b/reactos/dll/win32/jscript/jscript.h
index 6cf3535c92f..7a4158c631f 100644
--- a/reactos/dll/win32/jscript/jscript.h
+++ b/reactos/dll/win32/jscript/jscript.h
@@ -132,7 +132,10 @@ HRESULT jsdisp_propget_name(DispatchEx*,LPCWSTR,LCID,VARIANT*,jsexcept_t*,IServi
HRESULT jsdisp_propget_idx(DispatchEx*,DWORD,LCID,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_get_id(DispatchEx*,const WCHAR*,DWORD,DISPID*);
-HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,DWORD,DispatchEx*,DispatchEx**);
+HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const builtin_info_t*,DWORD,
+ DispatchEx*,DispatchEx**);
+HRESULT Function_value(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
+
HRESULT create_object(script_ctx_t*,DispatchEx*,DispatchEx**);
HRESULT create_math(script_ctx_t*,DispatchEx**);
diff --git a/reactos/dll/win32/jscript/number.c b/reactos/dll/win32/jscript/number.c
index d909cdb851a..d6591d06317 100644
--- a/reactos/dll/win32/jscript/number.c
+++ b/reactos/dll/win32/jscript/number.c
@@ -263,7 +263,7 @@ HRESULT create_number_constr(script_ctx_t *ctx, DispatchEx **ret)
return hres;
V_VT(&number->num) = VT_I4;
- hres = create_builtin_function(ctx, NumberConstr_value, PROPF_CONSTR, &number->dispex, ret);
+ hres = create_builtin_function(ctx, NumberConstr_value, NULL, PROPF_CONSTR, &number->dispex, ret);
jsdisp_release(&number->dispex);
return hres;
diff --git a/reactos/dll/win32/jscript/object.c b/reactos/dll/win32/jscript/object.c
index 02d80de02fd..9474bc4f8bc 100644
--- a/reactos/dll/win32/jscript/object.c
+++ b/reactos/dll/win32/jscript/object.c
@@ -154,7 +154,7 @@ HRESULT create_object_constr(script_ctx_t *ctx, DispatchEx **ret)
if(FAILED(hres))
return hres;
- hres = create_builtin_function(ctx, ObjectConstr_value, PROPF_CONSTR, object, ret);
+ hres = create_builtin_function(ctx, ObjectConstr_value, NULL, PROPF_CONSTR, object, ret);
jsdisp_release(object);
return hres;
diff --git a/reactos/dll/win32/jscript/regexp.c b/reactos/dll/win32/jscript/regexp.c
index fe552b10778..0acc47815c8 100644
--- a/reactos/dll/win32/jscript/regexp.c
+++ b/reactos/dll/win32/jscript/regexp.c
@@ -3685,7 +3685,7 @@ HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx **ret)
if(FAILED(hres))
return hres;
- hres = create_builtin_function(ctx, RegExpConstr_value, PROPF_CONSTR, ®exp->dispex, ret);
+ hres = create_builtin_function(ctx, RegExpConstr_value, NULL, PROPF_CONSTR, ®exp->dispex, ret);
jsdisp_release(®exp->dispex);
return hres;
diff --git a/reactos/dll/win32/jscript/string.c b/reactos/dll/win32/jscript/string.c
index 82c1043490e..9f2ab9b2f3a 100644
--- a/reactos/dll/win32/jscript/string.c
+++ b/reactos/dll/win32/jscript/string.c
@@ -1370,7 +1370,7 @@ HRESULT create_string_constr(script_ctx_t *ctx, DispatchEx **ret)
if(FAILED(hres))
return hres;
- hres = create_builtin_function(ctx, StringConstr_value, PROPF_CONSTR, &string->dispex, ret);
+ hres = create_builtin_function(ctx, StringConstr_value, NULL, PROPF_CONSTR, &string->dispex, ret);
jsdisp_release(&string->dispex);
return hres;
diff --git a/reactos/dll/win32/kernel32/file/backup.c b/reactos/dll/win32/kernel32/file/backup.c
index 7d0298ef133..0928e74a062 100644
--- a/reactos/dll/win32/kernel32/file/backup.c
+++ b/reactos/dll/win32/kernel32/file/backup.c
@@ -32,7 +32,8 @@ BackupRead (
LPVOID * lpContext
)
{
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ UNIMPLEMENTED;
+ SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
}
@@ -51,7 +52,8 @@ BackupSeek (
LPVOID * lpContext
)
{
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ UNIMPLEMENTED;
+ SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
}
@@ -71,7 +73,8 @@ BackupWrite (
LPVOID * lpContext
)
{
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ UNIMPLEMENTED;
+ SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
}
diff --git a/reactos/dll/win32/kernel32/file/dir.c b/reactos/dll/win32/kernel32/file/dir.c
index bbf9929ceeb..b3aa6994a2c 100644
--- a/reactos/dll/win32/kernel32/file/dir.c
+++ b/reactos/dll/win32/kernel32/file/dir.c
@@ -954,180 +954,102 @@ Cleanup:
}
+/***********************************************************************
+ * ContainsPath (Wine name: contains_pathW)
+ *
+ * Check if the file name contains a path; helper for SearchPathW.
+ * A relative path is not considered a path unless it starts with ./ or ../
+ */
+static
+BOOL
+ContainsPath(LPCWSTR name)
+{
+ if (RtlDetermineDosPathNameType_U(name) != RtlPathTypeRelative) return TRUE;
+ if (name[0] != '.') return FALSE;
+ if (name[1] == '/' || name[1] == '\\') return TRUE;
+ return (name[1] == '.' && (name[2] == '/' || name[2] == '\\'));
+}
+
+
/*
* @implemented
*/
DWORD
WINAPI
-SearchPathW (
- LPCWSTR lpPath,
- LPCWSTR lpFileName,
- LPCWSTR lpExtension,
- DWORD nBufferLength,
- LPWSTR lpBuffer,
- LPWSTR *lpFilePart
- )
-/*
- * FUNCTION: Searches for the specified file
- * ARGUMENTS:
- * lpPath = Points to a null-terminated string that specified the
- * path to be searched. If this parameters is NULL then
- * the following directories are searched
- * The directory from which the application loaded
- * The current directory
- * The system directory
- * The 16-bit system directory
- * The windows directory
- * The directories listed in the PATH environment
- * variable
- * lpFileName = Specifies the filename to search for
- * lpExtension = Points to the null-terminated string that specifies
- * an extension to be added to the filename when
- * searching for the file. The first character of the
- * filename extension must be a period (.). The
- * extension is only added if the specified filename
- * doesn't end with an extension
- *
- * If the filename extension is not required or if the
- * filename contains an extension, this parameters can be
- * NULL
- * nBufferLength = The length in characters of the buffer for output
- * lpBuffer = Points to the buffer for the valid path and filename of
- * file found
- * lpFilePart = Points to the last component of the valid path and
- * filename
- * RETURNS: On success, the length, in characters, of the string copied to the
- * buffer
- * On failure, zero.
- */
+SearchPathW(LPCWSTR lpPath,
+ LPCWSTR lpFileName,
+ LPCWSTR lpExtension,
+ DWORD nBufferLength,
+ LPWSTR lpBuffer,
+ LPWSTR *lpFilePart)
{
- DWORD retCode = 0;
- ULONG pos, len;
- PWCHAR EnvironmentBufferW = NULL;
- PWCHAR AppPathW = NULL;
- WCHAR Buffer;
- BOOL HasExtension;
- LPCWSTR p;
- PWCHAR Name;
+ DWORD ret = 0;
- TRACE("SearchPath\n");
+ /* If the name contains an explicit path, ignore the path */
+ if (ContainsPath(lpFileName))
+ {
+ /* try first without extension */
+ if (RtlDoesFileExists_U(lpFileName))
+ return GetFullPathNameW(lpFileName, nBufferLength, lpBuffer, lpFilePart);
- HasExtension = FALSE;
- p = lpFileName + wcslen(lpFileName);
- while (lpFileName < p &&
- L'\\' != *(p - 1) &&
- L'/' != *(p - 1) &&
- L':' != *(p - 1))
+ if (lpExtension)
{
- HasExtension = HasExtension || L'.' == *(p - 1);
- p--;
+ LPCWSTR p = wcsrchr(lpFileName, '.');
+ if (p && !strchr((const char *)p, '/') && !wcschr( p, '\\' ))
+ lpExtension = NULL; /* Ignore the specified extension */
}
- if (lpFileName < p)
+
+ /* Allocate a buffer for the file name and extension */
+ if (lpExtension)
{
- if (HasExtension || NULL == lpExtension)
- {
- Name = (PWCHAR) lpFileName;
- }
- else
- {
- Name = RtlAllocateHeap(GetProcessHeap(),
- HEAP_GENERATE_EXCEPTIONS,
- (wcslen(lpFileName) + wcslen(lpExtension) + 1)
- * sizeof(WCHAR));
- if (NULL == Name)
- {
- SetLastError(ERROR_OUTOFMEMORY);
- return 0;
- }
- wcscat(wcscpy(Name, lpFileName), lpExtension);
- }
- if (RtlDoesFileExists_U(Name))
- {
- retCode = RtlGetFullPathName_U (Name,
- nBufferLength * sizeof(WCHAR),
- lpBuffer,
- lpFilePart);
- }
- if (Name != lpFileName)
- {
- RtlFreeHeap(GetProcessHeap(), 0, Name);
- }
+ LPWSTR tmp;
+ DWORD len = wcslen(lpFileName) + wcslen(lpExtension);
+
+ if (!(tmp = RtlAllocateHeap(RtlGetProcessHeap(), 0, (len + 1) * sizeof(WCHAR))))
+ {
+ SetLastError(ERROR_OUTOFMEMORY);
+ return 0;
+ }
+ wcscpy(tmp, lpFileName);
+ wcscat(tmp, lpExtension);
+ if (RtlDoesFileExists_U(tmp))
+ ret = GetFullPathNameW(tmp, nBufferLength, lpBuffer, lpFilePart);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, tmp);
+ }
+ }
+ else if (lpPath && lpPath[0]) /* search in the specified path */
+ {
+ ret = RtlDosSearchPath_U(lpPath,
+ lpFileName,
+ lpExtension,
+ nBufferLength * sizeof(WCHAR),
+ lpBuffer,
+ lpFilePart) / sizeof(WCHAR);
+ }
+ else /* search in the default path */
+ {
+ WCHAR *DllPath = GetDllLoadPath(NULL);
+
+ if (DllPath)
+ {
+ ret = RtlDosSearchPath_U(DllPath,
+ lpFileName,
+ lpExtension,
+ nBufferLength * sizeof(WCHAR),
+ lpBuffer,
+ lpFilePart) / sizeof(WCHAR);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, DllPath);
}
else
{
- if (lpPath == NULL)
- {
-
- AppPathW = (PWCHAR) RtlAllocateHeap(RtlGetProcessHeap(),
- HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY,
- MAX_PATH * sizeof(WCHAR));
- if (AppPathW == NULL)
- {
- SetLastError(ERROR_OUTOFMEMORY);
- return 0;
- }
-
-
- wcscat (AppPathW, NtCurrentPeb()->ProcessParameters->ImagePathName.Buffer);
-
- len = wcslen (AppPathW);
-
- while (len && AppPathW[len - 1] != L'\\')
- len--;
-
- if (len) AppPathW[len-1] = L'\0';
-
- len = GetEnvironmentVariableW(L"PATH", &Buffer, 0);
- len += 1 + GetCurrentDirectoryW(0, &Buffer);
- len += 1 + GetSystemDirectoryW(&Buffer, 0);
- len += 1 + GetWindowsDirectoryW(&Buffer, 0);
- len += 1 + wcslen(AppPathW) * sizeof(WCHAR);
-
- EnvironmentBufferW = (PWCHAR) RtlAllocateHeap(RtlGetProcessHeap(),
- HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY,
- len * sizeof(WCHAR));
- if (EnvironmentBufferW == NULL)
- {
- RtlFreeHeap(RtlGetProcessHeap(), 0, AppPathW);
- SetLastError(ERROR_OUTOFMEMORY);
- return 0;
- }
-
- pos = GetCurrentDirectoryW(len, EnvironmentBufferW);
- EnvironmentBufferW[pos++] = L';';
- EnvironmentBufferW[pos] = 0;
- pos += GetSystemDirectoryW(&EnvironmentBufferW[pos], len - pos);
- EnvironmentBufferW[pos++] = L';';
- EnvironmentBufferW[pos] = 0;
- pos += GetWindowsDirectoryW(&EnvironmentBufferW[pos], len - pos);
- EnvironmentBufferW[pos++] = L';';
- EnvironmentBufferW[pos] = 0;
- pos += GetEnvironmentVariableW(L"PATH", &EnvironmentBufferW[pos], len - pos);
- EnvironmentBufferW[pos++] = L';';
- EnvironmentBufferW[pos] = 0;
- wcscat (EnvironmentBufferW, AppPathW);
-
- RtlFreeHeap (RtlGetProcessHeap (),
- 0,
- AppPathW);
-
- lpPath = EnvironmentBufferW;
-
- }
-
- retCode = RtlDosSearchPath_U ((PWCHAR)lpPath, (PWCHAR)lpFileName, (PWCHAR)lpExtension,
- nBufferLength * sizeof(WCHAR), lpBuffer, lpFilePart);
-
- if (EnvironmentBufferW != NULL)
- {
- RtlFreeHeap(GetProcessHeap(), 0, EnvironmentBufferW);
- }
- if (retCode == 0)
- {
- SetLastError(ERROR_FILE_NOT_FOUND);
- }
+ SetLastError(ERROR_OUTOFMEMORY);
+ return 0;
}
- return retCode / sizeof(WCHAR);
+ }
+
+ if (!ret) SetLastError(ERROR_FILE_NOT_FOUND);
+
+ return ret;
}
/*
diff --git a/reactos/dll/win32/kernel32/file/dosdev.c b/reactos/dll/win32/kernel32/file/dosdev.c
index 2e97934aea3..006cc76e5b3 100644
--- a/reactos/dll/win32/kernel32/file/dosdev.c
+++ b/reactos/dll/win32/kernel32/file/dosdev.c
@@ -76,6 +76,7 @@ DefineDosDeviceW(
LPCWSTR lpTargetPath
)
{
+ UNIMPLEMENTED;
return FALSE;
}
diff --git a/reactos/dll/win32/kernel32/file/mailslot.c b/reactos/dll/win32/kernel32/file/mailslot.c
index c31993a3be0..629fef277e4 100644
--- a/reactos/dll/win32/kernel32/file/mailslot.c
+++ b/reactos/dll/win32/kernel32/file/mailslot.c
@@ -109,7 +109,7 @@ CreateMailslotW(LPCWSTR lpName,
nMaxMessageSize,
&DefaultTimeOut);
- if (Status == STATUS_INVALID_DEVICE_REQUEST)
+ if (Status == STATUS_INVALID_DEVICE_REQUEST || Status == STATUS_NOT_SUPPORTED)
{
Status = STATUS_OBJECT_NAME_INVALID;
}
diff --git a/reactos/dll/win32/kernel32/file/volume.c b/reactos/dll/win32/kernel32/file/volume.c
index 6107956412c..09e07ab5883 100644
--- a/reactos/dll/win32/kernel32/file/volume.c
+++ b/reactos/dll/win32/kernel32/file/volume.c
@@ -88,6 +88,7 @@ GetLogicalDriveStringsA(DWORD nBufferLength,
{
DWORD drive, count;
DWORD dwDriveMap;
+ LPSTR p;
dwDriveMap = GetLogicalDrives();
@@ -100,7 +101,7 @@ GetLogicalDriveStringsA(DWORD nBufferLength,
if ((count * 4) + 1 > nBufferLength) return ((count * 4) + 1);
- LPSTR p = lpBuffer;
+ p = lpBuffer;
for (drive = 0; drive < MAX_DOS_DRIVES; drive++)
if (dwDriveMap & (1< nBufferLength) return ((count * 4) + 1);
- LPWSTR p = lpBuffer;
+ p = lpBuffer;
for (drive = 0; drive < MAX_DOS_DRIVES; drive++)
if (dwDriveMap & (1<NameLength;
continue;
}
- else
+ else
{
NtClose(FileHandle);
SetLastErrorByStatus(Status);
@@ -962,7 +964,7 @@ GetVolumeNameForVolumeMountPointW(
MountPoint->DeviceNameOffset = sizeof(MOUNTMGR_MOUNT_POINT);
MountPoint->DeviceNameLength = MountDevName->NameLength;
RtlCopyMemory(MountPoint + 1, MountDevName->Name, MountDevName->NameLength);
- RtlFreeHeap(GetProcessHeap(), 0, MountDevName);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, MountDevName);
RtlInitUnicodeString(&NtFileName, L"\\??\\MountPointManager");
InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL);
@@ -972,17 +974,17 @@ GetVolumeNameForVolumeMountPointW(
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
- RtlFreeHeap(GetProcessHeap(), 0, MountPoint);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint);
return FALSE;
}
BufferLength = sizeof(MOUNTMGR_MOUNT_POINTS);
do
{
- MountPoints = RtlAllocateHeap(GetProcessHeap(), 0, BufferLength);
+ MountPoints = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength);
if (MountPoints == NULL)
{
- RtlFreeHeap(GetProcessHeap(), 0, MountPoint);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint);
NtClose(FileHandle);
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
@@ -994,7 +996,7 @@ GetVolumeNameForVolumeMountPointW(
MountPoints, BufferLength);
if (!NT_SUCCESS(Status))
{
- RtlFreeHeap(GetProcessHeap(), 0, MountPoints);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints);
if (Status == STATUS_BUFFER_OVERFLOW)
{
BufferLength = MountPoints->Size;
@@ -1002,7 +1004,7 @@ GetVolumeNameForVolumeMountPointW(
}
else if (!NT_SUCCESS(Status))
{
- RtlFreeHeap(GetProcessHeap(), 0, MountPoint);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint);
NtClose(FileHandle);
SetLastErrorByStatus(Status);
return FALSE;
@@ -1011,7 +1013,7 @@ GetVolumeNameForVolumeMountPointW(
}
while (!NT_SUCCESS(Status));
- RtlFreeHeap(GetProcessHeap(), 0, MountPoint);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint);
NtClose(FileHandle);
/*
@@ -1023,7 +1025,7 @@ GetVolumeNameForVolumeMountPointW(
{
MountPoint = MountPoints->MountPoints + Index;
SymbolicLinkName = (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset;
-
+
/*
* Check for "\\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\"
* (with the last slash being optional) style symbolic links.
@@ -1053,14 +1055,14 @@ GetVolumeNameForVolumeMountPointW(
Result = FALSE;
}
- RtlFreeHeap(GetProcessHeap(), 0, MountPoints);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints);
return Result;
}
}
}
- RtlFreeHeap(GetProcessHeap(), 0, MountPoints);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints);
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
@@ -1089,7 +1091,7 @@ GetVolumeNameForVolumeMountPointA(
if ((ret = GetVolumeNameForVolumeMountPointW( pathW, volumeW, len )))
FilenameW2A_N( lpszVolumeName, len, volumeW, -1 );
- RtlFreeHeap( GetProcessHeap(), 0, pathW );
+ RtlFreeHeap( RtlGetProcessHeap(), 0, pathW );
return ret;
}
@@ -1105,7 +1107,7 @@ FindFirstVolumeW(
{
DWORD size = 1024;
HANDLE mgr = CreateFileW( MOUNTMGR_DOS_DEVICE_NAME, 0, FILE_SHARE_READ|FILE_SHARE_WRITE,
- NULL, OPEN_EXISTING, 0, 0 );
+ NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, INVALID_HANDLE_VALUE );
if (mgr == INVALID_HANDLE_VALUE) return INVALID_HANDLE_VALUE;
for (;;)
@@ -1113,7 +1115,7 @@ FindFirstVolumeW(
MOUNTMGR_MOUNT_POINT input;
MOUNTMGR_MOUNT_POINTS *output;
- if (!(output = RtlAllocateHeap( GetProcessHeap(), 0, size )))
+ if (!(output = RtlAllocateHeap( RtlGetProcessHeap(), 0, size )))
{
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
break;
@@ -1125,7 +1127,7 @@ FindFirstVolumeW(
{
if (GetLastError() != ERROR_MORE_DATA) break;
size = output->Size;
- RtlFreeHeap( GetProcessHeap(), 0, output );
+ RtlFreeHeap( RtlGetProcessHeap(), 0, output );
continue;
}
CloseHandle( mgr );
@@ -1133,7 +1135,7 @@ FindFirstVolumeW(
output->Size = 0;
if (!FindNextVolumeW( output, volume, len ))
{
- RtlFreeHeap( GetProcessHeap(), 0, output );
+ RtlFreeHeap( RtlGetProcessHeap(), 0, output );
return INVALID_HANDLE_VALUE;
}
return (HANDLE)output;
@@ -1152,8 +1154,18 @@ FindFirstVolumeA(
DWORD len
)
{
- WCHAR *buffer = RtlAllocateHeap( GetProcessHeap(), 0, len * sizeof(WCHAR) );
- HANDLE handle = FindFirstVolumeW( buffer, len );
+ WCHAR *buffer = NULL;
+ HANDLE handle;
+
+ buffer = RtlAllocateHeap( RtlGetProcessHeap(), 0, len * sizeof(WCHAR) );
+
+ if (!buffer)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ handle = FindFirstVolumeW( buffer, len );
if (handle != INVALID_HANDLE_VALUE)
{
@@ -1163,7 +1175,7 @@ FindFirstVolumeA(
handle = INVALID_HANDLE_VALUE;
}
}
- RtlFreeHeap( GetProcessHeap(), 0, buffer );
+ RtlFreeHeap( RtlGetProcessHeap(), 0, buffer );
return handle;
}
@@ -1176,7 +1188,7 @@ FindVolumeClose(
HANDLE hFindVolume
)
{
- return RtlFreeHeap(GetProcessHeap(), 0, hFindVolume);
+ return RtlFreeHeap(RtlGetProcessHeap(), 0, hFindVolume);
}
/*
diff --git a/reactos/dll/win32/kernel32/include/kernel32.h b/reactos/dll/win32/kernel32/include/kernel32.h
index 72ea0cfedaa..ec6b78f5a21 100755
--- a/reactos/dll/win32/kernel32/include/kernel32.h
+++ b/reactos/dll/win32/kernel32/include/kernel32.h
@@ -189,5 +189,8 @@ BasepMapFile(IN LPCWSTR lpApplicationName,
PCODEPAGE_ENTRY FASTCALL
IntGetCodePageEntry(UINT CodePage);
+LPWSTR
+GetDllLoadPath(LPCWSTR lpModule);
+
#endif /* ndef _KERNEL32_INCLUDE_KERNEL32_H */
diff --git a/reactos/dll/win32/kernel32/k32.h b/reactos/dll/win32/kernel32/k32.h
index 602642120ac..a47f9666a7f 100755
--- a/reactos/dll/win32/kernel32/k32.h
+++ b/reactos/dll/win32/kernel32/k32.h
@@ -27,6 +27,7 @@
/* C Headers */
#include
+#include
#include
#include
diff --git a/reactos/dll/win32/kernel32/kernel32.pspec b/reactos/dll/win32/kernel32/kernel32.pspec
index 3a6779fe471..631a70a4a0c 100644
--- a/reactos/dll/win32/kernel32/kernel32.pspec
+++ b/reactos/dll/win32/kernel32/kernel32.pspec
@@ -8,9 +8,10 @@
@ stdcall AddLocalAlternateComputerNameA(str ptr)
@ stdcall AddLocalAlternateComputerNameW(wstr ptr)
;@ stdcall AddRefActCtx(ptr)
+@ stdcall AddVectoredContinueHandler(long ptr) ntdll.RtlAddVectoredContinueHandler
@ stdcall AddVectoredExceptionHandler(long ptr) ntdll.RtlAddVectoredExceptionHandler
@ stdcall AllocConsole()
-@ stub AllocLSCallback ; missing in XP SP3
+@ stub AllocLSCallback ; missing in XP SP3 and 2003 R2
@ stdcall AllocateUserPhysicalPages(long ptr ptr)
@ stdcall AreFileApisANSI()
@ stdcall AssignProcessToJobObject(ptr ptr)
@@ -19,6 +20,7 @@
@ stdcall BackupSeek(ptr long long ptr ptr ptr)
@ stdcall BackupWrite(ptr ptr long ptr long long ptr)
@ stdcall BaseCheckAppcompatCache(long long long ptr) ;check
+@ stub BaseCheckRunApp
@ stdcall BaseCleanupAppcompatCache()
@ stdcall BaseCleanupAppcompatCacheSupport(ptr)
@ stdcall BaseDumpAppcompatCache()
@@ -336,6 +338,7 @@
@ stdcall GetCurrentDirectoryW(long ptr)
@ stdcall GetCurrentProcess()
@ stdcall GetCurrentProcessId()
+@ stdcall GetCurrentProcessorNumber() ntdll.RtlGetCurrentProcessorNumber
@ stdcall GetCurrentThread()
@ stdcall GetCurrentThreadId()
@ stdcall GetDateFormatA(long long ptr str ptr long)
@@ -388,7 +391,7 @@
@ stub GetSCallbackTemplate ; missing in XP SP3
@ stdcall GetLargePageMinimum()
@ stdcall GetLargestConsoleWindowSize(long)
-@ stdcall GetLastError()
+@ stdcall GetLastError() ntdll.RtlGetLastWin32Error
@ stdcall GetLinguistLangSize(ptr)
@ stdcall GetLocalTime(ptr)
@ stdcall GetLocaleInfoA(long long ptr long)
@@ -573,7 +576,8 @@
;@ stdcall InitializeCriticalSectionEx(ptr long long) ; missing in XP SP3
@ stdcall InitializeSListHead(ptr) ntdll.RtlInitializeSListHead
@ stdcall InitializeSRWLock(ptr) ntdll.RtlInitializeSRWLock
-@ stdcall InterlockedCompareExchange (ptr long long)
+@ stdcall InterlockedCompareExchange(ptr long long)
+@ stdcall InterlockedCompareExchange64(ptr double double) ntdll.RtlInterlockedCompareExchange64
@ stdcall InterlockedDecrement(ptr)
@ stdcall InterlockedExchange(ptr long)
@ stdcall InterlockedExchangeAdd (ptr long )
@@ -742,6 +746,7 @@
@ stdcall RemoveDirectoryW(wstr)
@ stdcall RemoveLocalAlternateComputerNameA(str long)
@ stdcall RemoveLocalAlternateComputerNameW(wstr long)
+@ stdcall RemoveVectoredContinueHandler(ptr) ntdll.RtlRemoveVectoredContinueHandler
@ stdcall RemoveVectoredExceptionHandler(ptr) ntdll.RtlRemoveVectoredExceptionHandler
@ stdcall ReplaceFile(wstr wstr wstr long ptr ptr) ReplaceFileW
@ stdcall ReplaceFileA(str str str long ptr ptr)
@@ -838,7 +843,7 @@
@ stdcall SetHandleInformation(long long long)
@ stdcall SetInformationJobObject(long long ptr long)
@ stub SetLastConsoleEventActive ; missing in XP SP3
-@ stdcall SetLastError(long)
+@ stdcall SetLastError(long) ntdll.RtlSetLastWin32Error
@ stub SetLocalPrimaryComputerNameA ; missing in XP SP3
@ stub SetLocalPrimaryComputerNameW ; missing in XP SP3
@ stdcall SetLocalTime(ptr)
@@ -1012,3 +1017,7 @@
@ stdcall lstrlen(str) lstrlenA
@ stdcall lstrlenA(str)
@ stdcall lstrlenW(wstr)
+
+; Functions added in Win Vista
+@ stdcall QueryFullProcessImageNameA(ptr long str ptr)
+@ stdcall QueryFullProcessImageNameW(ptr long wstr ptr)
diff --git a/reactos/dll/win32/kernel32/mem/global.c b/reactos/dll/win32/kernel32/mem/global.c
index 0c11ae15b40..9537cbc774a 100644
--- a/reactos/dll/win32/kernel32/mem/global.c
+++ b/reactos/dll/win32/kernel32/mem/global.c
@@ -224,18 +224,11 @@ GlobalFlags(HGLOBAL hMem)
/* Get the lock count first */
uFlags = HandleEntry->LockCount & GMEM_LOCKCOUNT;
- /* Now check if it's discarded */
+ /* Now check if it's discardable */
if (HandleEntry->Flags & BASE_HEAP_ENTRY_FLAG_REUSABLE)
{
/* Set the Win32 Flag */
- uFlags |= GMEM_DISCARDED;
- }
-
- /* Check if it's movable */
- if (HandleEntry->Flags & BASE_HEAP_ENTRY_FLAG_MOVABLE)
- {
- /* Set the Win32 Flag */
- uFlags |= GMEM_MOVEABLE;
+ uFlags |= GMEM_DISCARDABLE;
}
/* Check if it's DDE Shared */
@@ -244,6 +237,11 @@ GlobalFlags(HGLOBAL hMem)
/* Set the Win32 Flag */
uFlags |= GMEM_DDESHARE;
}
+
+ /* Now check if it's discarded */
+ if (HandleEntry->Flags & BASE_HEAP_ENTRY_FLAG_REUSE)
+ /* Set the Win32 Flag */
+ uFlags |= GMEM_DISCARDED;
}
}
@@ -806,6 +804,7 @@ GlobalUnlock(HGLOBAL hMem)
/* It's not, fail */
BASE_TRACE_FAILURE();
SetLastError(ERROR_INVALID_HANDLE);
+ RetVal = FALSE;
}
else
{
diff --git a/reactos/dll/win32/kernel32/mem/local.c b/reactos/dll/win32/kernel32/mem/local.c
index 02f63031c40..61428b97166 100644
--- a/reactos/dll/win32/kernel32/mem/local.c
+++ b/reactos/dll/win32/kernel32/mem/local.c
@@ -201,19 +201,17 @@ LocalFlags(HLOCAL hMem)
/* Get the lock count first */
uFlags = HandleEntry->LockCount & LMEM_LOCKCOUNT;
- /* Now check if it's discarded */
+ /* Now check if it's discardable */
if (HandleEntry->Flags & BASE_HEAP_ENTRY_FLAG_REUSABLE)
- {
- /* Set the Win32 Flag */
- uFlags |= LMEM_DISCARDED;
- }
-
- /* Check if it's movable */
- if (HandleEntry->Flags & BASE_HEAP_ENTRY_FLAG_MOVABLE)
{
/* Set the Win32 Flag */
uFlags |= LMEM_DISCARDABLE;
}
+
+ /* Now check if it's discarded */
+ if (HandleEntry->Flags & BASE_HEAP_ENTRY_FLAG_REUSE)
+ /* Set the Win32 Flag */
+ uFlags |= LMEM_DISCARDED;
}
}
diff --git a/reactos/dll/win32/kernel32/misc/actctx.c b/reactos/dll/win32/kernel32/misc/actctx.c
index 6d592867ded..3e81c9c2f9e 100644
--- a/reactos/dll/win32/kernel32/misc/actctx.c
+++ b/reactos/dll/win32/kernel32/misc/actctx.c
@@ -174,7 +174,7 @@ CreateActCtxW(
DPRINT("CreateActCtxW(%p %08lx)\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
- Status = RtlCreateActivationContext(&hActCtx, &pActCtx);
+ Status = RtlCreateActivationContext(&hActCtx, (PVOID*)&pActCtx);
if (!NT_SUCCESS(Status))
{
SetLastError(RtlNtStatusToDosError(Status));
@@ -318,6 +318,6 @@ ZombifyActCtx(
SetLastError(RtlNtStatusToDosError(Status));
return FALSE;
}
-
+
return TRUE;
}
diff --git a/reactos/dll/win32/kernel32/misc/atom.c b/reactos/dll/win32/kernel32/misc/atom.c
index e801dc229d9..25933979f50 100644
--- a/reactos/dll/win32/kernel32/misc/atom.c
+++ b/reactos/dll/win32/kernel32/misc/atom.c
@@ -340,6 +340,12 @@ InternalGetAtomName(BOOLEAN Local,
0,
AtomInfoLength);
+ if (!AtomInfo)
+ {
+ SetLastErrorByStatus(STATUS_NO_MEMORY);
+ return 0;
+ }
+
/* Query the name */
Status = NtQueryInformationAtom(Atom,
AtomBasicInformation,
diff --git a/reactos/dll/win32/kernel32/misc/comm.c b/reactos/dll/win32/kernel32/misc/comm.c
index 622bc394375..f4dbd7e92a4 100644
--- a/reactos/dll/win32/kernel32/misc/comm.c
+++ b/reactos/dll/win32/kernel32/misc/comm.c
@@ -741,7 +741,14 @@ SetDefaultCommConfigA(LPCSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize)
if (lpszName)
{
len = MultiByteToWideChar( CP_ACP, 0, lpszName, -1, NULL, 0 );
+
lpDeviceW = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
+ if (!lpDeviceW)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
+
MultiByteToWideChar( CP_ACP, 0, lpszName, -1, lpDeviceW, len );
}
r = SetDefaultCommConfigW(lpDeviceW,lpCC,dwSize);
diff --git a/reactos/dll/win32/kernel32/misc/computername.c b/reactos/dll/win32/kernel32/misc/computername.c
index e5bf86c648d..b07e644ab09 100644
--- a/reactos/dll/win32/kernel32/misc/computername.c
+++ b/reactos/dll/win32/kernel32/misc/computername.c
@@ -92,11 +92,19 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey,
return FALSE;
}
- if (*nSize > (KeyInfo->DataLength / sizeof(WCHAR)))
+ if (lpBuffer && *nSize > (KeyInfo->DataLength / sizeof(WCHAR)))
{
*nSize = KeyInfo->DataLength / sizeof(WCHAR) - 1;
lpBuffer[*nSize] = 0;
}
+ else
+ {
+ RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
+ ZwClose(KeyHandle);
+ *nSize = ReturnSize;
+ SetLastErrorByStatus(STATUS_BUFFER_OVERFLOW);
+ return FALSE;
+ }
RtlCopyMemory(lpBuffer, KeyInfo->Data, *nSize * sizeof(WCHAR));
@@ -254,7 +262,8 @@ GetComputerNameExA(COMPUTER_NAME_FORMAT NameType,
if (!TempBuffer)
{
- return ERROR_OUTOFMEMORY;
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
}
AnsiString.MaximumLength = (USHORT)*nSize;
diff --git a/reactos/dll/win32/kernel32/misc/error.c b/reactos/dll/win32/kernel32/misc/error.c
index 813a6281b6b..ce8eca6b592 100644
--- a/reactos/dll/win32/kernel32/misc/error.c
+++ b/reactos/dll/win32/kernel32/misc/error.c
@@ -17,28 +17,6 @@
#include
-/*
- * @implemented
- */
-VOID
-WINAPI
-SetLastError (DWORD dwErrorCode)
-{
- NtCurrentTeb ()->LastErrorValue = (ULONG) dwErrorCode;
-}
-
-
-/*
- * @implemented
- */
-DWORD
-WINAPI
-GetLastError (VOID)
-{
- return (DWORD) (NtCurrentTeb ()->LastErrorValue);
-}
-
-
/*
* @implemented
*/
diff --git a/reactos/dll/win32/kernel32/misc/icustubs.cpp b/reactos/dll/win32/kernel32/misc/icustubs.cpp
index 2eea6912d52..bfdf5dee6e5 100644
--- a/reactos/dll/win32/kernel32/misc/icustubs.cpp
+++ b/reactos/dll/win32/kernel32/misc/icustubs.cpp
@@ -45,17 +45,17 @@ void WINAPI DeleteCriticalSection(PCRITICAL_SECTION p) { RtlDeleteCriticalSectio
void free(void * memory)
{
- RtlFreeHeap(GetProcessHeap(), 0, memory);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, memory);
}
void * malloc(size_t size)
{
- return RtlAllocateHeap(GetProcessHeap(), 0, size);
+ return RtlAllocateHeap(RtlGetProcessHeap(), 0, size);
}
void * realloc(void * memory, size_t size)
{
- return RtlReAllocateHeap(GetProcessHeap(), 0, memory, size);
+ return RtlReAllocateHeap(RtlGetProcessHeap(), 0, memory, size);
}
int __cdecl _purecall()
diff --git a/reactos/dll/win32/kernel32/misc/lang.c b/reactos/dll/win32/kernel32/misc/lang.c
index a6e58e2e809..474f0f269d3 100644
--- a/reactos/dll/win32/kernel32/misc/lang.c
+++ b/reactos/dll/win32/kernel32/misc/lang.c
@@ -1550,10 +1550,10 @@ GetGeoInfoA(
case GEO_FRIENDLYNAME:
{
WCHAR szBuffer[MAX_PATH];
- int Ret;
-
- Ret = NLS_GetGeoFriendlyName(Location, szBuffer, cchData);
char szBufferA[sizeof(szBuffer)/sizeof(WCHAR)];
+ int Ret;
+
+ Ret = NLS_GetGeoFriendlyName(Location, szBuffer, cchData);
WideCharToMultiByte(CP_ACP, 0, szBuffer, -1, szBufferA, sizeof(szBufferA), 0, 0);
strcpy(lpGeoData, szBufferA);
@@ -2533,6 +2533,8 @@ LCMapStringA (
ret = wine_get_sortkey(dwMapFlags, srcW, srclenW, lpDestStr, cchDest);
if (ret == 0)
SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ else
+ ret++;
goto map_string_exit;
}
diff --git a/reactos/dll/win32/kernel32/misc/ldr.c b/reactos/dll/win32/kernel32/misc/ldr.c
index b4bbce214f5..a967fc6ffa6 100644
--- a/reactos/dll/win32/kernel32/misc/ldr.c
+++ b/reactos/dll/win32/kernel32/misc/ldr.c
@@ -20,6 +20,7 @@ typedef struct tagLOADPARMS32 {
} LOADPARMS32;
extern BOOLEAN InWindows;
+extern WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle;
/* FUNCTIONS ****************************************************************/
@@ -31,7 +32,7 @@ extern BOOLEAN InWindows;
* @remarks Returned pointer must be freed by caller.
*/
-LPWSTR WINAPI
+LPWSTR
GetDllLoadPath(LPCWSTR lpModule)
{
ULONG Pos = 0, Length = 0;
@@ -161,6 +162,49 @@ LoadLibraryW (
}
+static
+NTSTATUS
+LoadLibraryAsDatafile(PWSTR path, LPCWSTR name, HMODULE* hmod)
+{
+ static const WCHAR dotDLL[] = {'.','d','l','l',0};
+
+ WCHAR filenameW[MAX_PATH];
+ HANDLE hFile = INVALID_HANDLE_VALUE;
+ HANDLE mapping;
+ HMODULE module;
+
+ *hmod = 0;
+
+ if (!SearchPathW( path, name, dotDLL, sizeof(filenameW) / sizeof(filenameW[0]),
+ filenameW, NULL ))
+ {
+ return NtCurrentTeb()->LastStatusValue;
+ }
+
+ hFile = CreateFileW( filenameW, GENERIC_READ, FILE_SHARE_READ,
+ NULL, OPEN_EXISTING, 0, 0 );
+
+ if (hFile == INVALID_HANDLE_VALUE) return NtCurrentTeb()->LastStatusValue;
+
+ mapping = CreateFileMappingW( hFile, NULL, PAGE_READONLY, 0, 0, NULL );
+ CloseHandle( hFile );
+ if (!mapping) return NtCurrentTeb()->LastStatusValue;
+
+ module = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 );
+ CloseHandle( mapping );
+ if (!module) return NtCurrentTeb()->LastStatusValue;
+
+ /* make sure it's a valid PE file */
+ if (!RtlImageNtHeader(module))
+ {
+ UnmapViewOfFile( module );
+ return STATUS_INVALID_IMAGE_FORMAT;
+ }
+ *hmod = (HMODULE)((char *)module + 1); /* set low bit of handle to indicate datafile module */
+ return STATUS_SUCCESS;
+}
+
+
/*
* @implemented
*/
@@ -200,6 +244,7 @@ LoadLibraryExW (
dwFlags & LOAD_WITH_ALTERED_SEARCH_PATH ? lpLibFileName : NULL);
RtlInitUnicodeString(&DllName, (LPWSTR)lpLibFileName);
+
if (DllName.Buffer[DllName.Length/sizeof(WCHAR) - 1] == L' ')
{
RtlCreateUnicodeString(&DllName, (LPWSTR)lpLibFileName);
@@ -211,6 +256,21 @@ LoadLibraryExW (
DllName.Buffer[DllName.Length/sizeof(WCHAR)] = UNICODE_NULL;
FreeString = TRUE;
}
+
+ if (dwFlags & LOAD_LIBRARY_AS_DATAFILE)
+ {
+ Status = LdrGetDllHandle(SearchPath, NULL, &DllName, (PVOID*)&hInst);
+ if (!NT_SUCCESS(Status))
+ {
+ /* The method in load_library_as_datafile allows searching for the
+ * 'native' libraries only
+ */
+ Status = LoadLibraryAsDatafile(SearchPath, DllName.Buffer, &hInst);
+ goto done;
+ }
+ }
+
+ /* HACK!!! FIXME */
if (InWindows)
{
/* Call the API Properly */
@@ -224,6 +284,8 @@ LoadLibraryExW (
/* Call the ROS API. NOTE: Don't fix this, I have a patch to merge later. */
Status = LdrLoadDll(SearchPath, &dwFlags, &DllName, (PVOID*)&hInst);
}
+
+done:
RtlFreeHeap(RtlGetProcessHeap(), 0, SearchPath);
if (FreeString)
RtlFreeUnicodeString(&DllName);
@@ -267,7 +329,7 @@ GetProcAddress( HMODULE hModule, LPCSTR lpProcName )
if (!NT_SUCCESS(Status))
{
- SetLastError( RtlNtStatusToDosError( Status ) );
+ SetLastErrorByStatus(Status);
fnExp = NULL;
}
@@ -282,8 +344,31 @@ BOOL
WINAPI
FreeLibrary( HMODULE hLibModule )
{
- LdrUnloadDll(hLibModule);
- return TRUE;
+ PVOID Module = (PVOID)((ULONG_PTR)hLibModule & ~1);
+ NTSTATUS Status;
+
+ if ((ULONG_PTR)hLibModule & 1)
+ {
+ if (!RtlImageNtHeader(Module))
+ {
+ SetLastErrorByStatus(STATUS_INVALID_IMAGE_FORMAT);
+ return FALSE;
+ }
+
+ Status = NtUnmapViewOfSection(NtCurrentProcess(), Module);
+ }
+ else
+ {
+ Status = LdrUnloadDll(hLibModule);
+ }
+
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ return TRUE;
}
@@ -297,10 +382,8 @@ FreeLibraryAndExitThread (
DWORD dwExitCode
)
{
- if ( FreeLibrary(hLibModule) )
- ExitThread(dwExitCode);
- for (;;)
- ;
+ FreeLibrary(hLibModule);
+ ExitThread(dwExitCode);
}
@@ -636,7 +719,7 @@ LoadModule (
}
Length = (BYTE)LoadParams->lpCmdLine[0];
- if(!(CommandLine = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ if(!(CommandLine = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY,
strlen(lpModuleName) + Length + 2)))
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -660,7 +743,7 @@ LoadModule (
{
DWORD Error;
- HeapFree(GetProcessHeap(), 0, CommandLine);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, CommandLine);
/* return the right value */
Error = GetLastError();
switch(Error)
@@ -678,14 +761,16 @@ LoadModule (
return 0;
}
- HeapFree(GetProcessHeap(), 0, CommandLine);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, CommandLine);
/* Wait up to 15 seconds for the process to become idle */
- /* FIXME: This is user32! Windows soft-loads this only if required. */
- //WaitForInputIdle(ProcessInformation.hProcess, 15000);
+ if (NULL != lpfnGlobalRegisterWaitForInputIdle)
+ {
+ lpfnGlobalRegisterWaitForInputIdle(ProcessInformation.hProcess, 15000);
+ }
- CloseHandle(ProcessInformation.hThread);
- CloseHandle(ProcessInformation.hProcess);
+ NtClose(ProcessInformation.hThread);
+ NtClose(ProcessInformation.hProcess);
return 33;
}
diff --git a/reactos/dll/win32/kernel32/misc/profile.c b/reactos/dll/win32/kernel32/misc/profile.c
index ab15efee2db..54b21d7f9ef 100644
--- a/reactos/dll/win32/kernel32/misc/profile.c
+++ b/reactos/dll/win32/kernel32/misc/profile.c
@@ -488,6 +488,7 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
{
len = (int)(szLineEnd - szValueStart);
key->value = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) );
+ if (!key->value) break;
memcpy(key->value, szValueStart, len * sizeof(WCHAR));
key->value[len] = '\0';
}
@@ -1155,6 +1156,7 @@ static int PROFILE_GetPrivateProfileString( LPCWSTR section, LPCWSTR entry,
int len = (int)(p - def_val) + 1;
defval_tmp = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
+ if (!defval_tmp) return 0;
memcpy(defval_tmp, def_val, len * sizeof(WCHAR));
defval_tmp[len] = '\0';
def_val = defval_tmp;
@@ -1384,6 +1386,12 @@ DWORD WINAPI GetPrivateProfileSectionA( LPCSTR section, LPSTR buffer,
}
bufferW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (!bufferW)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
+ }
+
RtlCreateUnicodeStringFromAsciiz(§ionW, section);
if (filename) RtlCreateUnicodeStringFromAsciiz(&filenameW, filename);
else filenameW.Buffer = NULL;
diff --git a/reactos/dll/win32/kernel32/misc/res.c b/reactos/dll/win32/kernel32/misc/res.c
index db00fac780e..285f1d3d0ae 100644
--- a/reactos/dll/win32/kernel32/misc/res.c
+++ b/reactos/dll/win32/kernel32/misc/res.c
@@ -13,6 +13,7 @@
*/
#include
+#include
#define NDEBUG
#include
@@ -21,55 +22,6 @@
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); \
DPRINT1("%s() is UNIMPLEMENTED!\n", __FUNCTION__)
-/* Strustures and functions from include/wine/list.h */
-struct list
-{
- struct list *next;
- struct list *prev;
-};
-
-static inline void list_init( struct list *list )
-{
- list->next = list->prev = list;
-}
-
-/* add an element before the specified one */
-static inline void list_add_before( struct list *elem, struct list *to_add )
-{
- to_add->next = elem;
- to_add->prev = elem->prev;
- elem->prev->next = to_add;
- elem->prev = to_add;
-}
-
-/* add element at the tail of the list */
-static inline void list_add_tail( struct list *list, struct list *elem )
-{
- list_add_before( list, elem );
-}
-
-/* remove an element from its list */
-static inline void list_remove( struct list *elem )
-{
- elem->next->prev = elem->prev;
- elem->prev->next = elem->next;
-}
-
-/* get the next element */
-static inline struct list *list_next( const struct list *list, const struct list *elem )
-{
- struct list *ret = elem->next;
- if (elem->next == list) ret = NULL;
- return ret;
-}
-
-/* get the first element */
-static inline struct list *list_head( const struct list *list )
-{
- return list_next( list, list );
-}
-
-
/*
* Data structure for updating resources.
* Type/Name/Language is a keyset for accessing resource data.
@@ -145,6 +97,7 @@ static LPWSTR res_strdupW( LPCWSTR str )
return (LPWSTR) (UINT_PTR) LOWORD(str);
len = (lstrlenW( str ) + 1) * sizeof (WCHAR);
ret = HeapAlloc( GetProcessHeap(), 0, len );
+ if (!ret) return NULL;
memcpy( ret, str, len );
return ret;
}
@@ -264,16 +217,6 @@ static struct resource_data *allocate_resource_data( WORD Language, DWORD codepa
return resdata;
}
-/* get pointer to object containing list element */
-#define LIST_ENTRY(elem, type, field) \
- ((type *)((char *)(elem) - (unsigned int)(&((type *)0)->field)))
-
-/* iterate through the list using a list entry */
-#define LIST_FOR_EACH_ENTRY(elem, list, type, field) \
- for ((elem) = LIST_ENTRY((list)->next, type, field); \
- &(elem)->field != (list); \
- (elem) = LIST_ENTRY((elem)->field.next, type, field))
-
static void add_resource_dir_entry( struct list *dir, struct resource_dir_entry *resdir )
{
struct resource_dir_entry *ent;
@@ -343,6 +286,7 @@ static BOOL update_add_resource( QUEUEDUPDATES *updates, LPCWSTR Type, LPCWSTR N
if (!restype)
{
restype = HeapAlloc( GetProcessHeap(), 0, sizeof *restype );
+ if (!restype) return FALSE;
restype->id = res_strdupW( Type );
list_init( &restype->children );
add_resource_dir_entry( &updates->root, restype );
@@ -352,6 +296,7 @@ static BOOL update_add_resource( QUEUEDUPDATES *updates, LPCWSTR Type, LPCWSTR N
if (!resname)
{
resname = HeapAlloc( GetProcessHeap(), 0, sizeof *resname );
+ if (!resname) return FALSE;
resname->id = res_strdupW( Name );
list_init( &resname->children );
add_resource_dir_entry( &restype->children, resname );
@@ -526,6 +471,7 @@ static LPWSTR resource_dup_string( const IMAGE_RESOURCE_DIRECTORY *root, const I
string = (const IMAGE_RESOURCE_DIR_STRING_U*) (((const char *)root) + entry->NameOffset);
s = HeapAlloc(GetProcessHeap(), 0, (string->Length + 1)*sizeof (WCHAR) );
+ if (!s) return NULL;
memcpy( s, string->NameString, (string->Length + 1)*sizeof (WCHAR) );
s[string->Length] = 0;
diff --git a/reactos/dll/win32/kernel32/misc/stubs.c b/reactos/dll/win32/kernel32/misc/stubs.c
index 4a58567e29a..0cb8241b225 100644
--- a/reactos/dll/win32/kernel32/misc/stubs.c
+++ b/reactos/dll/win32/kernel32/misc/stubs.c
@@ -661,9 +661,15 @@ FindNextVolumeA(HANDLE handle,
LPSTR volume,
DWORD len)
{
- WCHAR *buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ WCHAR *buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, len * sizeof(WCHAR));
BOOL ret;
+ if (!buffer)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
+
if ((ret = FindNextVolumeW( handle, buffer, len )))
{
if (!WideCharToMultiByte( CP_ACP, 0, buffer, -1, volume, len, NULL, NULL )) ret = FALSE;
diff --git a/reactos/dll/win32/kernel32/misc/time.c b/reactos/dll/win32/kernel32/misc/time.c
index 99eecb84067..2eb8eb4d702 100644
--- a/reactos/dll/win32/kernel32/misc/time.c
+++ b/reactos/dll/win32/kernel32/misc/time.c
@@ -203,6 +203,27 @@ TIME_CompTimeZoneID( const TIME_ZONE_INFORMATION *pTZinfo, FILETIME *lpFileTime,
return retval;
}
+/***********************************************************************
+ * TIME_TimeZoneID
+ *
+ * Calculates whether daylight savings is on now.
+ *
+ * PARAMS
+ * pTzi [in] Timezone info.
+ *
+ * RETURNS
+ * TIME_ZONE_ID_INVALID An error occurred
+ * TIME_ZONE_ID_UNKNOWN There are no transition time known
+ * TIME_ZONE_ID_STANDARD Current time is standard time
+ * TIME_ZONE_ID_DAYLIGHT Current time is daylight savings time
+ */
+static DWORD TIME_ZoneID( const TIME_ZONE_INFORMATION *pTzi )
+{
+ FILETIME ftTime;
+ GetSystemTimeAsFileTime( &ftTime);
+ return TIME_CompTimeZoneID( pTzi, &ftTime, FALSE);
+}
+
/***********************************************************************
* TIME_GetTimezoneBias
*
@@ -534,7 +555,7 @@ GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation)
return TIME_ZONE_ID_INVALID;
}
- return(SharedUserData->TimeZoneId);
+ return TIME_ZoneID(lpTimeZoneInformation);
}
diff --git a/reactos/dll/win32/kernel32/process/proc.c b/reactos/dll/win32/kernel32/process/proc.c
index 5c5a21c742a..7339082fe17 100644
--- a/reactos/dll/win32/kernel32/process/proc.c
+++ b/reactos/dll/win32/kernel32/process/proc.c
@@ -1006,4 +1006,106 @@ IsWow64Process(
return TRUE;
}
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+QueryFullProcessImageNameW(HANDLE hProcess,
+ DWORD dwFlags,
+ LPWSTR lpExeName,
+ PDWORD pdwSize)
+{
+ BYTE Buffer[sizeof(UNICODE_STRING) + MAX_PATH * sizeof(WCHAR)];
+ UNICODE_STRING *DynamicBuffer = NULL;
+ UNICODE_STRING *Result = NULL;
+ NTSTATUS Status;
+ DWORD Needed;
+
+ Status = NtQueryInformationProcess(hProcess,
+ ProcessImageFileName,
+ Buffer,
+ sizeof(Buffer) - sizeof(WCHAR),
+ &Needed);
+ if (Status == STATUS_INFO_LENGTH_MISMATCH)
+ {
+ DynamicBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, Needed + sizeof(WCHAR));
+ if (!DynamicBuffer)
+ {
+ SetLastErrorByStatus(STATUS_NO_MEMORY);
+ return FALSE;
+ }
+
+ Status = NtQueryInformationProcess(hProcess,
+ ProcessImageFileName,
+ (LPBYTE)DynamicBuffer,
+ Needed,
+ &Needed);
+ Result = DynamicBuffer;
+ }
+ else Result = (PUNICODE_STRING)Buffer;
+
+ if (!NT_SUCCESS(Status)) goto Cleanup;
+
+ if (Result->Length / sizeof(WCHAR) + 1 > *pdwSize)
+ {
+ Status = STATUS_BUFFER_TOO_SMALL;
+ goto Cleanup;
+ }
+
+ *pdwSize = Result->Length / sizeof(WCHAR);
+ memcpy(lpExeName, Result->Buffer, Result->Length);
+ lpExeName[*pdwSize] = 0;
+
+Cleanup:
+ RtlFreeHeap(RtlGetProcessHeap(), 0, DynamicBuffer);
+
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ }
+ return !Status;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+QueryFullProcessImageNameA(HANDLE hProcess,
+ DWORD dwFlags,
+ LPSTR lpExeName,
+ PDWORD pdwSize)
+{
+ DWORD pdwSizeW = *pdwSize;
+ BOOL Result;
+ LPWSTR lpExeNameW;
+
+ lpExeNameW = RtlAllocateHeap(RtlGetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ *pdwSize * sizeof(WCHAR));
+ if (!lpExeNameW)
+ {
+ SetLastErrorByStatus(STATUS_NO_MEMORY);
+ return FALSE;
+ }
+
+ Result = QueryFullProcessImageNameW(hProcess, dwFlags, lpExeNameW, &pdwSizeW);
+
+ if (Result)
+ Result = (0 != WideCharToMultiByte(CP_ACP, 0,
+ lpExeNameW,
+ -1,
+ lpExeName,
+ *pdwSize,
+ NULL, NULL));
+ if (Result)
+ *pdwSize = strlen(lpExeName);
+
+ RtlFreeHeap(RtlGetProcessHeap(), 0, lpExeNameW);
+ return Result;
+}
+
/* EOF */
diff --git a/reactos/dll/win32/kernel32/process/session.c b/reactos/dll/win32/kernel32/process/session.c
index cba0191ee80..04a43d0ceb0 100644
--- a/reactos/dll/win32/kernel32/process/session.c
+++ b/reactos/dll/win32/kernel32/process/session.c
@@ -9,6 +9,9 @@
* 2001-12-07 created
*/
#include
+#include
+
+WINE_DEFAULT_DEBUG_CHANNEL(kernel32session);
DWORD ActiveConsoleSessionId = 0;
@@ -19,6 +22,7 @@ DWORD ActiveConsoleSessionId = 0;
DWORD WINAPI
DosPathToSessionPathW (DWORD SessionID, LPWSTR InPath, LPWSTR * OutPath)
{
+ UNIMPLEMENTED;
return 0;
}
@@ -39,6 +43,7 @@ DWORD WINAPI
DosPathToSessionPathA (DWORD SessionId, LPSTR InPath, LPSTR * OutPath)
{
//DosPathToSessionPathW (SessionId,InPathW,OutPathW);
+ UNIMPLEMENTED;
return 0;
}
diff --git a/reactos/dll/win32/kernel32/string/lstring.c b/reactos/dll/win32/kernel32/string/lstring.c
index 564a46dbfa1..a61cceb427f 100644
--- a/reactos/dll/win32/kernel32/string/lstring.c
+++ b/reactos/dll/win32/kernel32/string/lstring.c
@@ -82,6 +82,8 @@ lstrcpynA(LPSTR lpString1, LPCSTR lpString2, int iMaxLength)
Ret = lpString1;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ }
_SEH2_END;
return Ret;
@@ -103,6 +105,8 @@ lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Ret = lpString1;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ }
_SEH2_END;
return Ret;
@@ -123,6 +127,8 @@ lstrcatA(LPSTR lpString1, LPCSTR lpString2)
Ret = strcat(lpString1, lpString2);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ }
_SEH2_END;
return Ret;
@@ -143,6 +149,8 @@ lstrlenA(LPCSTR lpString)
Ret = strlen(lpString);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ }
_SEH2_END;
return Ret;
@@ -223,6 +231,8 @@ lstrcpynW(LPWSTR lpString1, LPCWSTR lpString2, int iMaxLength)
Ret = lpString1;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ }
_SEH2_END;
return Ret;
@@ -243,6 +253,8 @@ lstrcpyW(LPWSTR lpString1, LPCWSTR lpString2)
Ret = wcscpy(lpString1, lpString2);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ }
_SEH2_END;
return Ret;
@@ -263,6 +275,8 @@ lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Ret = wcscat(lpString1, lpString2);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ }
_SEH2_END;
return Ret;
@@ -283,6 +297,8 @@ lstrlenW(LPCWSTR lpString)
Ret = wcslen(lpString);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ }
_SEH2_END;
return Ret;
diff --git a/reactos/dll/win32/kernel32/thread/thread.c b/reactos/dll/win32/kernel32/thread/thread.c
index 62c98892f1d..cb5dab74b7c 100644
--- a/reactos/dll/win32/kernel32/thread/thread.c
+++ b/reactos/dll/win32/kernel32/thread/thread.c
@@ -263,13 +263,13 @@ OpenThread(DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwThreadId)
{
- NTSTATUS errCode;
+ NTSTATUS Status;
HANDLE ThreadHandle;
OBJECT_ATTRIBUTES ObjectAttributes;
CLIENT_ID ClientId ;
ClientId.UniqueProcess = 0;
- ClientId.UniqueThread = (HANDLE)dwThreadId;
+ ClientId.UniqueThread = ULongToHandle(dwThreadId);
InitializeObjectAttributes(&ObjectAttributes,
NULL,
@@ -277,13 +277,13 @@ OpenThread(DWORD dwDesiredAccess,
NULL,
NULL);
- errCode = NtOpenThread(&ThreadHandle,
- dwDesiredAccess,
- &ObjectAttributes,
- &ClientId);
- if (!NT_SUCCESS(errCode))
+ Status = NtOpenThread(&ThreadHandle,
+ dwDesiredAccess,
+ &ObjectAttributes,
+ &ClientId);
+ if (!NT_SUCCESS(Status))
{
- SetLastErrorByStatus (errCode);
+ SetLastErrorByStatus(Status);
return NULL;
}
@@ -306,9 +306,7 @@ BOOL
WINAPI
SwitchToThread(VOID)
{
- NTSTATUS Status;
- Status = NtYieldExecution();
- return Status != STATUS_NO_YIELD_PERFORMED;
+ return NtYieldExecution() != STATUS_NO_YIELD_PERFORMED;
}
@@ -755,10 +753,10 @@ GetThreadId(HANDLE Thread)
* @unimplemented
*/
LANGID WINAPI
-SetThreadUILanguage(WORD wReserved)
+SetThreadUILanguage(LANGID LangId)
{
- DPRINT1("SetThreadUILanguage(0x%4x) unimplemented!\n", wReserved);
- return 0;
+ DPRINT1("SetThreadUILanguage(0x%4x) unimplemented!\n", LangId);
+ return LangId;
}
static void CALLBACK
@@ -778,10 +776,13 @@ QueueUserAPC(PAPCFUNC pfnAPC, HANDLE hThread, ULONG_PTR dwData)
Status = NtQueueApcThread(hThread, IntCallUserApc, pfnAPC,
(PVOID)dwData, NULL);
- if (Status)
+ if (!NT_SUCCESS(Status))
+ {
SetLastErrorByStatus(Status);
+ return 0;
+ }
- return NT_SUCCESS(Status);
+ return 1;
}
/*
@@ -947,16 +948,16 @@ RegisterWaitForSingleObject(
ULONG dwFlags
)
{
- NTSTATUS Status = RtlRegisterWait( phNewWaitObject,
- hObject,
- Callback,
- Context,
- dwMilliseconds,
- dwFlags );
+ NTSTATUS Status = RtlRegisterWait(phNewWaitObject,
+ hObject,
+ Callback,
+ Context,
+ dwMilliseconds,
+ dwFlags);
- if (Status != STATUS_SUCCESS)
+ if (!NT_SUCCESS(Status))
{
- SetLastError( RtlNtStatusToDosError(Status) );
+ SetLastErrorByStatus(Status);
return FALSE;
}
return TRUE;
@@ -979,18 +980,19 @@ RegisterWaitForSingleObjectEx(
NTSTATUS Status;
HANDLE hNewWaitObject;
- Status = RtlRegisterWait( &hNewWaitObject,
- hObject,
- Callback,
- Context,
- dwMilliseconds,
- dwFlags );
+ Status = RtlRegisterWait(&hNewWaitObject,
+ hObject,
+ Callback,
+ Context,
+ dwMilliseconds,
+ dwFlags);
- if (Status != STATUS_SUCCESS)
+ if (!NT_SUCCESS(Status))
{
- SetLastError( RtlNtStatusToDosError(Status) );
+ SetLastErrorByStatus(Status);
return NULL;
}
+
return hNewWaitObject;
}
@@ -1004,12 +1006,14 @@ UnregisterWait(
HANDLE WaitHandle
)
{
- NTSTATUS Status = RtlDeregisterWaitEx( WaitHandle, NULL );
- if (Status != STATUS_SUCCESS)
+ NTSTATUS Status = RtlDeregisterWaitEx(WaitHandle, NULL);
+
+ if (!NT_SUCCESS(Status))
{
- SetLastError( RtlNtStatusToDosError(Status) );
+ SetLastErrorByStatus(Status);
return FALSE;
}
+
return TRUE;
}
@@ -1024,12 +1028,14 @@ UnregisterWaitEx(
HANDLE CompletionEvent
)
{
- NTSTATUS Status = RtlDeregisterWaitEx( WaitHandle, CompletionEvent );
- if (Status != STATUS_SUCCESS)
+ NTSTATUS Status = RtlDeregisterWaitEx(WaitHandle, CompletionEvent);
+
+ if (!NT_SUCCESS(Status))
{
- SetLastError( RtlNtStatusToDosError(Status) );
+ SetLastErrorByStatus(Status);
return FALSE;
}
+
return TRUE;
}
diff --git a/reactos/dll/win32/localui/localui.h b/reactos/dll/win32/localui/localui.h
index aa244bdc824..25424da568c 100644
--- a/reactos/dll/win32/localui/localui.h
+++ b/reactos/dll/win32/localui/localui.h
@@ -21,6 +21,8 @@
#ifndef __WINE_LOCALUI__
#define __WINE_LOCALUI__
+#include
+#include
/* ## Resource-ID ## */
#define ADDPORT_DIALOG 100
diff --git a/reactos/dll/win32/localui/localui.rbuild b/reactos/dll/win32/localui/localui.rbuild
index 7ee4b144c90..7172c2225b2 100644
--- a/reactos/dll/win32/localui/localui.rbuild
+++ b/reactos/dll/win32/localui/localui.rbuild
@@ -8,6 +8,21 @@
localui.c
localui.rc
+ ui_Da.rc
+ ui_De.rc
+ ui_En.rc
+ ui_Fr.rc
+ ui_Ko.rc
+ ui_Lt.rc
+ ui_Nl.rc
+ ui_No.rc
+ ui_Pl.rc
+ ui_Pt.rc
+ ui_Ro.rc
+ ui_Ru.rc
+ ui_Si.rc
+ ui_Sv.rc
+ ui_Zh.rc
wine
winspool
user32
diff --git a/reactos/dll/win32/localui/localui.rc b/reactos/dll/win32/localui/localui.rc
index 815cac0ed9f..cdf7bb4c7e8 100644
--- a/reactos/dll/win32/localui/localui.rc
+++ b/reactos/dll/win32/localui/localui.rc
@@ -19,10 +19,6 @@
*
*/
-#include "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "winver.h"
#include "localui.h"
#define WINE_FILENAME_STR "localui.dll"
@@ -36,19 +32,3 @@
#define WINE_PRODUCTVERSION_STR "5.1.2600.2180"
#include "wine/wine_common_ver.rc"
-
-
-#include "ui_Da.rc"
-#include "ui_De.rc"
-#include "ui_En.rc"
-#include "ui_Fr.rc"
-#include "ui_Ko.rc"
-#include "ui_Nl.rc"
-#include "ui_No.rc"
-#include "ui_Pl.rc"
-#include "ui_Pt.rc"
-#include "ui_Ro.rc"
-#include "ui_Ru.rc"
-#include "ui_Si.rc"
-#include "ui_Sv.rc"
-#include "ui_Zh.rc"
diff --git a/reactos/dll/win32/localui/ui_Da.rc b/reactos/dll/win32/localui/ui_Da.rc
index 97299266959..861ba8f2ddf 100644
--- a/reactos/dll/win32/localui/ui_Da.rc
+++ b/reactos/dll/win32/localui/ui_Da.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_De.rc b/reactos/dll/win32/localui/ui_De.rc
index 2fe35fc4e77..5f65a803737 100644
--- a/reactos/dll/win32/localui/ui_De.rc
+++ b/reactos/dll/win32/localui/ui_De.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_En.rc b/reactos/dll/win32/localui/ui_En.rc
index c2de6263a8a..5a218680472 100644
--- a/reactos/dll/win32/localui/ui_En.rc
+++ b/reactos/dll/win32/localui/ui_En.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Fr.rc b/reactos/dll/win32/localui/ui_Fr.rc
index 261fa0b7dd2..70e4baf06ee 100644
--- a/reactos/dll/win32/localui/ui_Fr.rc
+++ b/reactos/dll/win32/localui/ui_Fr.rc
@@ -17,6 +17,9 @@
* 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 "localui.h"
+
#pragma code_page(65001)
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
@@ -53,5 +56,3 @@ STRINGTABLE DISCARDABLE
IDS_PORTEXISTS "Le port %s existe déjà"
IDS_NOTHINGTOCONFIG "Ce port n'a pas d'options de configuration"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/localui/ui_Ko.rc b/reactos/dll/win32/localui/ui_Ko.rc
index 9a380308422..d86b7ef58a5 100644
--- a/reactos/dll/win32/localui/ui_Ko.rc
+++ b/reactos/dll/win32/localui/ui_Ko.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Lt.rc b/reactos/dll/win32/localui/ui_Lt.rc
new file mode 100644
index 00000000000..87997d0f75b
--- /dev/null
+++ b/reactos/dll/win32/localui/ui_Lt.rc
@@ -0,0 +1,59 @@
+/*
+ * Lithuanian resources for localui
+ *
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * 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 "localui.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
+CAPTION "Pridėti vietinį prievadą"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Įveskite pridedamo prievado vardą:", -1, 7, 13, 194, 13, WS_VISIBLE
+ EDITTEXT ADDPORT_EDIT, 6, 28, 174, 12, WS_VISIBLE | ES_AUTOHSCROLL
+ DEFPUSHBUTTON "Gerai", IDOK, 199, 10, 40, 14, WS_VISIBLE
+ PUSHBUTTON "Atsisakyti", IDCANCEL, 199, 27, 40, 14, WS_VISIBLE
+END
+
+
+LPTCONFIG_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 220, 47
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
+CAPTION "Konfigūruoti LPT prievadą"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Laukimo laikas (sekundėmis)", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX
+ LTEXT "&Perdavimo pakartojimas:", -1, 14, 22, 90, 13, WS_VISIBLE
+ EDITTEXT LPTCONFIG_EDIT, 112, 20, 32, 13, WS_VISIBLE | ES_NUMBER
+ DEFPUSHBUTTON "Gerai", IDOK, 164, 10, 50, 14, WS_VISIBLE
+ PUSHBUTTON "Atsisakyti", IDCANCEL, 164, 27, 50, 14, WS_VISIBLE
+END
+
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_LOCALPORT "Vietinis prievadas"
+ IDS_INVALIDNAME "'%s' yra netinkamas prievado vardas"
+ IDS_PORTEXISTS "Prievadas %s jau egzistuoja"
+ IDS_NOTHINGTOCONFIG "Šis prievadas neturi parinkčių konfigūravimui"
+}
diff --git a/reactos/dll/win32/localui/ui_Nl.rc b/reactos/dll/win32/localui/ui_Nl.rc
index 59c58ffd3aa..21d7cc84fae 100644
--- a/reactos/dll/win32/localui/ui_Nl.rc
+++ b/reactos/dll/win32/localui/ui_Nl.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_No.rc b/reactos/dll/win32/localui/ui_No.rc
index 3a46bc8ee88..8ed9e00c8aa 100644
--- a/reactos/dll/win32/localui/ui_No.rc
+++ b/reactos/dll/win32/localui/ui_No.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Pl.rc b/reactos/dll/win32/localui/ui_Pl.rc
index 74a5015e00a..822763d7dae 100644
--- a/reactos/dll/win32/localui/ui_Pl.rc
+++ b/reactos/dll/win32/localui/ui_Pl.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Pt.rc b/reactos/dll/win32/localui/ui_Pt.rc
index 7bad5211ead..7f1684820f7 100644
--- a/reactos/dll/win32/localui/ui_Pt.rc
+++ b/reactos/dll/win32/localui/ui_Pt.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Ro.rc b/reactos/dll/win32/localui/ui_Ro.rc
index 43edfe6a4b1..a1b1c771fa1 100644
--- a/reactos/dll/win32/localui/ui_Ro.rc
+++ b/reactos/dll/win32/localui/ui_Ro.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
#pragma code_page(65001)
@@ -53,5 +55,3 @@ STRINGTABLE DISCARDABLE
IDS_PORTEXISTS "Portul %s existsă deja"
IDS_NOTHINGTOCONFIG "Acest port nu are opțiuni de configurat"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/localui/ui_Ru.rc b/reactos/dll/win32/localui/ui_Ru.rc
index 96e78f1971b..3402f37b000 100644
--- a/reactos/dll/win32/localui/ui_Ru.rc
+++ b/reactos/dll/win32/localui/ui_Ru.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Si.rc b/reactos/dll/win32/localui/ui_Si.rc
index 961a2e046d4..6810c7ce733 100644
--- a/reactos/dll/win32/localui/ui_Si.rc
+++ b/reactos/dll/win32/localui/ui_Si.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
#pragma code_page(65001)
LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
@@ -54,5 +56,3 @@ STRINGTABLE DISCARDABLE
IDS_PORTEXISTS "Vrata z imenom %s že obstajajo"
IDS_NOTHINGTOCONFIG "Ta vrata nimajo možnosti nastavitve"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/localui/ui_Sv.rc b/reactos/dll/win32/localui/ui_Sv.rc
index 3cd22fd8c70..e137079ffe4 100644
--- a/reactos/dll/win32/localui/ui_Sv.rc
+++ b/reactos/dll/win32/localui/ui_Sv.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Zh.rc b/reactos/dll/win32/localui/ui_Zh.rc
index 197ac1dd38d..f43dde9afbd 100644
--- a/reactos/dll/win32/localui/ui_Zh.rc
+++ b/reactos/dll/win32/localui/ui_Zh.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@@ -90,5 +92,3 @@ STRINGTABLE DISCARDABLE
IDS_PORTEXISTS "端口 %s 已經存在"
IDS_NOTHINGTOCONFIG "這個端口沒有可設定選項"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/modemui/lang/ro-RO.rc b/reactos/dll/win32/modemui/lang/ro-RO.rc
new file mode 100644
index 00000000000..8860e4c7f02
--- /dev/null
+++ b/reactos/dll/win32/modemui/lang/ro-RO.rc
@@ -0,0 +1,617 @@
+LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+
+#pragma code_page(65001)
+
+IDM_MENU MENU
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Duplicare...", 0
+ MENUITEM "E&liminare", 1
+ MENUITEM "&Vizualizare jurnal", 2
+ MENUITEM SEPARATOR
+ MENUITEM "P&roprietăți", 3
+ MENUITEM "C&opiere proprietăți", 4
+ MENUITEM "A&plicare proprietăți", 5
+ END
+END
+
+IDD_ADVANCED DIALOGEX 17, 12, 238, 210
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
+CAPTION "Avansat"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Setări extra", 1018, 6, 6, 225, 70
+ LTEXT "Comenzi de inițializare extra:", 1011, 16, 20, 143, 8
+ EDITTEXT 1016, 16, 31, 205, 13, ES_AUTOHSCROLL
+ LTEXT "&Așteptare ton:", 1007, 16, 55, 109, 8, NOT WS_VISIBLE
+ EDITTEXT 1008, 133, 52, 26, 12, ES_RIGHT | NOT WS_VISIBLE | WS_GROUP
+ CONTROL "", 1009, "MSCTLS_UPDOWN32", NOT WS_VISIBLE | WS_BORDER | WS_GROUP | 0x00000036, 159, 52, 12, 12
+ LTEXT "secunde", 1010, 173, 54, 40, 8, NOT WS_VISIBLE
+ GROUPBOX "&Selectare țară/regiune", 1012, 6, 80, 225, 75
+ COMBOBOX 1013, 18, 99, 203, 50, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | NOT WS_TABSTOP
+ PUSHBUTTON "&Setări port avansate...", 1100, 107, 170, 125, 14
+ DEFPUSHBUTTON "Schimbare opțiuni implicite...", 3, 107, 188, 125, 14
+END
+
+IDD_GENERAL DIALOGEX 0, 0, 238, 210
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
+CAPTION "General"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Port:", 1018, 9, 8, 32, 10
+ LTEXT "Port com", 1095, 48, 8, 181, 10
+ GROUPBOX "&Volum sonor", 1029, 10, 21, 218, 48
+ CONTROL "", 1032, "MSCTLS_TRACKBAR32", WS_GROUP | WS_TABSTOP | 0x00000001, 84, 40, 66, 20
+ RTEXT "Oprit", 1045, 56, 40, 22, 8
+ LTEXT "Înalt", 1001, 155, 40, 25, 11
+ GROUPBOX "&Viteză maximă port", 1031, 10, 78, 218, 46
+ COMBOBOX 1036, 18, 100, 202, 69, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ GROUPBOX "Control apel", 1060, 10, 133, 218, 51
+ AUTOCHECKBOX "&Așteptare ton înaintea apelării", 1003, 27, 157, 174, 10
+END
+
+IDD_DISTINCTIVE_RING DIALOGEX 0, 0, 238, 210
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
+CAPTION "Distinctive Ring"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "", 1068, 10, 7, 218, 145
+ AUTOCHECKBOX "&Acest telefon are servicii Distinctive Ring", 1069, 20, 7, 184, 10
+ CTEXT "Model sunet apel", -1, 84, 21, 70, 8
+ CTEXT "Tip apel", -1, 159, 21, 63, 8
+ LTEXT "&Adresă primară:", 1070, 20, 41, 62, 8
+ COMBOBOX 1073, 84, 37, 71, 61, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | WS_VSCROLL | NOT WS_TABSTOP
+ COMBOBOX 1082, 160, 37, 62, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ LTEXT "Addresă &1:", 1071, 20, 59, 62, 8
+ COMBOBOX 1074, 84, 55, 71, 61, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | WS_VSCROLL | NOT WS_TABSTOP
+ COMBOBOX 1083, 160, 55, 62, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ LTEXT "Addresă &2:", 1072, 20, 77, 62, 8
+ COMBOBOX 1075, 84, 73, 71, 61, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | WS_VSCROLL | NOT WS_TABSTOP
+ COMBOBOX 1084, 160, 73, 62, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ LTEXT "Addresă &3:", 1076, 20, 95, 62, 8
+ COMBOBOX 1077, 84, 91, 71, 61, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | WS_VSCROLL | NOT WS_TABSTOP
+ COMBOBOX 1085, 160, 91, 62, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ LTEXT "Apelanți cu prioritate:", 1078, 20, 112, 62, 8
+ COMBOBOX 1079, 84, 109, 71, 61, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | WS_VSCROLL | NOT WS_TABSTOP
+ COMBOBOX 1086, 160, 109, 62, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ LTEXT "Call&back:", 1080, 20, 131, 62, 8
+ COMBOBOX 1081, 84, 127, 71, 61, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | WS_VSCROLL | NOT WS_TABSTOP
+ COMBOBOX 1087, 160, 127, 62, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+END
+
+IDD_DISTINCTIVE_RING_2 DIALOGEX 0, 0, 238, 210
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
+CAPTION "Distinctive Ring"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "", 1068, 10, 7, 218, 87
+ AUTOCHECKBOX "&Acest telefon are servicii Distinctive Ring.", 1069, 19, 7, 177, 10
+ CTEXT "Model sunet apel", -1, 20, 21, 74, 8
+ CTEXT "Tip apel", -1, 96, 21, 65, 8
+ LTEXT "&Bip simplu:", 1088, 20, 37, 53, 8
+ COMBOBOX 1091, 96, 37, 65, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ LTEXT "&Bip dublu:", 1089, 20, 57, 53, 8
+ COMBOBOX 1092, 96, 55, 65, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ LTEXT "Bip triplu:", 1090, 20, 76, 53, 8
+ COMBOBOX 1093, 96, 73, 65, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+END
+
+IDD_DIAGNOSTICS DIALOGEX 0, 0, 238, 215
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
+CAPTION "Diagnostic"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "", 1042, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000084D, 19, 18, 200, 58
+ CONTROL "", 1041, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000084D, 19, 84, 200, 58
+ PUSHBUTTON "&Înregistrare modem", 1096, 138, 149, 75, 14
+ AUTOCHECKBOX "Înregistrare jurnal", 1020, 18, 187, 98, 10
+ PUSHBUTTON "&Vizualizare jurnal", 1094, 138, 184, 75, 14, WS_DISABLED
+ GROUPBOX "Informații modem", 1047, 10, 6, 217, 164
+ GROUPBOX "Scriere jurnal", -1, 10, 173, 217, 32
+END
+
+IDD_PLEASE_WAIT DIALOGEX 0, 0, 195, 72
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION
+CAPTION "Vă rugăm așteptați"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ ICON 5100, -1, 9, 7, 20, 20
+ LTEXT "Se comunică cu modemul. Acest lucru poate dura câteva secunde.", -1, 42, 7, 146, 28
+ DEFPUSHBUTTON "Anulare", 2, 72, 52, 50, 14
+END
+
+IDD_GENERAL_2 DIALOGEX 0, 0, 238, 210
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
+CAPTION "General"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ AUTOCHECKBOX "&Apelare asistată de operator (manuală)", 1002, 19, 22, 150, 10
+ AUTOCHECKBOX "&Deconectare în caz de inactivitate", 1042, 19, 38, 143, 10
+ EDITTEXT 1043, 168, 35, 25, 13, ES_AUTOHSCROLL | ES_NUMBER
+ LTEXT "&Anulează apelul în caz de inactivitate", -1, 19, 56, 147, 10
+ EDITTEXT 1040, 168, 54, 25, 13, ES_AUTOHSCROLL | ES_NUMBER
+ RTEXT "&Viteză port:", 1034, 16, 102, 93, 8
+ COMBOBOX 1036, 114, 100, 84, 69, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ RTEXT "Protocol date:", 1032, 16, 122, 93, 8
+ COMBOBOX 1037, 114, 119, 84, 69, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ RTEXT "Comp&resioe", 1035, 16, 139, 93, 8
+ COMBOBOX 1099, 114, 137, 84, 69, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ RTEXT "&Control flux:", 1027, 16, 157, 93, 8
+ COMBOBOX 1031, 114, 155, 84, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ GROUPBOX "Preferințe apel", 1060, 11, 7, 217, 66
+ LTEXT "min", 1044, 195, 38, 22, 8
+ LTEXT "sec", 1041, 194, 56, 22, 8
+ GROUPBOX "Perferințe date conexiune", -1, 11, 82, 217, 94
+END
+
+IDD_ADVANCED_2 DIALOGEX 17, 12, 238, 210
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
+CAPTION "Avansat"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ AUTOCHECKBOX "Afișare fereastră terminal înaintea apelării", 1000, 20, 21, 200, 10
+ AUTOCHECKBOX "Afișare fereastră terminal după apelare", 1001, 20, 38, 200, 10
+ RTEXT "&Biți date:", 1024, 18, 79, 93, 8
+ COMBOBOX 1025, 114, 77, 106, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ RTEXT "&Paritate:", 1026, 18, 97, 93, 8
+ COMBOBOX 1028, 114, 95, 106, 60, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ RTEXT "&Biți oprire:", 1029, 18, 115, 93, 8
+ COMBOBOX 1030, 114, 113, 106, 45, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ RTEXT "&Modulare:", 1045, 18, 133, 93, 8
+ COMBOBOX 1038, 114, 131, 106, 69, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ GROUPBOX "Fereastră terminal", 1004, 10, 7, 217, 49
+ GROUPBOX "Setări hardware", 1005, 10, 64, 217, 89
+END
+
+IDD_ISDN DIALOGEX 0, 0, 238, 210
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
+CAPTION "ISDN"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Schimbare &tip", -1, 11, 6, 217, 39
+ COMBOBOX 1104, 17, 20, 204, 69, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
+ GROUPBOX "&Primul număr:", -1, 11, 50, 217, 50
+ EDITTEXT 1017, 33, 62, 188, 13, ES_AUTOHSCROLL | ES_NUMBER
+ LTEXT "S&PID/EAZ:", 1027, 34, 83, 67, 8
+ EDITTEXT 1107, 104, 79, 117, 13, ES_AUTOHSCROLL | ES_NUMBER
+ GROUPBOX "&Al doilea număr:", -1, 11, 105, 217, 49
+ EDITTEXT 1018, 33, 114, 189, 13, ES_AUTOHSCROLL | ES_NUMBER
+ LTEXT "SPI&D/EAZ:", 1028, 35, 135, 68, 8
+ EDITTEXT 1108, 105, 132, 117, 13, ES_AUTOHSCROLL | ES_NUMBER
+END
+
+IDD_PLEASE_WAIT_2 DIALOGEX 0, 0, 195, 72
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION
+CAPTION "Vă rugăm așteptați"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ ICON 5100, -1, 9, 7, 20, 20
+ LTEXT "Se trimit informații țară/regiune către modem.", -1, 42, 7, 146, 28
+END
+
+IDD_WARNING DIALOGEX 0, 0, 360, 105
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION
+CAPTION "Avertisment"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ AUTOCHECKBOX "Nu mai afișa acest mesaj", 1109, 17, 73, 118, 10
+ DEFPUSHBUTTON "OK", 1, 302, 84, 50, 14
+ LTEXT "Unele modemuri nu funcționează corect cu șiruri de inițializare atât de lungi.", -1, 50, 27, 304, 8
+ LTEXT "Informații despre aceste limite puteți afla de la producătorul modemului.", -1, 50, 41, 304, 8
+ ICON 5100, -1, 15, 14, 20, 20
+ LTEXT "Ați scris un șir de inițializare mai lung de 57 de caractere.", -1, 50, 14, 304, 8
+END
+
+IDD_MODEMS DIALOGEX 0, 0, 252, 218
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
+CAPTION "Modemuri"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ ICON 5100, 1057, 6, 7, 20, 20
+ LTEXT "Următoarele modemuri sunt instalate: ", -1, 44, 12, 203, 9
+ CONTROL "", 113, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x00000849, 7, 32, 238, 158, WS_EX_CLIENTEDGE
+ PUSHBUTTON "A&dăugare", 110, 56, 198, 60, 14
+ PUSHBUTTON "&Eliminare", 112, 121, 198, 60, 14
+ PUSHBUTTON "&Proprietăți", 109, 185, 198, 60, 14
+END
+
+IDD_PLEASE_WAIT_3 DIALOGEX 0, 0, 195, 72
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION
+CAPTION "Vă rugăm așteptați..."
+FONT 8, "MS Shell Dlg"
+BEGIN
+ DEFPUSHBUTTON "&Oprire", 2, 74, 53, 50, 14
+ ICON 5100, -1, 9, 7, 20, 20
+ LTEXT "Eliminare", -1, 40, 8, 151, 8
+ LTEXT "Modem", 1005, 40, 16, 151, 25
+END
+
+STRINGTABLE
+BEGIN
+ 180 "RS-232 Serial Port"
+ 181 "Modem extern"
+ 182 "Modem intern"
+ 183 "Modem PCMCIA"
+ 184 "Parallel Modem"
+ 185 "Parallel Port"
+ 200 "110"
+ 201 "1200"
+ 202 "2400"
+ 203 "4800"
+ 204 "9600"
+ 206 "19200"
+ 207 "38400"
+ 210 "115200"
+ 211 "57600"
+ 216 "300"
+ 220 "230400"
+ 221 "460800"
+ 222 "921600"
+ 240 "4"
+ 241 "5"
+ 242 "6"
+ 243 "7"
+ 244 "8"
+ 250 "Par"
+ 251 "Impar"
+ 252 "Nimic"
+ 253 "Marcare"
+ 254 "Spațiu"
+ 255 "1"
+ 256 "1.5"
+ 257 "2"
+ 260 "Xon / Xoff"
+ 261 "Hardware"
+ 262 "Nimic"
+ 263 "Pornit"
+ 264 "Scăzut"
+ 265 "V.23 (Minitel)"
+ 266 "Standard"
+ 267 "Non-standard (Bell, HST)"
+ 270 "Adăugare la jurnal"
+ 300 "Nespecificat"
+ 301 "Date"
+ 302 "Fax"
+ 303 "Voce"
+ 304 "Nimic"
+ 320 "Setări țară/regiune actualizate"
+ 340 "Modem"
+ 341 "Setări modem"
+ 342 "Adresă modem"
+ 400 "Setări țară/regiune neactualizate"
+ 401 "Unele modemuri nu funcționează corect cu șiruri de inițializare peste 57 de caractere.\n\nCereți mai multe informații de la producător."
+ 402 "Avertisment"
+ 460 "Nu există destulă memorie pentru a afișa caseta de dialog General.\nÎnchideți unele aplicații și reîncercați."
+ 461 "Nu există destulă memorie pentru a afișa caseta de dialog Setări modem.\nÎnchideți unele aplicații și reîncercați."
+ 463 "Fiecare adresă de apelare trebuie setată pe 'Automat' sau pe un model de apel unic.\n\nSchimbați dublura și reîncercați."
+ 465 "Standard EC"
+ 466 "Forced EC"
+ 467 "Celular"
+ 468 "Dezactivat"
+ 469 "Activat"
+ 470 "Dezactivat"
+ 480 "AUTO (1 Ch.)"
+ 481 "AUTO (2 Ch.)"
+ 482 "PPP (56K)"
+ 483 "PPP (64K)"
+ 484 "PPP (112K)"
+ 485 "PPP (112K,PAP)"
+ 486 "PPP (112K,CHAP)"
+ 487 "PPP (112K,MSCHAP)"
+ 488 "PPP (128K)"
+ 489 "PPP (128K,PAP)"
+ 490 "PPP (128K,CHAP)"
+ 491 "PPP (128K,MSCHAP)"
+ 500 "V.120 (64K)"
+ 501 "V.120 (56K)"
+ 502 "V.120 (112K)"
+ 503 "V.120 (128K)"
+ 504 "X.75 (64K)"
+ 505 "X.75 (128K)"
+ 506 "X.75 (T.70)"
+ 507 "X.75 (BTX)"
+ 508 "V.110 (1.2K)"
+ 509 "V.110 (2.4K)"
+ 510 "V.110 (4.8K)"
+ 511 "V.110 (9.6K)"
+ 512 "V.110 (12.0K)"
+ 513 "V.110 (14.4K)"
+ 514 "V.110 (19.2K)"
+ 515 "V.110 (28.8K)"
+ 516 "V.110 (38.4K)"
+ 517 "V.110 (57.6K)"
+ 518 "Analog (V.34/V.90)"
+ 550 "ESS5 (AT&T) (America de Nord)"
+ 551 "AT&T Point to Multipoint"
+ 552 "National ISDN 1 (NI-1)"
+ 553 "Northern Telecom DMS 100 (NT1)"
+ 554 "NTT INS64 (Japonia)"
+ 555 "European ISDN (DSS1)"
+ 556 "German National (1TR6) (rar)"
+ 557 "French National (VN3) (rar)"
+ 558 "Belgium National (rar)"
+ 559 "Australian National (rar)"
+ 560 "Switch necunoscut"
+ 570 "Configurația ISDN pentru acest modem\ne incompletă.\n\nVă rugăm introduceți datele\nîn fila ISDN și reîncercați."
+ 600 "PPP (56K,GSM)"
+ 601 "PPP (64K,GSM)"
+ 602 "V.120 (64K,GSM)"
+ 604 "V.110 (1.2K,GSM)"
+ 605 "V.110 (2.4K,GSM)"
+ 606 "V.110 (4.8K,GSM)"
+ 607 "V.110 (9.6K,GSM)"
+ 608 "V.110 (12.0K,GSM)"
+ 609 "V.110 (14.4K,GSM)"
+ 610 "V.110 (19.2K,GSM)"
+ 611 "V.110 (28.8K,GSM)"
+ 612 "V.110 (38.4K,GSM)"
+ 613 "V.110 (57.6K,GSM)"
+ 614 "Analog RLP"
+ 615 "Analog NRLP"
+ 616 "GPRS"
+ 617 "PIAFS - dinspre"
+ 618 "PIAFS - spre"
+ 700 "Folosire locație TAPI curentă"
+ 2006 "Atașat la"
+ 2007 "Absent"
+ 2008 "Inactiv"
+ 2009 "Necesită repornire"
+ 2010 "#Pentru a termina instalarea modemului, trebuie să reporniți computerul.\n\nVreți să reporniți computerul acum?"
+ 2011 "Modem instalat incorect"
+ 2012 "Port necunoscut"
+ 3000 "Instalare modem"
+ 3018 "Modemuri"
+ 3019 "Instalează modemuri și editează proprietăți ale acestora."
+ 3053 "Proprietățile modemului nu pot fi afișate deoarce modemul e indisponibil..\n\nReporniți sistemul și reîncercați."
+ 3054 "Properietăți pentru Modemuri"
+ 3060 "Sigur vreți să eliminați acest(e) modem(uri) din sistem?"
+ 3061 "ReactOS nu a putut elimina modemul '%1' din %2."
+ 3062 "Modem"
+ 3069 "Nu există destulă memorie pentru a afișa panoul de control.\n\nÎnchideți unele programe și reîncercați."
+ 3073 "Trebuie să fiți administrator de sistem pentru a instala un modem."
+ 3074 "Niciun modem instalat. Trebuie să fiți administrator de sistem pentru a instala un modem."
+ 3076 "Trebuie să închideți și să reporniți computerul pentru ca setările noi să aibă efect.\n\nVreți să reporniți computerul acum?"
+ 3077 "Schimbare setări rețea"
+ 3200 "300 Baud"
+ 3201 "1200 Baud"
+ 3202 "2400 Baud"
+ 3203 "9600 Baud"
+ 3204 "19.2K Baud"
+ 3205 "38.4K Baud"
+ 3206 "57.6K Baud"
+ 3207 "Niciun răspuns"
+ 3212 "Comandă"
+ 3213 "Răspuns"
+ 3214 "Portul la care e atașat modemul nu poate fi deschis. Acest lucru ar putea fi rezultatul unui conflict între dispozitive. Verificați în Gestionarul de dispozitive pentru probleme."
+ 3215 "Portul care este folosit de modem este folosit în acest moment de o altă aplicație. Închideți toate aplicațiile care ar putea folosi portul."
+ 3218 "OpenComm"
+ 3221 "115K Baud"
+ 3222 "Updating"
+ 3223 "Eroare"
+ 3233 "Succes"
+ 3236 "Modemul nu a putut răspunde. Asigurați-vă că e conectat corect și că e pornit. Dacă e un modem intern sau e conectat deja, verificați dacă întreruperea este corect setată."
+ 3237 "COMMANDĂ NESUPORTATĂ"
+ 3238 "Câmp"
+ 3239 "Valoare"
+ 3240 " Opțiuni implicite"
+ 3241 " Preferințe conexiune"
+ 6144 "Japonia"
+ 6145 "Albania"
+ 6146 "Algeria"
+ 6147 "American Samoa"
+ 6148 "Germany (Cod țară/regiune 04)"
+ 6149 "Anguilla"
+ 6150 "Antigua and Barbuda"
+ 6151 "Argentina"
+ 6152 "Insula Ascension"
+ 6153 "Australia"
+ 6154 "Austria"
+ 6155 "Bahamas"
+ 6156 "Bahrain"
+ 6157 "Bangladesh"
+ 6158 "Barbados"
+ 6159 "Belgia"
+ 6160 "Belize"
+ 6161 "Benin"
+ 6162 "Bermude"
+ 6163 "Bhutan"
+ 6164 "Bolivia"
+ 6165 "Botswana"
+ 6166 "Brazilia"
+ 6167 "Cod regiune/țară (23)"
+ 6168 "British Indian Ocean Territory"
+ 6169 "British Virgin Islands"
+ 6170 "Brunei"
+ 6171 "Bulgaria"
+ 6172 "Myanmar"
+ 6173 "Burundi"
+ 6174 "Belarus"
+ 6175 "Cameroon"
+ 6176 "Canada"
+ 6177 "Cape Verde"
+ 6178 "Cayman Islands"
+ 6179 "Central African Republic"
+ 6180 "Chad"
+ 6181 "Chile"
+ 6182 "China"
+ 6183 "Colombia"
+ 6184 "Comoros"
+ 6185 "Congo"
+ 6186 "Cook Islands"
+ 6187 "Costa Rica"
+ 6188 "Cuba"
+ 6189 "Cyprus"
+ 6190 "Czech Republic"
+ 6191 "Cambodia"
+ 6192 "North Korea"
+ 6193 "Denmark"
+ 6194 "Djibouti"
+ 6195 "Dominican Republic"
+ 6196 "Dominica"
+ 6197 "Ecuador"
+ 6198 "Egypt"
+ 6199 "El Salvador"
+ 6200 "Equatorial Guinea"
+ 6201 "Ethiopia"
+ 6202 "Falkland Islands (Islas Malvinas)"
+ 6203 "Fiji Islands"
+ 6204 "Finland"
+ 6205 "France"
+ 6206 "French Polynesia"
+ 6207 "Cod țară/regiune (63)"
+ 6208 "Gabon"
+ 6209 "Gambia"
+ 6210 "Germany (Cod țară/regiune 66)"
+ 6211 "Angola"
+ 6212 "Ghana"
+ 6213 "Gibraltar"
+ 6214 "Greece"
+ 6215 "Grenada"
+ 6216 "Guam"
+ 6217 "Guatemala"
+ 6218 "Guernsey"
+ 6219 "Guinea"
+ 6220 "Guinea-Bissau"
+ 6221 "Guyana"
+ 6222 "Haiti"
+ 6223 "Honduras"
+ 6224 "Hong Kong SAR"
+ 6225 "Hungary"
+ 6226 "Iceland"
+ 6227 "India"
+ 6228 "Indonesia"
+ 6229 "Iran"
+ 6230 "Iraq"
+ 6231 "Ireland"
+ 6232 "Israel"
+ 6233 "Italy"
+ 6234 "Cote d'Ivoire"
+ 6235 "Jamaica"
+ 6236 "Afghanistan"
+ 6237 "Jersey"
+ 6238 "Jordan"
+ 6239 "Kenya"
+ 6240 "Kiribati"
+ 6241 "Korea"
+ 6242 "Kuwait"
+ 6243 "Laos"
+ 6244 "Lebanon"
+ 6245 "Lesotho"
+ 6246 "Liberia"
+ 6247 "Libya"
+ 6248 "Liechtenstein"
+ 6249 "Luxembourg"
+ 6250 "Macau SAR"
+ 6251 "Madagascar"
+ 6252 "Malaysia"
+ 6253 "Malawi"
+ 6254 "Maldives"
+ 6255 "Mali"
+ 6256 "Malta"
+ 6257 "Mauritania"
+ 6258 "Mauritius"
+ 6259 "Mexico"
+ 6260 "Monaco"
+ 6261 "Mongolia"
+ 6262 "Montserrat"
+ 6263 "Morocco"
+ 6264 "Mozambique"
+ 6265 "Nauru"
+ 6266 "Nepal"
+ 6267 "Netherlands"
+ 6268 "Netherlands Antilles"
+ 6269 "New Caledonia"
+ 6270 "New Zealand"
+ 6271 "Nicaragua"
+ 6272 "Niger"
+ 6273 "Nigeria"
+ 6274 "Norway"
+ 6275 "Oman"
+ 6276 "Pakistan"
+ 6277 "Panama"
+ 6278 "Papua New Guinea"
+ 6279 "Paraguay"
+ 6280 "Peru"
+ 6281 "Philippines"
+ 6282 "Polonia"
+ 6283 "Portugalia"
+ 6284 "Puerto Rico"
+ 6285 "Qatar"
+ 6286 "România"
+ 6287 "Rwanda"
+ 6288 "St. Kitts and Nevis"
+ 6289 "Cod țară/regiune (145)"
+ 6290 "St. Helena"
+ 6291 "St. Lucia"
+ 6292 "San Marino"
+ 6293 "Cod țară/regiune (148)"
+ 6294 "Sao Tome and Principe"
+ 6295 "St. Vincent and the Grenadines"
+ 6296 "Saudi Arabia"
+ 6297 "Senegal"
+ 6298 "Seychelles"
+ 6299 "Sierra Leone"
+ 6300 "Singapore"
+ 6301 "Solomon Islands"
+ 6302 "Somalia"
+ 6303 "South Africa"
+ 6304 "Spain"
+ 6305 "Sri Lanka"
+ 6306 "Sudan"
+ 6307 "Suriname"
+ 6308 "Swaziland"
+ 6309 "Sweden"
+ 6310 "Switzerland"
+ 6311 "Syria"
+ 6312 "Tanzania"
+ 6313 "Thailand"
+ 6314 "Togo"
+ 6315 "Tonga"
+ 6316 "Trinidad and Tobago"
+ 6317 "Tunisia"
+ 6318 "Turkey"
+ 6319 "Turks and Caicos Islands"
+ 6320 "Tuvalu"
+ 6321 "Uganda"
+ 6322 "Ukraine"
+ 6323 "United Arab Emirates"
+ 6324 "United Kingdom"
+ 6325 "United States"
+ 6326 "Burkina Faso"
+ 6327 "Uruguay"
+ 6328 "Cod țară/regiune (184)"
+ 6329 "Vanuatu"
+ 6330 "Vatican City"
+ 6331 "Venezuela"
+ 6332 "Vietnam"
+ 6333 "Wallis and Futuna"
+ 6334 "Samoa"
+ 6335 "Yemen"
+ 6336 "Yemen"
+ 6337 "Cod țară/regiune (193)"
+ 6338 "Congo (DRC)"
+ 6339 "Zambia"
+ 6340 "Zimbabwe"
+ 6501 "Moldova"
+ 6502 "Estonia"
+ 6503 "Lithuania"
+ 6504 "Armenia"
+ 6505 "Georgia"
+ 6506 "Azerbaijan"
+ 6507 "Turkmenistan"
+ 6508 "Uzbekistan"
+ 6509 "Kazakhstan"
+ 6510 "Tajikistan"
+ 6511 "Kyrgyzstan"
+ 6512 "Latvia"
+ 6513 "Russia"
+ 6600 "Croatia"
+ 6601 "Slovenia"
+ 6602 "Macedonia, FYRO"
+ 6603 "Bosnia and Herzegovina"
+ 6604 "Iugoslavia"
+ 20013 "ID dispozitiv"
+END
+
+#pragma code_page(default)
diff --git a/reactos/dll/win32/modemui/modemui.rc b/reactos/dll/win32/modemui/modemui.rc
index e1e7862a3cd..c9b2b34e3d0 100644
--- a/reactos/dll/win32/modemui/modemui.rc
+++ b/reactos/dll/win32/modemui/modemui.rc
@@ -18,5 +18,6 @@ IDI_703 ICON "res/703.ico"
#include "lang/es-ES.rc"
#include "lang/no-NO.rc"
#include "lang/pl-PL.rc"
+#include "lang/ro-RO.rc"
#include "lang/ru-RU.rc"
#include "lang/uk-UA.rc"
diff --git a/reactos/dll/win32/msafd/misc/dllmain.c b/reactos/dll/win32/msafd/misc/dllmain.c
index 1a268ee41e4..37e5081e913 100644
--- a/reactos/dll/win32/msafd/misc/dllmain.c
+++ b/reactos/dll/win32/msafd/misc/dllmain.c
@@ -341,6 +341,10 @@ DWORD MsafdReturnWithErrno(NTSTATUS Status,
DbgPrint("MSAFD: STATUS_INVALID_CONNECTION\n");
*Errno = WSAEAFNOSUPPORT;
break;
+ case STATUS_INVALID_ADDRESS:
+ DbgPrint("MSAFD: STATUS_INVALID_ADDRESS\n");
+ *Errno = WSAEADDRNOTAVAIL;
+ break;
case STATUS_REMOTE_NOT_LISTENING:
DbgPrint("MSAFD: STATUS_REMOTE_NOT_LISTENING\n");
*Errno = WSAECONNREFUSED;
@@ -2289,6 +2293,7 @@ VOID SockAsyncSelectCompletionRoutine(PVOID Context, PIO_STATUS_BLOCK IoStatusBl
/* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */
case AFD_EVENT_CONNECT:
+ case AFD_EVENT_CONNECT_FAIL:
if (0 != (Socket->SharedData.AsyncEvents & FD_CONNECT) &&
0 == (Socket->SharedData.AsyncDisabledEvents & FD_CONNECT))
{
diff --git a/reactos/dll/win32/msafd/misc/sndrcv.c b/reactos/dll/win32/msafd/misc/sndrcv.c
index a2c8cb552f3..bb77f637cd2 100644
--- a/reactos/dll/win32/msafd/misc/sndrcv.c
+++ b/reactos/dll/win32/msafd/misc/sndrcv.c
@@ -166,7 +166,7 @@ WSPRecv(SOCKET Handle,
/* Using Overlapped Structure and a Completition Routine, so use an APC */
APCFunction = NULL; // should be a private io completition function inside us
APCContext = lpCompletionRoutine;
- RecvInfo.AfdFlags = AFD_SKIP_FIO;
+ RecvInfo.AfdFlags |= AFD_SKIP_FIO;
}
IOSB = (PIO_STATUS_BLOCK)&lpOverlapped->Internal;
@@ -318,7 +318,7 @@ WSPRecvFrom(SOCKET Handle,
/* Using Overlapped Structure and a Completition Routine, so use an APC */
APCFunction = NULL; // should be a private io completition function inside us
APCContext = lpCompletionRoutine;
- RecvInfo.AfdFlags = AFD_SKIP_FIO;
+ RecvInfo.AfdFlags |= AFD_SKIP_FIO;
}
IOSB = (PIO_STATUS_BLOCK)&lpOverlapped->Internal;
@@ -445,7 +445,7 @@ WSPSend(SOCKET Handle,
/* Using Overlapped Structure and a Completition Routine, so use an APC */
APCFunction = NULL; // should be a private io completition function inside us
APCContext = lpCompletionRoutine;
- SendInfo.AfdFlags = AFD_SKIP_FIO;
+ SendInfo.AfdFlags |= AFD_SKIP_FIO;
}
IOSB = (PIO_STATUS_BLOCK)&lpOverlapped->Internal;
@@ -577,7 +577,7 @@ WSPSendTo(SOCKET Handle,
/* Using Overlapped Structure and a Completition Routine, so use an APC */
APCFunction = NULL; // should be a private io completition function inside us
APCContext = lpCompletionRoutine;
- SendInfo.AfdFlags = AFD_SKIP_FIO;
+ SendInfo.AfdFlags |= AFD_SKIP_FIO;
}
IOSB = (PIO_STATUS_BLOCK)&lpOverlapped->Internal;
diff --git a/reactos/dll/win32/msgina/gui.c b/reactos/dll/win32/msgina/gui.c
index 4ff362f01cd..6677a29bf68 100644
--- a/reactos/dll/win32/msgina/gui.c
+++ b/reactos/dll/win32/msgina/gui.c
@@ -259,7 +259,7 @@ LoggedOnWindowProc(
}
case WM_CLOSE:
{
- EndDialog(hwndDlg, IDNO);
+ EndDialog(hwndDlg, WLX_SAS_ACTION_NONE);
return TRUE;
}
}
diff --git a/reactos/dll/win32/msgina/lang/ro-RO.rc b/reactos/dll/win32/msgina/lang/ro-RO.rc
index eb203d6ba9e..156e8940c0f 100644
--- a/reactos/dll/win32/msgina/lang/ro-RO.rc
+++ b/reactos/dll/win32/msgina/lang/ro-RO.rc
@@ -1,8 +1,10 @@
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26
STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP
-CAPTION "V rugm ateptai..."
+CAPTION "Vă rugăm așteptați..."
FONT 8,"MS Shell Dlg",400,0,1
BEGIN
LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS
@@ -14,7 +16,7 @@ CAPTION "Bun venit la ReactOS"
FONT 8,"MS Shell Dlg",400,0,1
BEGIN
ICON IDI_LOCKICON, -1, 7, 5, 32, 32
- LTEXT "Apsai combinaia de taste Ctrl-Alt-Del",IDC_STATIC, 38, 10, 144, 14
+ LTEXT "Apăsați combinația de taste Ctrl-Alt-Del",IDC_STATIC, 38, 10, 144, 14
END
IDD_LOGGEDOUT_DLG DIALOGEX 0,0,275,147
@@ -24,9 +26,9 @@ FONT 8,"MS Shell Dlg",400,0,1
BEGIN
PUSHBUTTON "OK",IDOK,51,122,50,14,BS_DEFPUSHBUTTON
PUSHBUTTON "Anulare",IDCANCEL,115,122,50,14
- PUSHBUTTON "nchidere",IDC_SHUTDOWN,179,122,50,14
+ PUSHBUTTON "Închidere",IDC_SHUTDOWN,179,122,50,14
LTEXT "Nume utilizator:",IDC_STATIC,36,75,40,8
- LTEXT "Parol:",IDC_STATIC,36,93,42,8
+ LTEXT "Parolă:",IDC_STATIC,36,93,42,8
EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL
EDITTEXT IDC_PASSWORD,84,91,119,14,ES_AUTOHSCROLL | ES_PASSWORD
CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59
@@ -39,10 +41,10 @@ FONT 8,"MS Shell Dlg",400,0,1
BEGIN
PUSHBUTTON "Anulare",IDCANCEL,170,95,70,14
PUSHBUTTON "Deautentificare",IDC_LOGOFF,90,76,70,14
- PUSHBUTTON "nchidere",IDC_SHUTDOWN,170,76,70,14
- LTEXT "Ce vrei s facei?",IDC_STATIC,86,60,87,8
+ PUSHBUTTON "Închidere",IDC_SHUTDOWN,170,76,70,14
+ LTEXT "Ce vreți să faceți?",IDC_STATIC,86,60,87,8
PUSHBUTTON "Blocare computer",IDC_LOCK,10,76,70,14
- PUSHBUTTON "Gestionar activiti",IDC_TASKMGR,90,95,70,14
+ PUSHBUTTON "Gestionar activități",IDC_TASKMGR,90,95,70,14
CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53
END
@@ -50,8 +52,10 @@ STRINGTABLE
BEGIN
IDS_LOGGEDOUTSAS "Bun venit!"
IDS_LOCKEDSAS "Computerul este acum blocat."
- IDS_PRESSCTRLALTDELETE "Apsai Control+Alt+Delete pentru a v autentifica."
+ IDS_PRESSCTRLALTDELETE "Apăsați Control+Alt+Delete pentru a vă autentifica."
IDS_ASKFORUSER "Nume utilizator: "
- IDS_ASKFORPASSWORD "Parol: "
- IDS_FORCELOGOFF "Aceast aciune va deautentifica utilizatorul curent i va pierde datele nesalvat. Sigur continuai?"
+ IDS_ASKFORPASSWORD "Parolă: "
+ IDS_FORCELOGOFF "Această acțiune va închide sesiunea utilizatorului curent și va pierde datele nesalvate de acesta. Sigur continuați?"
END
+
+#pragma code_page(default)
diff --git a/reactos/dll/win32/msi/streams.c b/reactos/dll/win32/msi/streams.c
index 2d869cc0d29..12f707e5e57 100644
--- a/reactos/dll/win32/msi/streams.c
+++ b/reactos/dll/win32/msi/streams.c
@@ -60,7 +60,7 @@ static BOOL streams_set_table_size(MSISTREAMSVIEW *sv, UINT size)
if (size >= sv->max_streams)
{
sv->max_streams *= 2;
- sv->streams = msi_realloc(sv->streams, sv->max_streams * sizeof(STREAM *));
+ sv->streams = msi_realloc_zero(sv->streams, sv->max_streams * sizeof(STREAM *));
if (!sv->streams)
return FALSE;
}
@@ -387,7 +387,7 @@ static UINT STREAMS_delete(struct tagMSIVIEW *view)
for (i = 0; i < sv->num_rows; i++)
{
- if (sv->streams[i]->stream)
+ if (sv->streams[i] && sv->streams[i]->stream)
IStream_Release(sv->streams[i]->stream);
msi_free(sv->streams[i]);
}
@@ -462,7 +462,7 @@ static INT add_streams_to_table(MSISTREAMSVIEW *sv)
return -1;
sv->max_streams = 1;
- sv->streams = msi_alloc(sizeof(STREAM *));
+ sv->streams = msi_alloc_zero(sizeof(STREAM *));
if (!sv->streams)
return -1;
diff --git a/reactos/dll/win32/msi/table.c b/reactos/dll/win32/msi/table.c
index 885c0ddf796..0b5b99164b9 100644
--- a/reactos/dll/win32/msi/table.c
+++ b/reactos/dll/win32/msi/table.c
@@ -73,9 +73,8 @@ typedef struct tagMSIORDERINFO
struct tagMSITABLE
{
BYTE **data;
+ BOOL *data_persistent;
UINT row_count;
- BYTE **nonpersistent_data;
- UINT nonpersistent_row_count;
struct list entry;
MSICOLUMNINFO *colinfo;
UINT col_count;
@@ -476,9 +475,7 @@ static void free_table( MSITABLE *table )
for( i=0; irow_count; i++ )
msi_free( table->data[i] );
msi_free( table->data );
- for( i=0; inonpersistent_row_count; i++ )
- msi_free( table->nonpersistent_data[i] );
- msi_free( table->nonpersistent_data );
+ msi_free( table->data_persistent );
msi_free_colinfo( table->colinfo, table->col_count );
msi_free( table->colinfo );
msi_free( table );
@@ -520,6 +517,9 @@ static UINT read_table_from_storage( MSIDATABASE *db, MSITABLE *t, IStorage *stg
t->data = msi_alloc_zero( t->row_count * sizeof (USHORT*) );
if( !t->data )
goto err;
+ t->data_persistent = msi_alloc_zero( t->row_count * sizeof(BOOL));
+ if ( !t->data_persistent )
+ goto err;
/* transpose all the data */
TRACE("Transposing data from %d rows\n", t->row_count );
@@ -528,6 +528,7 @@ static UINT read_table_from_storage( MSIDATABASE *db, MSITABLE *t, IStorage *stg
t->data[i] = msi_alloc( row_size );
if( !t->data[i] )
goto err;
+ t->data_persistent[i] = TRUE;
for( j=0; jcol_count; j++ )
{
@@ -634,8 +635,7 @@ UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info,
table->ref_count = 1;
table->row_count = 0;
table->data = NULL;
- table->nonpersistent_row_count = 0;
- table->nonpersistent_data = NULL;
+ table->data_persistent = NULL;
table->colinfo = NULL;
table->col_count = 0;
table->persistent = persistent;
@@ -783,8 +783,7 @@ static UINT get_table( MSIDATABASE *db, LPCWSTR name, MSITABLE **table_ret )
table->row_count = 0;
table->data = NULL;
- table->nonpersistent_row_count = 0;
- table->nonpersistent_data = NULL;
+ table->data_persistent = NULL;
table->colinfo = NULL;
table->col_count = 0;
table->persistent = MSICONDITION_TRUE;
@@ -833,6 +832,7 @@ static UINT save_table( MSIDATABASE *db, const MSITABLE *t )
goto err;
}
+ rawsize = 0;
p = rawdata;
for( i=0; icol_count; i++ )
{
@@ -840,6 +840,10 @@ static UINT save_table( MSIDATABASE *db, const MSITABLE *t )
{
UINT offset = t->colinfo[i].offset;
+ if (!t->data_persistent[j]) continue;
+ if (i == 0)
+ rawsize += row_size;
+
*p++ = t->data[j][offset];
*p++ = t->data[j][offset + 1];
if( 4 == bytes_per_column( db, &t->colinfo[i] ) )
@@ -1087,11 +1091,6 @@ BOOL TABLE_Exists( MSIDATABASE *db, LPCWSTR name )
if( table->data[ i ][ 0 ] == table_id )
return TRUE;
- count = table->nonpersistent_row_count;
- for( i=0; inonpersistent_data[ i ][ 0 ] == table_id )
- return TRUE;
-
return FALSE;
}
@@ -1113,7 +1112,6 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT *
{
MSITABLEVIEW *tv = (MSITABLEVIEW*)view;
UINT offset, n;
- BYTE **data;
if( !tv->table )
return ERROR_INVALID_PARAMETER;
@@ -1122,7 +1120,7 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT *
return ERROR_INVALID_PARAMETER;
/* how many rows are there ? */
- if( row >= tv->table->row_count + tv->table->nonpersistent_row_count )
+ if( row >= tv->table->row_count )
return ERROR_NO_MORE_ITEMS;
if( tv->columns[col-1].offset >= tv->row_size )
@@ -1135,14 +1133,6 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT *
if (tv->order)
row = tv->order->reorder[row];
- if (row >= tv->table->row_count)
- {
- row -= tv->table->row_count;
- data = tv->table->nonpersistent_data;
- }
- else
- data = tv->table->data;
-
n = bytes_per_column( tv->db, &tv->columns[col-1] );
if (n != 2 && n != 3 && n != 4)
{
@@ -1151,7 +1141,7 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT *
}
offset = tv->columns[col-1].offset;
- *val = read_table_int(data, row, offset, n);
+ *val = read_table_int(tv->table->data, row, offset, n);
/* TRACE("Data [%d][%d] = %d\n", row, col, *val ); */
@@ -1277,7 +1267,6 @@ static UINT TABLE_fetch_stream( struct tagMSIVIEW *view, UINT row, UINT col, ISt
static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val )
{
UINT offset, n, i;
- BYTE **data;
if( !tv->table )
return ERROR_INVALID_PARAMETER;
@@ -1285,7 +1274,7 @@ static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val )
if( (col==0) || (col>tv->num_cols) )
return ERROR_INVALID_PARAMETER;
- if( row >= tv->table->row_count + tv->table->nonpersistent_row_count )
+ if( row >= tv->table->row_count )
return ERROR_INVALID_PARAMETER;
if( tv->columns[col-1].offset >= tv->row_size )
@@ -1298,14 +1287,6 @@ static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val )
msi_free( tv->columns[col-1].hash_table );
tv->columns[col-1].hash_table = NULL;
- if (row >= tv->table->row_count)
- {
- row -= tv->table->row_count;
- data = tv->table->nonpersistent_data;
- }
- else
- data = tv->table->data;
-
n = bytes_per_column( tv->db, &tv->columns[col-1] );
if ( n != 2 && n != 3 && n != 4 )
{
@@ -1315,7 +1296,7 @@ static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val )
offset = tv->columns[col-1].offset;
for ( i = 0; i < n; i++ )
- data[row][offset + i] = (val >> i * 8) & 0xff;
+ tv->table->data[row][offset + i] = (val >> i * 8) & 0xff;
return ERROR_SUCCESS;
}
@@ -1393,9 +1374,8 @@ static UINT TABLE_set_row( struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UI
if ( !(mask&(1<= tv->table->row_count then it is a non-persistent row */
persistent = (tv->table->persistent != MSICONDITION_FALSE) &&
- (row < tv->table->row_count);
+ (tv->table->data_persistent[row]);
/* FIXME: should we allow updating keys? */
val = 0;
@@ -1469,8 +1449,10 @@ static UINT table_create_new_row( struct tagMSIVIEW *view, UINT *num, BOOL tempo
{
MSITABLEVIEW *tv = (MSITABLEVIEW*)view;
BYTE **p, *row;
+ BOOL *b;
UINT sz;
BYTE ***data_ptr;
+ BOOL **data_persist_ptr;
UINT *row_count;
TRACE("%p %s\n", view, temporary ? "TRUE" : "FALSE");
@@ -1482,20 +1464,11 @@ static UINT table_create_new_row( struct tagMSIVIEW *view, UINT *num, BOOL tempo
if( !row )
return ERROR_NOT_ENOUGH_MEMORY;
- if( temporary )
- {
- row_count = &tv->table->nonpersistent_row_count;
- data_ptr = &tv->table->nonpersistent_data;
- if (*num == -1)
- *num = tv->table->row_count + tv->table->nonpersistent_row_count;
- }
- else
- {
- row_count = &tv->table->row_count;
- data_ptr = &tv->table->data;
- if (*num == -1)
- *num = tv->table->row_count;
- }
+ row_count = &tv->table->row_count;
+ data_ptr = &tv->table->data;
+ data_persist_ptr = &tv->table->data_persistent;
+ if (*num == -1)
+ *num = tv->table->row_count;
sz = (*row_count + 1) * sizeof (BYTE*);
if( *data_ptr )
@@ -1508,8 +1481,24 @@ static UINT table_create_new_row( struct tagMSIVIEW *view, UINT *num, BOOL tempo
return ERROR_NOT_ENOUGH_MEMORY;
}
+ sz = (*row_count + 1) * sizeof (BOOL);
+ if( *data_persist_ptr )
+ b = msi_realloc( *data_persist_ptr, sz );
+ else
+ b = msi_alloc( sz );
+ if( !b )
+ {
+ msi_free( row );
+ msi_free( p );
+ return ERROR_NOT_ENOUGH_MEMORY;
+ }
+
*data_ptr = p;
(*data_ptr)[*row_count] = row;
+
+ *data_persist_ptr = b;
+ (*data_persist_ptr)[*row_count] = !temporary;
+
(*row_count)++;
return ERROR_SUCCESS;
@@ -1545,7 +1534,7 @@ static UINT TABLE_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *col
{
if( !tv->table )
return ERROR_INVALID_PARAMETER;
- *rows = tv->table->row_count + tv->table->nonpersistent_row_count;
+ *rows = tv->table->row_count;
}
return ERROR_SUCCESS;
@@ -1620,8 +1609,7 @@ static UINT table_validate_new( MSITABLEVIEW *tv, MSIRECORD *rec )
static UINT TABLE_insert_row( struct tagMSIVIEW *view, MSIRECORD *rec, UINT row, BOOL temporary )
{
MSITABLEVIEW *tv = (MSITABLEVIEW*)view;
- UINT i, r, idx, size;
- BYTE **data;
+ UINT i, r;
TRACE("%p %p %s\n", tv, rec, temporary ? "TRUE" : "FALSE" );
@@ -1635,27 +1623,16 @@ static UINT TABLE_insert_row( struct tagMSIVIEW *view, MSIRECORD *rec, UINT row,
if( r != ERROR_SUCCESS )
return r;
- idx = row;
- if( temporary )
- {
- data = tv->table->nonpersistent_data;
- size = tv->table->nonpersistent_row_count;
- idx -= tv->table->row_count;
- }
- else
- {
- data = tv->table->data;
- size = tv->table->row_count;
- }
-
/* shift the rows to make room for the new row */
- if( idx != size - 1 )
+ for (i = tv->table->row_count - 1; i > row; i--)
{
- for (i = 1; i < size - idx; i++)
- memmove(&(data[size - i][0]),
- &(data[size - i - 1][0]), tv->row_size);
+ memmove(&(tv->table->data[i][0]),
+ &(tv->table->data[i - 1][0]), tv->row_size);
+ tv->table->data_persistent[i] = tv->table->data_persistent[i - 1];
}
+ /* Re-set the persistence flag */
+ tv->table->data_persistent[row] = !temporary;
return TABLE_set_row( view, row, rec, (1<num_cols) - 1 );
}
@@ -1663,7 +1640,6 @@ static UINT TABLE_delete_row( struct tagMSIVIEW *view, UINT row )
{
MSITABLEVIEW *tv = (MSITABLEVIEW*)view;
UINT r, num_rows, num_cols, i;
- BYTE **data;
TRACE("%p %d\n", tv, row);
@@ -1677,19 +1653,8 @@ static UINT TABLE_delete_row( struct tagMSIVIEW *view, UINT row )
if ( row >= num_rows )
return ERROR_FUNCTION_FAILED;
- if ( row < tv->table->row_count )
- {
- num_rows = tv->table->row_count;
- tv->table->row_count--;
- data = tv->table->data;
- }
- else
- {
- num_rows = tv->table->nonpersistent_row_count;
- row -= tv->table->row_count;
- tv->table->nonpersistent_row_count--;
- data = tv->table->nonpersistent_data;
- }
+ num_rows = tv->table->row_count;
+ tv->table->row_count--;
/* reset the hash tables */
for (i = 0; i < tv->num_cols; i++)
@@ -1702,7 +1667,10 @@ static UINT TABLE_delete_row( struct tagMSIVIEW *view, UINT row )
return ERROR_SUCCESS;
for (i = row + 1; i < num_rows; i++)
- memcpy(data[i - 1], data[i], tv->row_size);
+ {
+ memcpy(tv->table->data[i - 1], tv->table->data[i], tv->row_size);
+ tv->table->data_persistent[i - 1] = tv->table->data_persistent[i];
+ }
return ERROR_SUCCESS;
}
@@ -1856,7 +1824,7 @@ static UINT TABLE_find_matching_rows( struct tagMSIVIEW *view, UINT col,
if( !tv->columns[col-1].hash_table )
{
UINT i;
- UINT num_rows = tv->table->row_count + tv->table->nonpersistent_row_count;
+ UINT num_rows = tv->table->row_count;
MSICOLUMNHASHENTRY **hash_table;
MSICOLUMNHASHENTRY *new_entry;
@@ -2625,7 +2593,7 @@ static UINT msi_table_find_row( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *row )
data = msi_record_to_row( tv, rec );
if( !data )
return r;
- for( i = 0; i < tv->table->row_count + tv->table->nonpersistent_row_count; i++ )
+ for( i = 0; i < tv->table->row_count; i++ )
{
r = msi_row_matches( tv, i, data );
if( r == ERROR_SUCCESS )
diff --git a/reactos/dll/win32/netshell/lang/cs-CZ.rc b/reactos/dll/win32/netshell/lang/cs-CZ.rc
index 911be289f57..3a1dcc91f61 100644
--- a/reactos/dll/win32/netshell/lang/cs-CZ.rc
+++ b/reactos/dll/win32/netshell/lang/cs-CZ.rc
@@ -5,23 +5,24 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION
CAPTION "Obecn nastaven"
FONT 8, "MS Shell Dlg"
BEGIN
- CONTROL "", IDC_COMPONENTSLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 9, 71, 230, 55
- LTEXT "Pipojit prostednictvm:", -1, 9,9,217,8
- EDITTEXT IDC_NETCARDNAME, 9, 21, 230, 12, WS_BORDER | WS_DISABLED | WS_TABSTOP
- PUSHBUTTON "&Nastavit", IDC_CONFIGURE, 189, 38, 50, 14
- LTEXT "Vybran komponenty jsou pouvny tmto pipojenm:", -1, 9, 59, 217, 8
- PUSHBUTTON "&Instalovat", IDC_INSTALL, 9, 130, 65, 14, WS_DISABLED | WS_TABSTOP
- PUSHBUTTON "&Odstranit", IDC_UNINSTALL, 90, 130, 65, 14, WS_DISABLED | WS_TABSTOP
- PUSHBUTTON "&Vlastnosti", IDC_PROPERTIES, 174, 130, 65, 14
- GROUPBOX "Popis", -1, 9, 153, 230, 46, BS_GROUPBOX
- LTEXT "Tak tady bude popis komponenty...", IDC_DESCRIPTION, 15, 165, 217, 28, WS_GROUP
- CHECKBOX "Po pipojen zobrazit ikonu na hlavnm panelu", IDC_SHOWTASKBAR, 9, 206, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP
- CHECKBOX "Upozornit, kdy bude pipojen omezen nebo peruen", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP
+ CONTROL "", IDC_COMPONENTSLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 9, 71, 230, 55
+ LTEXT "Pipojit prostednictvm:", -1, 9,9,217,8
+ EDITTEXT IDC_NETCARDNAME, 9, 21, 230, 12, WS_BORDER | WS_TABSTOP | ES_READONLY
+ PUSHBUTTON "&Nastavit", IDC_CONFIGURE, 189, 38, 50, 14
+ LTEXT "Vybran komponenty jsou pouvny tmto pipojenm:", -1, 9, 59, 217, 8
+ LISTBOX IDC_COMPONENTSLIST, 9, 71, 230, 55, LBS_NOTIFY | WS_VSCROLL | WS_BORDER | LBS_NOINTEGRALHEIGHT
+ PUSHBUTTON "&Instalovat", IDC_INSTALL, 9, 130, 65, 14, WS_DISABLED | WS_TABSTOP
+ PUSHBUTTON "&Odstranit", IDC_UNINSTALL, 90, 130, 65, 14, WS_DISABLED | WS_TABSTOP
+ PUSHBUTTON "&Vlastnosti", IDC_PROPERTIES, 174, 130, 65, 14
+ GROUPBOX "Popis", -1, 9, 153, 230, 46, BS_GROUPBOX
+ LTEXT "Tak tady bude popis komponenty...", IDC_DESCRIPTION, 15, 165, 217, 28, WS_GROUP
+ CHECKBOX "Po pipojen zobrazit ikonu na hlavnm panelu", IDC_SHOWTASKBAR, 9, 206, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP
+ CHECKBOX "&Notify me when this connection has limited or no connectivity", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 24, BS_AUTOCHECKBOX | WS_TABSTOP
END
IDD_STATUS DIALOGEX DISCARDABLE 0, 0, 200, 280
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Allgemein"
+CAPTION "General"
FONT 8, "MS Shell Dlg"
BEGIN
END
@@ -31,22 +32,22 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION
CAPTION "Obecn nastaven"
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX "Spojen", -1, 9, 8, 182, 58, BS_GROUPBOX
- LTEXT "Stav:", -1, 19, 20, 60, 8
- LTEXT "Doba pipojen:", -1, 19, 34, 60, 8
- LTEXT "Rychlost:", -1, 19, 48, 60, 8
- GROUPBOX "Aktivita", -1, 9, 74, 182, 70, BS_GROUPBOX
- RTEXT "Odeslno", -1, 26, 90, 60, 8
- ICON IDI_NETSTAT, -1, 110, 85, 32, 32
- LTEXT "Pijato", -1, 149, 90, 37, 8
- LTEXT "Byt:", -1, 17, 115, 32, 8
- RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8
- RTEXT "000.000.000", IDC_RECEIVED, 139, 115, 44, 8
- PUSHBUTTON "&Vlastnosti", IDC_STATUS_PROPERTIES, 10, 150, 50, 14
- PUSHBUTTON "&Zakzat", IDC_ENDISABLE, 66, 150, 50, 14
- RTEXT "",IDC_STATUS,83,20,98,8
- RTEXT "",IDC_DURATION,83,34,98,8
- RTEXT "",IDC_SPEED,83,48,98,8
+ GROUPBOX "Spojen", -1, 9, 8, 182, 58, BS_GROUPBOX
+ LTEXT "Stav:", -1, 19, 20, 60, 8
+ LTEXT "Doba pipojen:", -1, 19, 34, 60, 8
+ LTEXT "Rychlost:", -1, 19, 48, 60, 8
+ GROUPBOX "Aktivita", -1, 9, 74, 182, 70, BS_GROUPBOX
+ RTEXT "Odeslno", -1, 26, 90, 60, 8
+ ICON IDI_NETSTAT, -1, 110, 85, 32, 32
+ LTEXT "Pijato", -1, 149, 90, 37, 8
+ LTEXT "Byt:", -1, 17, 115, 32, 8
+ RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8
+ RTEXT "000.000.000", IDC_RECEIVED, 139, 115, 44, 8
+ PUSHBUTTON "&Vlastnosti", IDC_PROPERTIES, 10, 150, 50, 14
+ PUSHBUTTON "&Zakzat", IDC_ENDISABLE, 66, 150, 50, 14
+ RTEXT "",IDC_STATUS,83,20,98,8
+ RTEXT "",IDC_DURATION,83,34,98,8
+ RTEXT "",IDC_SPEED,83,48,98,8
END
IDD_LAN_NETSTATUSADVANCED DIALOGEX DISCARDABLE 0, 0, 200,180
@@ -54,18 +55,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Podpora"
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX "Stav pipojen", -1, 9, 8, 200, 88, BS_GROUPBOX
- LTEXT "Typ adresy:", -1, 22, 20, 80, 8
- LTEXT "IP adresa:", -1, 22, 34, 80, 8
- LTEXT "Maska podst:", -1, 22, 48, 80, 8
- LTEXT "Vchoz brna:", -1, 22, 62, 80, 8
+ GROUPBOX "Stav pipojen", -1, 9, 8, 200, 88, BS_GROUPBOX
+ LTEXT "Typ adresy:", -1, 22, 20, 80, 8
+ LTEXT "IP adresa:", -1, 22, 34, 80, 8
+ LTEXT "Maska podst:", -1, 22, 48, 80, 8
+ LTEXT "Vchoz brna:", -1, 22, 62, 80, 8
- RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
- RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
- RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
- RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
+ RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
+ RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
+ RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
+ RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
- PUSHBUTTON "&Detaily...", IDC_DETAILS, 22, 76, 62, 14
+ PUSHBUTTON "&Detaily...", IDC_DETAILS, 22, 76, 62, 14
END
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
@@ -73,54 +74,54 @@ STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
CAPTION "Network Connection Details"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Network Connection &Details:", -1, 15, 9, 170, 12
- CONTROL "", IDC_DETAILS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 25, 170, 130
- PUSHBUTTON "&Close", IDC_CLOSE, 125, 165, 62, 14
+ LTEXT "Network Connection &Details:", -1, 15, 9, 170, 12
+ CONTROL "", IDC_DETAILS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 25, 170, 130
+ PUSHBUTTON "&Close", IDC_CLOSE, 125, 165, 62, 14
END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_PHYSICAL_ADDRESS "Physical Address"
- IDS_IP_ADDRESS "IP Address"
- IDS_SUBNET_MASK "Subnet Mask"
- IDS_DEF_GATEWAY "Default Gateway"
- IDS_DHCP_SERVER "DHCP Server"
- IDS_LEASE_OBTAINED "Lease Obtained"
- IDS_LEASE_EXPIRES "Lease Expires"
- IDS_DNS_SERVERS "DNS Servers"
- IDS_WINS_SERVERS "WINS Servers"
- IDS_PROPERTY "Property"
- IDS_VALUE "Value"
- IDS_NETWORKCONNECTION "Network Connection"
- IDS_SHV_COLUMN_NAME "Name"
- IDS_SHV_COLUMN_TYPE "Type"
- IDS_SHV_COLUMN_STATE "Status"
- IDS_SHV_COLUMN_DEVNAME "Device Name"
- IDS_SHV_COLUMN_PHONE "Phone # or Host Address"
- IDS_SHV_COLUMN_OWNER "Owner"
- IDS_TYPE_ETHERNET "LAN or High-Speed Internet"
- IDS_STATUS_NON_OPERATIONAL "Disabled"
- IDS_STATUS_UNREACHABLE "Not Connected"
- IDS_STATUS_DISCONNECTED "Network cable unplugged"
- IDS_STATUS_CONNECTING "Acquiring network address"
- IDS_STATUS_CONNECTED "Connected"
- IDS_STATUS_OPERATIONAL "Connected"
+ IDS_PHYSICAL_ADDRESS "Physical Address"
+ IDS_IP_ADDRESS "IP Address"
+ IDS_SUBNET_MASK "Subnet Mask"
+ IDS_DEF_GATEWAY "Default Gateway"
+ IDS_DHCP_SERVER "DHCP Server"
+ IDS_LEASE_OBTAINED "Lease Obtained"
+ IDS_LEASE_EXPIRES "Lease Expires"
+ IDS_DNS_SERVERS "DNS Servers"
+ IDS_WINS_SERVERS "WINS Servers"
+ IDS_PROPERTY "Property"
+ IDS_VALUE "Value"
+ IDS_NETWORKCONNECTION "Network Connection"
+ IDS_SHV_COLUMN_NAME "Name"
+ IDS_SHV_COLUMN_TYPE "Type"
+ IDS_SHV_COLUMN_STATE "Status"
+ IDS_SHV_COLUMN_DEVNAME "Device Name"
+ IDS_SHV_COLUMN_PHONE "Phone # or Host Address"
+ IDS_SHV_COLUMN_OWNER "Owner"
+ IDS_TYPE_ETHERNET "LAN or High-Speed Internet"
+ IDS_STATUS_NON_OPERATIONAL "Disabled"
+ IDS_STATUS_UNREACHABLE "Not Connected"
+ IDS_STATUS_DISCONNECTED "Network cable unplugged"
+ IDS_STATUS_CONNECTING "Acquiring network address"
+ IDS_STATUS_CONNECTED "Connected"
+ IDS_STATUS_OPERATIONAL "Connected"
- IDS_NET_ACTIVATE "Enable"
- IDS_NET_DEACTIVATE "Disable"
- IDS_NET_STATUS "Status"
- IDS_NET_REPAIR "Repair"
- IDS_NET_CREATELINK "Create Shortcut"
- IDS_NET_DELETE "Delete"
- IDS_NET_PROPERTIES "Properties"
+ IDS_NET_ACTIVATE "Enable"
+ IDS_NET_DEACTIVATE "Disable"
+ IDS_NET_STATUS "Status"
+ IDS_NET_REPAIR "Repair"
+ IDS_NET_CREATELINK "Create Shortcut"
+ IDS_NET_DELETE "Delete"
+ IDS_NET_PROPERTIES "Properties"
- IDS_FORMAT_BIT "%u Bit/s"
- IDS_FORMAT_KBIT "%u KBit/s"
- IDS_FORMAT_MBIT "%u MBit/s"
- IDS_FORMAT_GBIT "%u GBit/s"
- IDS_DURATION_DAY "%d Day %s"
- IDS_DURATION_DAYS "%d Days %s"
- IDS_ASSIGNED_DHCP "Piazeno DHCP"
- IDS_ASSIGNED_MANUAL "Run nastaveno"
+ IDS_FORMAT_BIT "%u Bit/s"
+ IDS_FORMAT_KBIT "%u KBit/s"
+ IDS_FORMAT_MBIT "%u MBit/s"
+ IDS_FORMAT_GBIT "%u GBit/s"
+ IDS_DURATION_DAY "%d Day %s"
+ IDS_DURATION_DAYS "%d Days %s"
+ IDS_ASSIGNED_DHCP "Piazeno DHCP"
+ IDS_ASSIGNED_MANUAL "Run nastaveno"
END
diff --git a/reactos/dll/win32/netshell/lang/no-NO.rc b/reactos/dll/win32/netshell/lang/no-NO.rc
index 6970dd5e2f2..31fafa28464 100644
--- a/reactos/dll/win32/netshell/lang/no-NO.rc
+++ b/reactos/dll/win32/netshell/lang/no-NO.rc
@@ -5,23 +5,23 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION
CAPTION "Generielt"
FONT 8, "MS Shell Dlg"
BEGIN
- CONTROL "", IDC_COMPONENTSLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 9, 71, 230, 55
- LTEXT "Koble til med:", -1, 9,9,217,8
- EDITTEXT IDC_NETCARDNAME, 9, 21, 230, 12, WS_BORDER | WS_DISABLED | WS_TABSTOP
- PUSHBUTTON "&Konfigurere", IDC_CONFIGURE, 189, 38, 50, 14
- LTEXT "Komponentene bruker flgende elementer for tilkobling:", -1, 9, 59, 217, 8
- PUSHBUTTON "&Installere", IDC_INSTALL, 9, 130, 65, 14, WS_DISABLED | WS_TABSTOP
- PUSHBUTTON "&Avinstallere", IDC_UNINSTALL, 90, 130, 65, 14, WS_DISABLED | WS_TABSTOP
- PUSHBUTTON "&Egenskaper", IDC_PROPERTIES, 174, 130, 65, 14
- GROUPBOX "Beskrivelse", -1, 9, 153, 230, 46, BS_GROUPBOX
- LTEXT "Komponent beskrivelse kommer her...", IDC_DESCRIPTION, 15, 165, 217, 28, WS_GROUP
- CHECKBOX "Vis ikon i oppgavelinjen nr tilkoblet", IDC_SHOWTASKBAR, 9, 206, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP
- CHECKBOX "Gi beskjed hvis denne tilkoblingen har begrenset eller ingen tilkobling", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP
+ CONTROL "", IDC_COMPONENTSLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 9, 71, 230, 55
+ LTEXT "Koble til med:", -1, 9,9,217,8
+ EDITTEXT IDC_NETCARDNAME, 9, 21, 230, 12, WS_BORDER | WS_TABSTOP | ES_READONLY
+ PUSHBUTTON "&Konfigurere", IDC_CONFIGURE, 189, 38, 50, 14
+ LTEXT "Komponentene bruker flgende elementer for tilkobling:", -1, 9, 59, 217, 8
+ PUSHBUTTON "&Installere", IDC_INSTALL, 9, 130, 65, 14, WS_DISABLED | WS_TABSTOP
+ PUSHBUTTON "&Avinstallere", IDC_UNINSTALL, 90, 130, 65, 14, WS_DISABLED | WS_TABSTOP
+ PUSHBUTTON "&Egenskaper", IDC_PROPERTIES, 174, 130, 65, 14
+ GROUPBOX "Beskrivelse", -1, 9, 153, 230, 46, BS_GROUPBOX
+ LTEXT "Komponent beskrivelse kommer her...", IDC_DESCRIPTION, 15, 165, 217, 28, WS_GROUP
+ CHECKBOX "Vis ikon i oppgavelinjen nr tilkoblet", IDC_SHOWTASKBAR, 9, 206, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP
+ CHECKBOX "Gi beskjed hvis denne tilkoblingen har begrenset eller ingen tilkobling", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP
END
IDD_STATUS DIALOGEX DISCARDABLE 0, 0, 200, 280
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Allgemein"
+CAPTION "Generielt"
FONT 8, "MS Shell Dlg"
BEGIN
END
@@ -31,25 +31,22 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION
CAPTION "Generielt"
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX "Tilkobling", -1, 9, 8, 182, 58, BS_GROUPBOX
- LTEXT "Status:", -1, 19, 20, 60, 8
- LTEXT "Varighet:", -1, 19, 34, 60, 8
- LTEXT "Hastighet:", -1, 19, 48, 60, 8
- GROUPBOX "Aktivitet", -1, 9, 74, 182, 70, BS_GROUPBOX
- RTEXT "Sendt", -1, 26, 90, 60, 8
- ICON IDI_HORIZONTAL, -1, 90, 85, 18, 20
- ICON IDI_NETSTAT, -1, 110, 85, 18, 20
- ICON IDI_HORIZONTAL, -1, 130, 85, 18, 20
- LTEXT "Mottatt", -1, 149, 90, 37, 8
- LTEXT "Byte:", -1, 17, 115, 32, 8
- RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8
- ICON IDI_VERTICAL, -1, 110, 108, 18, 20
- RTEXT "000.000.000", IDC_RECEIVED, 139, 115, 44, 8
- PUSHBUTTON "&Egenskaper", IDC_STATUS_PROPERTIES, 10, 150, 50, 14
- PUSHBUTTON "&Deaktiver", IDC_ENDISABLE, 66, 150, 50, 14
- RTEXT "",IDC_STATUS,83,20,98,8
- RTEXT "",IDC_DURATION,83,34,98,8
- RTEXT "",IDC_SPEED,83,48,98,8
+ GROUPBOX "Tilkobling", -1, 9, 8, 182, 58, BS_GROUPBOX
+ LTEXT "Status:", -1, 19, 20, 60, 8
+ LTEXT "Varighet:", -1, 19, 34, 60, 8
+ LTEXT "Hastighet:", -1, 19, 48, 60, 8
+ GROUPBOX "Aktivitet", -1, 9, 74, 182, 70, BS_GROUPBOX
+ RTEXT "Sendt", -1, 26, 90, 60, 8
+ ICON IDI_NETSTAT, -1, 110, 85, 32, 32
+ LTEXT "Mottatt", -1, 149, 90, 37, 8
+ LTEXT "Byte:", -1, 17, 115, 32, 8
+ RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8
+ RTEXT "000.000.000", IDC_RECEIVED, 139, 115, 44, 8
+ PUSHBUTTON "&Egenskaper", IDC_STATUS_PROPERTIES, 10, 150, 50, 14
+ PUSHBUTTON "&Deaktiver", IDC_ENDISABLE, 66, 150, 50, 14
+ RTEXT "",IDC_STATUS,83,20,98,8
+ RTEXT "",IDC_DURATION,83,34,98,8
+ RTEXT "",IDC_SPEED,83,48,98,8
END
IDD_LAN_NETSTATUSADVANCED DIALOGEX DISCARDABLE 0, 0, 200,180
@@ -57,18 +54,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Hjelp"
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX "Tilkoblingsstatus", -1, 9, 8, 200, 88, BS_GROUPBOX
- LTEXT "Adressetype:", -1, 22, 20, 80, 8
- LTEXT "IP adresse:", -1, 22, 34, 80, 8
- LTEXT "Subnet maske:", -1, 22, 48, 80, 8
- LTEXT "Standard Gateway:", -1, 22, 62, 80, 8
-
- RTEXT "Ikke tilgjengelig", IDC_DETAILSTYPE, 122, 20, 80, 8
- RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
- RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
- RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
-
- PUSHBUTTON "&Detaljer...", IDC_DETAILS, 22, 76, 62, 14
+ GROUPBOX "Tilkoblingsstatus", -1, 9, 8, 200, 88, BS_GROUPBOX
+ LTEXT "Adressetype:", -1, 22, 20, 80, 8
+ LTEXT "IP adresse:", -1, 22, 34, 80, 8
+ LTEXT "Subnet maske:", -1, 22, 48, 80, 8
+ LTEXT "Standard Gateway:", -1, 22, 62, 80, 8
+
+ RTEXT "Ikke tilgjengelig", IDC_DETAILSTYPE, 122, 20, 80, 8
+ RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
+ RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
+ RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
+
+ PUSHBUTTON "&Detaljer...", IDC_DETAILS, 22, 76, 62, 14
END
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
@@ -76,54 +73,54 @@ STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
CAPTION "Nettverk tilkobling detaljer"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Nettverk tilkobling &detaljer:", -1, 15, 9, 170, 12
- CONTROL "", IDC_DETAILS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 25, 170, 130
- PUSHBUTTON "&Lukk", IDC_CLOSE, 125, 165, 62, 14
+ LTEXT "Nettverk tilkobling &detaljer:", -1, 15, 9, 170, 12
+ CONTROL "", IDC_DETAILS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 25, 170, 130
+ PUSHBUTTON "&Lukk", IDC_CLOSE, 125, 165, 62, 14
END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_PHYSICAL_ADDRESS "Physical Address"
- IDS_IP_ADDRESS "IP addresse"
- IDS_SUBNET_MASK "Subnet Mask"
- IDS_DEF_GATEWAY "Default Gateway"
- IDS_DHCP_SERVER "DHCP Server"
- IDS_LEASE_OBTAINED "Lease Obtained"
- IDS_LEASE_EXPIRES "Lease Expires"
- IDS_DNS_SERVERS "DNS Servers"
- IDS_WINS_SERVERS "WINS Servers"
- IDS_PROPERTY "Property"
- IDS_VALUE "Value"
- IDS_NETWORKCONNECTION "Nettverk tilkobling"
- IDS_SHV_COLUMN_NAME "Navn"
- IDS_SHV_COLUMN_TYPE "Type"
- IDS_SHV_COLUMN_STATE "Status"
- IDS_SHV_COLUMN_DEVNAME "Enhetsnavn"
- IDS_SHV_COLUMN_PHONE "Telefon # eller vert address"
- IDS_SHV_COLUMN_OWNER "Eier"
- IDS_TYPE_ETHERNET "Nettverk eller hy-hastighet internett"
- IDS_STATUS_NON_OPERATIONAL "Deaktivert"
- IDS_STATUS_UNREACHABLE "Ikke tilkoblet"
- IDS_STATUS_DISCONNECTED "Nettverk kabel er frakoblet"
- IDS_STATUS_CONNECTING "Henter nettverk addresse"
- IDS_STATUS_CONNECTED "Tilkoblet"
- IDS_STATUS_OPERATIONAL "Tilkoblet"
+ IDS_PHYSICAL_ADDRESS "Fysisk adresse"
+ IDS_IP_ADDRESS "IP addresse"
+ IDS_SUBNET_MASK "Subnet Maske"
+ IDS_DEF_GATEWAY "Standard Gateway"
+ IDS_DHCP_SERVER "DHCP tjener"
+ IDS_LEASE_OBTAINED "Lease Obtained"
+ IDS_LEASE_EXPIRES "Lease Expires"
+ IDS_DNS_SERVERS "DNS tjenere"
+ IDS_WINS_SERVERS "WINS tjenere"
+ IDS_PROPERTY "Egenskaper"
+ IDS_VALUE "Verdi"
+ IDS_NETWORKCONNECTION "Nettverk tilkobling"
+ IDS_SHV_COLUMN_NAME "Navn"
+ IDS_SHV_COLUMN_TYPE "Type"
+ IDS_SHV_COLUMN_STATE "Status"
+ IDS_SHV_COLUMN_DEVNAME "Enhetsnavn"
+ IDS_SHV_COLUMN_PHONE "Telefon # eller vert addresse"
+ IDS_SHV_COLUMN_OWNER "Eier"
+ IDS_TYPE_ETHERNET "Nettverk eller hy-hastighet internett"
+ IDS_STATUS_NON_OPERATIONAL "Deaktivert"
+ IDS_STATUS_UNREACHABLE "Ikke tilkoblet"
+ IDS_STATUS_DISCONNECTED "Nettverkkabel er frakoblet"
+ IDS_STATUS_CONNECTING "Henter nettverk addresse"
+ IDS_STATUS_CONNECTED "Tilkoblet"
+ IDS_STATUS_OPERATIONAL "Tilkoblet"
- IDS_NET_ACTIVATE "Aktivere"
- IDS_NET_DEACTIVATE "Deaktivere"
- IDS_NET_STATUS "Status"
- IDS_NET_REPAIR "Reparere"
- IDS_NET_CREATELINK "Opprett snarvei"
- IDS_NET_DELETE "Slett"
- IDS_NET_PROPERTIES "Egenskaper"
+ IDS_NET_ACTIVATE "Aktivere"
+ IDS_NET_DEACTIVATE "Deaktivere"
+ IDS_NET_STATUS "Status"
+ IDS_NET_REPAIR "Reparere"
+ IDS_NET_CREATELINK "Opprett snarvei"
+ IDS_NET_DELETE "Slett"
+ IDS_NET_RENAME "Rename"
+ IDS_NET_PROPERTIES "Egenskaper"
- IDS_FORMAT_BIT "%u Bit/s"
- IDS_FORMAT_KBIT "%u KBit/s"
- IDS_FORMAT_MBIT "%u MBit/s"
- IDS_FORMAT_GBIT "%u GBit/s"
- IDS_DURATION_DAY "%d dag %s"
- IDS_DURATION_DAYS "%d dager %s"
- IDS_ASSIGNED_DHCP "Tilordnet av DHCP"
- IDS_ASSIGNED_MANUAL "Manuelt konfigurert"
+ IDS_FORMAT_BIT "%u Bit/s"
+ IDS_FORMAT_KBIT "%u KBit/s"
+ IDS_FORMAT_MBIT "%u MBit/s"
+ IDS_FORMAT_GBIT "%u GBit/s"
+ IDS_DURATION_DAY "%d dag %s"
+ IDS_DURATION_DAYS "%d dager %s"
+ IDS_ASSIGNED_DHCP "Tilordnet av DHCP"
+ IDS_ASSIGNED_MANUAL "Manuelt konfigurert"
END
-
diff --git a/reactos/dll/win32/netshell/lang/ro-RO.rc b/reactos/dll/win32/netshell/lang/ro-RO.rc
new file mode 100644
index 00000000000..3a52b7df5b2
--- /dev/null
+++ b/reactos/dll/win32/netshell/lang/ro-RO.rc
@@ -0,0 +1,126 @@
+LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+
+IDD_NETPROPERTIES DIALOGEX DISCARDABLE 0, 0, 246, 246
+STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION
+CAPTION "General"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "", IDC_COMPONENTSLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 9, 71, 230, 55
+ LTEXT "Connectare folosing:", -1, 9,9,217,8
+ EDITTEXT IDC_NETCARDNAME, 9, 21, 230, 12, WS_BORDER | WS_TABSTOP | ES_READONLY
+ PUSHBUTTON "&Configurare", IDC_CONFIGURE, 189, 38, 50, 14
+ LTEXT "Componentele verificate sunt folosite de aceast conexiune:", -1, 9, 59, 217, 8
+ PUSHBUTTON "&Instalare", IDC_INSTALL, 9, 130, 65, 14, WS_DISABLED | WS_TABSTOP
+ PUSHBUTTON "&Dezinstalare", IDC_UNINSTALL, 90, 130, 65, 14, WS_DISABLED | WS_TABSTOP
+ PUSHBUTTON "&Proprieti", IDC_PROPERTIES, 174, 130, 65, 14
+ GROUPBOX "Descriere", -1, 9, 153, 230, 46, BS_GROUPBOX
+ LTEXT "Descriere...", IDC_DESCRIPTION, 15, 165, 217, 28, WS_GROUP
+ CHECKBOX "&Afiare pictogram n tray", IDC_SHOWTASKBAR, 9, 206, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP
+ CHECKBOX "&Notificare la probleme de conectivitate", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP
+END
+
+IDD_STATUS DIALOGEX DISCARDABLE 0, 0, 200, 280
+STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "General"
+FONT 8, "MS Shell Dlg"
+BEGIN
+END
+
+IDD_LAN_NETSTATUS DIALOGEX DISCARDABLE 0, 0, 200,180
+STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION
+CAPTION "General"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Conexiune", -1, 9, 8, 182, 58, BS_GROUPBOX
+ LTEXT "Stare:", -1, 19, 20, 60, 8
+ LTEXT "Durat:", -1, 19, 34, 60, 8
+ LTEXT "Vitez:", -1, 19, 48, 60, 8
+ GROUPBOX "Activitate", -1, 9, 74, 182, 70, BS_GROUPBOX
+ RTEXT "Trimis", -1, 26, 90, 60, 8
+ ICON IDI_NETSTAT, -1, 110, 85, 32, 32
+ LTEXT "Primit", -1, 149, 90, 37, 8
+ LTEXT "Octei:", -1, 17, 115, 32, 8
+ RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8
+ RTEXT "000.000.000", IDC_RECEIVED, 139, 115, 44, 8
+ PUSHBUTTON "&Proprieti", IDC_STATUS_PROPERTIES, 10, 150, 50, 14
+ PUSHBUTTON "&Dezactivare", IDC_ENDISABLE, 66, 150, 50, 14
+ RTEXT "",IDC_STATUS,83,20,98,8
+ RTEXT "",IDC_DURATION,83,34,98,8
+ RTEXT "",IDC_SPEED,83,48,98,8
+END
+
+IDD_LAN_NETSTATUSADVANCED DIALOGEX DISCARDABLE 0, 0, 200,180
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Suport"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Stare conexiune", -1, 9, 8, 200, 88, BS_GROUPBOX
+ LTEXT "Tip adres:", -1, 22, 20, 80, 8
+ LTEXT "Adres IP:", -1, 22, 34, 80, 8
+ LTEXT "Masc subreea:", -1, 22, 48, 80, 8
+ LTEXT "Poart implicit:", -1, 22, 62, 80, 8
+
+ RTEXT "fr", IDC_DETAILSTYPE, 122, 20, 80, 8
+ RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
+ RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
+ RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
+
+ PUSHBUTTON "&Detalii...", IDC_DETAILS, 22, 76, 62, 14
+END
+
+IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
+STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
+CAPTION "Detalii conexiune reea"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Detalii conexiune reea:", -1, 15, 9, 170, 12
+ CONTROL "", IDC_DETAILS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 25, 170, 130
+ PUSHBUTTON "&nchidere", IDC_CLOSE, 125, 165, 62, 14
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_PHYSICAL_ADDRESS "Adres fizic"
+ IDS_IP_ADDRESS "Adres de IP"
+ IDS_SUBNET_MASK "Masc subreea"
+ IDS_DEF_GATEWAY "Poart implicit"
+ IDS_DHCP_SERVER "Server DHCP"
+ IDS_LEASE_OBTAINED "Permis obinut"
+ IDS_LEASE_EXPIRES "Permis expir"
+ IDS_DNS_SERVERS "Servere DNS"
+ IDS_WINS_SERVERS "Servere WINS"
+ IDS_PROPERTY "Proprietate"
+ IDS_VALUE "Valoare"
+ IDS_NETWORKCONNECTION "Conexiuni la reea"
+ IDS_SHV_COLUMN_NAME "Nume"
+ IDS_SHV_COLUMN_TYPE "Tipe"
+ IDS_SHV_COLUMN_STATE "Stare"
+ IDS_SHV_COLUMN_DEVNAME "Nume dispozitiv"
+ IDS_SHV_COLUMN_PHONE "Nr. tel. sau adres de gazd"
+ IDS_SHV_COLUMN_OWNER "Proprietar"
+ IDS_TYPE_ETHERNET "LAN sau internet de mare vitez"
+ IDS_STATUS_NON_OPERATIONAL "Dezactivat"
+ IDS_STATUS_UNREACHABLE "Neconectat"
+ IDS_STATUS_DISCONNECTED "Cablu de reea scos"
+ IDS_STATUS_CONNECTING "Determinare adres reea"
+ IDS_STATUS_CONNECTED "Conectat"
+ IDS_STATUS_OPERATIONAL "Conectat"
+
+ IDS_NET_ACTIVATE "Activare"
+ IDS_NET_DEACTIVATE "Dezactivare"
+ IDS_NET_STATUS "Stare"
+ IDS_NET_REPAIR "Reparare"
+ IDS_NET_CREATELINK "Creare legtur"
+ IDS_NET_DELETE "tergere"
+ IDS_NET_RENAME "Redenumire"
+ IDS_NET_PROPERTIES "Proprieti"
+
+ IDS_FORMAT_BIT "%u Bii/s"
+ IDS_FORMAT_KBIT "%u KBii/s"
+ IDS_FORMAT_MBIT "%u MBii/s"
+ IDS_FORMAT_GBIT "%u GBii/s"
+ IDS_DURATION_DAY "%d zi %s"
+ IDS_DURATION_DAYS "%d zile %s"
+ IDS_ASSIGNED_DHCP "Atribuit de DHCP"
+ IDS_ASSIGNED_MANUAL "Configurat manual"
+END
diff --git a/reactos/dll/win32/netshell/netshell.rc b/reactos/dll/win32/netshell/netshell.rc
index e23580bc601..83f4617ebc2 100644
--- a/reactos/dll/win32/netshell/netshell.rc
+++ b/reactos/dll/win32/netshell/netshell.rc
@@ -37,6 +37,7 @@ IDI_NET_TRANSREC ICON "res/nettrrec.ico"
#include "lang/no-NO.rc"
#include "lang/nl-NL.rc"
#include "lang/pl-PL.rc"
+#include "lang/ro-RO.rc"
#include "lang/ru-RU.rc"
#include "lang/sk-SK.rc"
#include "lang/sv-SE.rc"
diff --git a/reactos/dll/win32/newdev/lang/ro-RO.rc b/reactos/dll/win32/newdev/lang/ro-RO.rc
index 84a309dde94..0489abfdce5 100644
--- a/reactos/dll/win32/newdev/lang/ro-RO.rc
+++ b/reactos/dll/win32/newdev/lang/ro-RO.rc
@@ -1,5 +1,7 @@
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
IDD_WELCOMEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION |
WS_SYSMENU
@@ -7,14 +9,14 @@ CAPTION "Instalare dispozitiv"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Bun venit",IDC_WELCOMETITLE,120,8,195,24
- LTEXT "Acest expert instaleaz un driver pentru dispozitivul:",
+ LTEXT "Acest expert instalează un driver pentru dispozitivul:",
IDC_STATIC,120,21,195,16
- LTEXT "Clic pe Urmtor pentru a continua.",IDC_STATIC,120,169,195,17
+ LTEXT "Clic pe Următor pentru a continua.",IDC_STATIC,120,169,195,17
LTEXT "DISPOZITIV NECUNOSCUT",IDC_DEVICE,134,36,164,11
- LTEXT "AVERTISMENT! INSTALAREA UNUI DISPOZITIV NECUNOSCUT POATE AVEA EFECTE GRAVE ASUPRA COMPUTERULUI DVS!",IDC_STATIC,120,59,195,16
- CONTROL "Instalare automat",IDC_RADIO_AUTO,"Button",
+ LTEXT "AVERTISMENT! INSTALAREA UNUI DISPOZITIV NECUNOSCUT POATE AVEA EFECTE GRAVE ASUPRA COMPUTERULUI DUMNEAVOASTRĂ!",IDC_STATIC,120,59,195,30
+ CONTROL "Instalare automată",IDC_RADIO_AUTO,"Button",
BS_AUTORADIOBUTTON,120,112,178,13
- CONTROL "Instalare driver din locaie specific",IDC_RADIO_MANUAL,
+ CONTROL "Instalare driver din locație specifică",IDC_RADIO_MANUAL,
"Button",BS_AUTORADIOBUTTON,120,133,164,14
END
@@ -24,12 +26,12 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION |
CAPTION "Instalare dispozitiv"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Instalarea a euat",IDC_FINISHTITLE,120,8,195,24
- LTEXT "Dispozitivul nu a fost instalat pentru c driverul nu a fost gsit.",
+ LTEXT "Instalarea a eșuat",IDC_FINISHTITLE,120,8,195,24
+ LTEXT "Dispozitivul nu a fost instalat pentru că driverul nu a fost găsit.",
IDC_STATIC,120,40,195,19
- LTEXT "Clic pe napoi dac avei un disc sau tii calea driverului.",
+ LTEXT "Clic pe Înapoi dacă aveți un disc sau știți calea driverului.",
IDC_STATIC,120,98,181,24
- CONTROL "Nu mai afia acest dialog",IDC_DONOTSHOWDLG,"Button",
+ CONTROL "Nu mai afișa acest dialog",IDC_DONOTSHOWDLG,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,120,170,180,11
END
@@ -39,8 +41,8 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION |
CAPTION "Instalare dispozitiv"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Instalarea a euat",IDC_FINISHTITLE,120,8,195,24
- LTEXT "Dispozitivul nu s-a instalat deoarece a fost ntmpinat o eroare neateptat.",
+ LTEXT "Instalarea a eșuat",IDC_FINISHTITLE,120,8,195,24
+ LTEXT "Dispozitivul nu s-a instalat deoarece a fost întâmpinată o eroare neașteptată.",
IDC_STATIC,120,40,195,19
LTEXT "DISPOZITIV NECUNOSCUT",IDC_DEVICE,134,55,164,11
END
@@ -50,15 +52,15 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYS
CAPTION "Instalare dispozitiv"
FONT 8, "MS Shell Dlg"
BEGIN
- CONTROL "Cutare n aceste locaii",IDC_RADIO_SEARCHHERE,"Button",
+ CONTROL "Căutare în aceste locații",IDC_RADIO_SEARCHHERE,"Button",
BS_AUTORADIOBUTTON,27,11,239,13
CONTROL "Alegere driver manual",IDC_RADIO_CHOOSE,"Button",
BS_AUTORADIOBUTTON,27,98,171,12
- CONTROL "Cutare pe amovabile",IDC_CHECK_MEDIA,"Button",
+ CONTROL "Căutare pe amovabile",IDC_CHECK_MEDIA,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,47,33,163,9
CONTROL "Includere cale",IDC_CHECK_PATH,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,47,54,162,10
- PUSHBUTTON "Rsfoire",IDC_BROWSE,248,69,50,14
+ PUSHBUTTON "Răsfoire",IDC_BROWSE,248,69,50,14
COMBOBOX IDC_COMBO_PATH,61,71,176,12,CBS_DROPDOWN | CBS_SORT |
WS_VSCROLL | WS_TABSTOP | CBS_AUTOHSCROLL
END
@@ -85,10 +87,10 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION |
CAPTION "Instalare dispozitiv"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Instalare complet",IDC_FINISHTITLE,120,8,195,11
- LTEXT "Trebuie s repornii pentru a finaliza instalarea:",
+ LTEXT "Instalare completă",IDC_FINISHTITLE,120,8,195,11
+ LTEXT "Trebuie să reporniți pentru a finaliza instalarea:",
IDC_STATIC,120,32,195,19
- LTEXT "Clic pe Termin pentru a nchide expertul.",IDC_STATIC,120,174,
+ LTEXT "Clic pe Termină pentru a închide expertul.",IDC_STATIC,120,174,
179,11
LTEXT "DISPOZITIV NECUNOSCUT",IDC_DEVICE,148,53,147,12
END
@@ -99,11 +101,12 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION |
CAPTION "Instalare dispozitiv"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Instalare complet",IDC_FINISHTITLE,120,8,195,11
+ LTEXT "Instalare completă",IDC_FINISHTITLE,120,8,195,11
LTEXT "Expertul a terminat instalarea dispozitivului:",
IDC_STATIC,120,32,195,19
- LTEXT "Clic pe Termin pentru a nchide expertul.",IDC_STATIC,120,174,
+ LTEXT "Clic pe Termină pentru a închide expertul.",IDC_STATIC,120,174,
179,11
LTEXT "DISPOZITIV NECUNOSCUT",IDC_DEVICE,148,53,147,12
END
+#pragma code_page(default)
diff --git a/reactos/dll/win32/setupapi/devinst.c b/reactos/dll/win32/setupapi/devinst.c
index 900a7310aaf..73853014a55 100644
--- a/reactos/dll/win32/setupapi/devinst.c
+++ b/reactos/dll/win32/setupapi/devinst.c
@@ -4137,8 +4137,19 @@ SetupDiGetDeviceInstallParamsW(
Source = &((struct DeviceInfo *)DeviceInfoData->Reserved)->InstallParams;
else
Source = &list->InstallParams;
- memcpy(DeviceInstallParams, Source, Source->cbSize);
+
ret = TRUE;
+
+ _SEH2_TRY
+ {
+ memcpy(DeviceInstallParams, Source, Source->cbSize);
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ SetLastError(RtlNtStatusToDosError(_SEH2_GetExceptionCode()));
+ ret = FALSE;
+ }
+ _SEH2_END;
}
TRACE("Returning %d\n", ret);
diff --git a/reactos/dll/win32/shell32/iconcache.c b/reactos/dll/win32/shell32/iconcache.c
index 2efe22cd7df..bc3ea24d699 100644
--- a/reactos/dll/win32/shell32/iconcache.c
+++ b/reactos/dll/win32/shell32/iconcache.c
@@ -884,8 +884,14 @@ HRESULT WINAPI SHDefExtractIconW(LPCWSTR pszIconFile, int iIndex, UINT uFlags,
if (ret == 0xFFFFFFFF)
return E_FAIL;
if (ret > 0) {
- *phiconLarge = hIcons[0];
- *phiconSmall = hIcons[1];
+ if (phiconLarge)
+ *phiconLarge = hIcons[0];
+ else
+ DestroyIcon(hIcons[0]);
+ if (phiconSmall)
+ *phiconSmall = hIcons[1];
+ else
+ DestroyIcon(hIcons[1]);
return S_OK;
}
return S_FALSE;
diff --git a/reactos/dll/win32/shell32/lang/bg-BG.rc b/reactos/dll/win32/shell32/lang/bg-BG.rc
index c8a656db410..20d27e51c60 100644
--- a/reactos/dll/win32/shell32/lang/bg-BG.rc
+++ b/reactos/dll/win32/shell32/lang/bg-BG.rc
@@ -155,7 +155,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT " , , .", 12289, 36, 11, 182, 18
LTEXT "&:", 12305, 7, 39, 40, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 46, 37, 180, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 46, 37, 180, 100
DEFPUSHBUTTON "", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/ca-ES.rc b/reactos/dll/win32/shell32/lang/ca-ES.rc
index 79e8d1955d4..0cc5637f269 100644
--- a/reactos/dll/win32/shell32/lang/ca-ES.rc
+++ b/reactos/dll/win32/shell32/lang/ca-ES.rc
@@ -155,7 +155,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18
LTEXT "&Open:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 36, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "Cancel", IDCANCEL, 98, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "&Browse...", 12288, 160, 63, 59, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc
index ad51d931a7e..ae55c09196f 100644
--- a/reactos/dll/win32/shell32/lang/cs-CZ.rc
+++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc
@@ -157,7 +157,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Zadejte nzev programu, sloky, dokumentu, nebo zdroje v sti Internet a ReactOS jej pro vs oteve.", 12289, 36, 11, 182, 18
LTEXT "&Otevt:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Storno", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Prochzet...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/da-DK.rc b/reactos/dll/win32/shell32/lang/da-DK.rc
index e4df8244254..ed886403bb7 100644
--- a/reactos/dll/win32/shell32/lang/da-DK.rc
+++ b/reactos/dll/win32/shell32/lang/da-DK.rc
@@ -143,7 +143,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Indtast navnet p det program, mappe, dokument, eller Internet Ressourcer, du vil have at ReactOS skal bne for dig.", 12289, 36, 11, 182, 18
LTEXT "&bn:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 36, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "Fortryd", IDCANCEL, 98, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "&Gennemse...", 12288, 160, 63, 59, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc
index 27ba0e785fb..4fddb91e164 100644
--- a/reactos/dll/win32/shell32/lang/de-DE.rc
+++ b/reactos/dll/win32/shell32/lang/de-DE.rc
@@ -157,7 +157,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Geben Sie den Namen eines Programms, eines Ordners, eines Dokuments oder einer Internetressource an.", 12289, 36, 11, 182, 18
LTEXT "&ffnen:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 36, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "Abbrechen", IDCANCEL, 98, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "&Durchsuchen...", 12288, 160, 63, 59, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/el-GR.rc b/reactos/dll/win32/shell32/lang/el-GR.rc
index b2701016338..daffadd56f0 100644
--- a/reactos/dll/win32/shell32/lang/el-GR.rc
+++ b/reactos/dll/win32/shell32/lang/el-GR.rc
@@ -155,7 +155,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT " , , , , ReactOS .", 12289, 36, 4, 182, 25
LTEXT "&:", 12305, 5, 39, 31, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 36, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "", IDCANCEL, 98, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "&...", 12288, 160, 63, 59, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/en-GB.rc b/reactos/dll/win32/shell32/lang/en-GB.rc
index 6442c02aeea..4ed09ad2772 100644
--- a/reactos/dll/win32/shell32/lang/en-GB.rc
+++ b/reactos/dll/win32/shell32/lang/en-GB.rc
@@ -155,7 +155,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18
LTEXT "&Open:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 36, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "Cancel", IDCANCEL, 98, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "&Browse...", 12288, 160, 63, 59, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc
index cab5d61d232..dcea9f1307b 100644
--- a/reactos/dll/win32/shell32/lang/en-US.rc
+++ b/reactos/dll/win32/shell32/lang/en-US.rc
@@ -155,7 +155,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18
LTEXT "&Open:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 36, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "Cancel", IDCANCEL, 98, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "&Browse...", 12288, 160, 63, 59, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc
index 95fb1d8e75b..2799ebab1d7 100644
--- a/reactos/dll/win32/shell32/lang/es-ES.rc
+++ b/reactos/dll/win32/shell32/lang/es-ES.rc
@@ -158,7 +158,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Introduzca el nombre de un programa, carpeta, documento o recurso de Internet, y ReactOS lo abrir para usted.", 12289, 36, 11, 182, 24
LTEXT "&Abrir:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "Aceptar", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Cancelar", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Examinar...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/fi-FI.rc b/reactos/dll/win32/shell32/lang/fi-FI.rc
index d3030ebd186..a06449d15e3 100644
--- a/reactos/dll/win32/shell32/lang/fi-FI.rc
+++ b/reactos/dll/win32/shell32/lang/fi-FI.rc
@@ -155,7 +155,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Anna ohjelma, dokumentti, tai Internet -ressurssi, ja ReactOS avaa sen Sinulle.", 12289, 36, 11, 182, 18
LTEXT "&Avaa:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Peruuta", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Selaa...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/fr-FR.rc b/reactos/dll/win32/shell32/lang/fr-FR.rc
index df3feaae2d8..d2ea3e0cb0f 100644
--- a/reactos/dll/win32/shell32/lang/fr-FR.rc
+++ b/reactos/dll/win32/shell32/lang/fr-FR.rc
@@ -159,7 +159,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Entrez le nom d'un programme, d'un dossier, d'un document ou d'une ressource Internet, et ReactOS l'ouvrira pour vous.", 12289, 36, 11, 182, 18
LTEXT "&Ouvrir :", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Annuler", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Parcourir...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/hu-HU.rc b/reactos/dll/win32/shell32/lang/hu-HU.rc
index 05571e98f64..3fb86116c39 100644
--- a/reactos/dll/win32/shell32/lang/hu-HU.rc
+++ b/reactos/dll/win32/shell32/lang/hu-HU.rc
@@ -158,7 +158,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "rd be a program nevt, egy mappt, dokumentumt, vagy egy Internet cmet, s a ReactOS megnyitja.", 12289, 36, 11, 182, 18
LTEXT "&Megnyits:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Mgse", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Bngszs...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc
index 48055cb2a26..5788b1aa43b 100644
--- a/reactos/dll/win32/shell32/lang/it-IT.rc
+++ b/reactos/dll/win32/shell32/lang/it-IT.rc
@@ -156,7 +156,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Digitare il nome del programma, della cartella, del documento o della risorsa internet, e ReactOS la aprir.", 12289, 36, 11, 182, 18
LTEXT "&Apri:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Annulla", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Esplora...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/ja-JP.rc b/reactos/dll/win32/shell32/lang/ja-JP.rc
index c4e44a44a55..b627fc86215 100644
--- a/reactos/dll/win32/shell32/lang/ja-JP.rc
+++ b/reactos/dll/win32/shell32/lang/ja-JP.rc
@@ -155,7 +155,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "svOA܂͊JtH_╶AC^[lbg \\[X͂ĂB", 12289, 36, 11, 182, 18
LTEXT "O(&O):", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "LZ", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Q(&B)...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/ko-KR.rc b/reactos/dll/win32/shell32/lang/ko-KR.rc
index 0ddd1a66e71..0f7edd88516 100644
--- a/reactos/dll/win32/shell32/lang/ko-KR.rc
+++ b/reactos/dll/win32/shell32/lang/ko-KR.rc
@@ -155,7 +155,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18
LTEXT "&Open:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 36, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "Cancel", IDCANCEL, 98, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "&Browse...", 12288, 160, 63, 59, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/nl-NL.rc b/reactos/dll/win32/shell32/lang/nl-NL.rc
index a982104c98c..eb995a62a44 100644
--- a/reactos/dll/win32/shell32/lang/nl-NL.rc
+++ b/reactos/dll/win32/shell32/lang/nl-NL.rc
@@ -155,7 +155,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Geef de naam van een programma, map, document, of Internet-adres op. Wine zal het vervolgens openen.", 12289, 36, 11, 182, 18
LTEXT "&Openen:", 12305, 7, 39, 28, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Annuleren", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Bladeren...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/no-NO.rc b/reactos/dll/win32/shell32/lang/no-NO.rc
index feb3a2e7a96..3a694bcc048 100644
--- a/reactos/dll/win32/shell32/lang/no-NO.rc
+++ b/reactos/dll/win32/shell32/lang/no-NO.rc
@@ -155,7 +155,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Skriv inn navnet p programmet, mappen, dokumentet etter Internett-ressursen du nsker pne.", 12289, 36, 11, 182, 18
LTEXT "&pne:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Avbryt", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Bla gjennom .", 12288, 170, 63, 54, 14, WS_TABSTOP
@@ -457,7 +457,7 @@ FONT 8, "MS Shell Dlg"
BEGIN
ICON 45, 14344, 10, 10, 21, 20, SS_REALSIZECONTROL
LTEXT "Er du sikker p at du vil logge av?", -1, 43, 11, 140, 22
- DEFPUSHBUTTON "&Log Off", IDOK, 57, 40, 60, 14
+ DEFPUSHBUTTON "&Logg av", IDOK, 57, 40, 60, 14
PUSHBUTTON "Avbryt", IDCANCEL, 122, 40, 60, 14
END
diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc
index 559960f871a..25a4fbe54bc 100644
--- a/reactos/dll/win32/shell32/lang/pl-PL.rc
+++ b/reactos/dll/win32/shell32/lang/pl-PL.rc
@@ -162,7 +162,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Wpisz nazw programu, katalogu, dokumentu, a ReactOS otworzy go dla ciebie.", 12289, 36, 11, 182, 18
LTEXT "&Otwrz:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Anuluj", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Przegldaj...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/pt-BR.rc b/reactos/dll/win32/shell32/lang/pt-BR.rc
index 9b278d0f2ef..1df03c1897d 100644
--- a/reactos/dll/win32/shell32/lang/pt-BR.rc
+++ b/reactos/dll/win32/shell32/lang/pt-BR.rc
@@ -157,7 +157,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Digite o nome do programa, pasta, documento, ou endereo Internet, que o Wine ir abr-lo para voc.", 12289, 36, 11, 182, 18
LTEXT "&Abrir:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Cancelar", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Procurar...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/pt-PT.rc b/reactos/dll/win32/shell32/lang/pt-PT.rc
index dcd658733ce..665acd7961e 100644
--- a/reactos/dll/win32/shell32/lang/pt-PT.rc
+++ b/reactos/dll/win32/shell32/lang/pt-PT.rc
@@ -157,7 +157,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Digite o nome do programa, pasta, documento, ou endereo Internet, que o Wine ir abr-lo.", 12289, 36, 11, 182, 18
LTEXT "&Abrir:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Cancelar", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Procurar...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/ro-RO.rc b/reactos/dll/win32/shell32/lang/ro-RO.rc
index e7c55d978af..656bc410bc9 100644
--- a/reactos/dll/win32/shell32/lang/ro-RO.rc
+++ b/reactos/dll/win32/shell32/lang/ro-RO.rc
@@ -18,11 +18,13 @@
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
MENU_001 MENU DISCARDABLE
BEGIN
MENUITEM "Pictograme& mari", FCIDM_SHVIEW_BIGICON
MENUITEM "Pictograme &mici", FCIDM_SHVIEW_SMALLICON
- MENUITEM "&List", FCIDM_SHVIEW_LISTVIEW
+ MENUITEM "&Listă", FCIDM_SHVIEW_LISTVIEW
MENUITEM "&Detalii", FCIDM_SHVIEW_REPORTVIEW
END
@@ -35,27 +37,27 @@ BEGIN
BEGIN
MENUITEM "Pictograme& mari", FCIDM_SHVIEW_BIGICON
MENUITEM "Pictograme &mici", FCIDM_SHVIEW_SMALLICON
- MENUITEM "&List", FCIDM_SHVIEW_LISTVIEW
+ MENUITEM "&Listă", FCIDM_SHVIEW_LISTVIEW
MENUITEM "&Detailii", FCIDM_SHVIEW_REPORTVIEW
END
MENUITEM SEPARATOR
POPUP "Aranjare &pictograme"
BEGIN
- MENUITEM "Dup &nume", 0x30 /* column 0 */
- MENUITEM "Dup &tip", 0x32 /* column 2 */
- MENUITEM "Dup &mrime", 0x31 /* ... */
- MENUITEM "Dup &dat", 0x33
+ MENUITEM "După &nume", 0x30 /* column 0 */
+ MENUITEM "După &tip", 0x32 /* column 2 */
+ MENUITEM "După &mărime", 0x31 /* ... */
+ MENUITEM "După &dată", 0x33
MENUITEM SEPARATOR
- MENUITEM "&Aranjare automat", FCIDM_SHVIEW_AUTOARRANGE
+ MENUITEM "&Aranjare automată", FCIDM_SHVIEW_AUTOARRANGE
END
- MENUITEM "Aranjare n gril", FCIDM_SHVIEW_SNAPTOGRID
+ MENUITEM "Aranjare în grilă", FCIDM_SHVIEW_SNAPTOGRID
MENUITEM SEPARATOR
- MENUITEM "Remprosptare", FCIDM_SHVIEW_REFRESH
+ MENUITEM "Reîmprospătare", FCIDM_SHVIEW_REFRESH
MENUITEM SEPARATOR
MENUITEM "Lipire", FCIDM_SHVIEW_INSERT
- MENUITEM "Lipire ca legtur", FCIDM_SHVIEW_INSERTLINK
+ MENUITEM "Lipire ca scurtătură", FCIDM_SHVIEW_INSERTLINK
MENUITEM SEPARATOR
- MENUITEM "Proprieti", FCIDM_SHVIEW_PROPERTIES
+ MENUITEM "Proprietăți", FCIDM_SHVIEW_PROPERTIES
END
END
@@ -70,17 +72,17 @@ BEGIN
MENUITEM "D&ecupare", FCIDM_SHVIEW_CUT
MENUITEM "&Copiere", FCIDM_SHVIEW_COPY
MENUITEM SEPARATOR
- MENUITEM "Creare legtur", FCIDM_SHVIEW_CREATELINK
- MENUITEM "&tergere", FCIDM_SHVIEW_DELETE
+ MENUITEM "Creare scurtătură", FCIDM_SHVIEW_CREATELINK
+ MENUITEM "&Ștergere", FCIDM_SHVIEW_DELETE
MENUITEM "&Redenumire", FCIDM_SHVIEW_RENAME
MENUITEM SEPARATOR
- MENUITEM "&Proprieti", FCIDM_SHVIEW_PROPERTIES
+ MENUITEM "&Proprietăți", FCIDM_SHVIEW_PROPERTIES
END
END
SHBRSFORFOLDER_MSGBOX DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-CAPTION "Rsfoire dup dosar"
+CAPTION "Răsfoire după dosar"
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "OK", 1, 60, 175, 60, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
@@ -92,7 +94,7 @@ END
SHNEWBRSFORFOLDER_MSGBOX DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 15, 40, 218, 196
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-CAPTION "Rsfoire dup dosar"
+CAPTION "Răsfoire după dosar"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "", IDD_TITLE, 10, 8, 198, 24
@@ -128,11 +130,11 @@ BEGIN
LTEXT "Versiune " KERNEL_VERSION_STR " (" KERNEL_VERSION_BUILD_STR ")", IDC_STATIC, 35, 65, 235, 10
LTEXT REACTOS_DEFAULT_STR_LEGAL_COPYRIGHT, IDC_STATIC, 35, 75, 210, 10
LTEXT "", IDC_SHELL_ABOUT_OTHERSTUFF, 35, 90, 180, 20
- LTEXT "Versiune de ReactOS nregistrat pentru:", IDC_STATIC, 35, 115, 180, 10
+ LTEXT "Versiune de ReactOS înregistrată pentru:", IDC_STATIC, 35, 115, 180, 10
LTEXT "", IDC_SHELL_ABOUT_REG_USERNAME, 45, 125, 180, 10
LTEXT "", IDC_SHELL_ABOUT_REG_ORGNAME, 45, 135, 180, 10
LTEXT "", IDC_STATIC, 35, 147, 235, 1, SS_ETCHEDHORZ
- LTEXT "Memorie fizic instalat:", IDC_STATIC, 35, 152, 130, 10
+ LTEXT "Memorie fizică instalată:", IDC_STATIC, 35, 152, 130, 10
LTEXT "", IDC_SHELL_ABOUT_PHYSMEM, 167, 152, 88, 10
DEFPUSHBUTTON "OK", IDOK, 220, 178, 50, 14
@@ -153,27 +155,27 @@ CAPTION "Rulare"
FONT 8, "MS Shell Dlg"
BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
- LTEXT "Scriei numele unui program, dosar, document sau a unei resurse de Internet iar ReactOS le va deschide imediat.", 12289, 36, 11, 182, 18
+ LTEXT "Scrieți numele unui program, dosar, document sau a unei resurse de Internet iar ReactOS le va deschide imediat.", 12289, 36, 11, 182, 18
LTEXT "&Deschidere:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 36, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "Anulare", IDCANCEL, 98, 63, 59, 14, WS_TABSTOP
- PUSHBUTTON "&Rsfoire...", 12288, 160, 63, 59, 14, WS_TABSTOP
+ PUSHBUTTON "&Răsfoire...", 12288, 160, 63, 59, 14, WS_TABSTOP
END
SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 235, 215
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Scurttur"
+CAPTION "Scurtătură"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
ICON "", 14000, 10, 4, 30, 30, WS_VISIBLE
- LTEXT "Tip int:", 14004, 8, 38, 64, 10
+ LTEXT "Tip țintă:", 14004, 8, 38, 64, 10
LTEXT "", 14005, 78, 38, 142, 10
- LTEXT "Locaie int:", 14006, 8, 58, 64, 10
+ LTEXT "Locație țintă:", 14006, 8, 58, 64, 10
LTEXT "", 14007, 79, 58, 141, 10
- LTEXT "int:", 14008, 8, 77, 45, 10
+ LTEXT "Țintă:", 14008, 8, 77, 45, 10
EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL
- LTEXT "&Pornire n:", 14010, 8, 96, 57, 10
+ LTEXT "&Pornire în:", 14010, 8, 96, 57, 10
EDITTEXT 14011, 79, 94, 150, 14, ES_AUTOHSCROLL
LTEXT "Taste rapide:", 14014, 8, 115, 57, 10
EDITTEXT 14015, 79, 112, 150, 14, ES_LEFT
@@ -181,20 +183,20 @@ BEGIN
EDITTEXT 14017, 79, 131, 150, 14, ES_AUTOHSCROLL
LTEXT "C&omentariu:", 14018, 8, 152, 57, 10
EDITTEXT 14019, 79, 149, 150, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&Gsire int...", 14020, 9, 172, 70, 14, ES_LEFT
- PUSHBUTTON "&Pictogram...", 14021, 84, 172, 70, 14, ES_LEFT
+ PUSHBUTTON "&Găsire țintă...", 14020, 9, 172, 70, 14, ES_LEFT
+ PUSHBUTTON "&Pictogramă...", 14021, 84, 172, 70, 14, ES_LEFT
PUSHBUTTON "A&vansat...", 14022, 159, 172, 70, 14, ES_LEFT
END
SHELL_EXTENDED_SHORTCUT_DLG DIALOGEX 0, 0, 230, 150
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
-CAPTION "Proprieti extinse"
+CAPTION "Proprietăți extinse"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
- LTEXT "Alegei proprieti avansate pentru aceast scurttur.", -1, 5, 30, 210, 10
+ LTEXT "Alegeți proprietăți avansate pentru această scurtătură.", -1, 5, 30, 210, 10
CHECKBOX "Rulare ca alt utilizator", 14000, 25, 50, 150, 10
- LTEXT "Aceast opiune v permite s rulai scurttura ca alt utilizator sau s continuai s folosii scurttura dvs protejnd computerul de activiti neautorizate.", -1, 50, 60, 175, 40
- CHECKBOX "Rulare n spaiu de memorie separat", 14001, 25, 100, 90, 10, WS_DISABLED
+ LTEXT "Această opțiune vă permite să rulați scurtătura ca alt utilizator sau să continuați să folosiți scurtătura dvs protejând computerul de activități neautorizate.", -1, 50, 60, 175, 40
+ CHECKBOX "Rulare în spațiu de memorie separat", 14001, 25, 100, 90, 10, WS_DISABLED
PUSHBUTTON "OK", 1, 63, 124, 50, 15, WS_VISIBLE
PUSHBUTTON "Anulare", 2, 120, 124, 50, 15, WS_VISIBLE
END
@@ -206,17 +208,17 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
ICON "", 14000, 10, 3, 30, 30, WS_VISIBLE
EDITTEXT 14001, 70, 9, 158, 14, ES_LEFT | ES_READONLY
- LTEXT "Tip fiier:", 14004, 8, 35, 50, 10
+ LTEXT "Tip fișier:", 14004, 8, 35, 50, 10
LTEXT "Folder", 14005, 68, 35, 160, 10
- LTEXT "Locaie:", 14006, 8, 53, 50, 10
+ LTEXT "Locație:", 14006, 8, 53, 50, 10
LTEXT "", 14007, 68, 53, 315, 10
- LTEXT "Mrime:", 14008, 8, 72, 45, 10
+ LTEXT "Mărime:", 14008, 8, 72, 45, 10
LTEXT "", 14009, 68, 72, 315, 10
- LTEXT "Conine:", 14010, 8, 93, 45, 10
+ LTEXT "Conține:", 14010, 8, 93, 45, 10
LTEXT "", 14011, 68, 93, 160, 10
LTEXT "Creat:", 14014, 8, 118, 45, 10
LTEXT "", 14015, 68, 118, 160, 10
- AUTOCHECKBOX "&Doar-n-citire", 14021, 45, 150, 67, 10
+ AUTOCHECKBOX "&Doar-în-citire", 14021, 45, 150, 67, 10
AUTOCHECKBOX "&Ascuns", 14022, 126, 150, 50, 10
END
@@ -228,13 +230,13 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
ICON "", 14000, 10, 3, 30, 30, WS_VISIBLE
EDITTEXT 14001, 70, 9, 158, 14, ES_LEFT | ES_READONLY
- LTEXT "Tip fiier:", 14004, 8, 35, 50, 10
- LTEXT "Fiier", 14005, 68, 35, 160, 10
+ LTEXT "Tip fișier:", 14004, 8, 35, 50, 10
+ LTEXT "Fișier", 14005, 68, 35, 160, 10
LTEXT "Se deschide cu:", 14006, 8, 53, 50, 10
LTEXT "", 14007, 68, 53, 160, 10
- LTEXT "Locaie:", 14008, 8, 72, 45, 10
+ LTEXT "Locație:", 14008, 8, 72, 45, 10
LTEXT "", 14009, 68, 72, 315, 10
- LTEXT "Mrime:", 14010, 8, 93, 45, 10
+ LTEXT "Mărime:", 14010, 8, 93, 45, 10
LTEXT "", 14011, 68, 93, 160, 10
LTEXT "Creat:", 14014, 8, 118, 45, 10
LTEXT "", 14015, 68, 118, 160, 10
@@ -243,9 +245,9 @@ BEGIN
LTEXT "Accesat:", 14018, 8, 160, 45, 10
LTEXT "", 14019, 68, 160, 160, 10
LTEXT "Atribute:", 14020, 8, 189, 45, 10
- CHECKBOX "&Doar-n-citire", 14021, 58, 189, 67, 10
+ CHECKBOX "&Doar-în-citire", 14021, 58, 189, 67, 10
CHECKBOX "&Ascuns", 14022, 126, 189, 50, 10
- CHECKBOX "&Arhiv", 14023, 181, 189, 49, 10
+ CHECKBOX "&Arhivă", 14023, 181, 189, 49, 10
END
SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 235, 215
@@ -253,13 +255,13 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Versiune"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
- LTEXT "Versiune fiier: ", 14000, 10, 10, 55, 10
+ LTEXT "Versiune fișier: ", 14000, 10, 10, 55, 10
LTEXT "", 14001, 77, 10, 152, 10
LTEXT "Descriere: ", 14002, 10, 27, 45, 10
LTEXT "", 14003, 77, 27, 152, 10
LTEXT "Drept de autor: ", 14004, 10, 46, 66, 10
LTEXT "", 14005, 77, 46, 152, 10
- GROUPBOX "Alte informaii versiune", 14006, 6, 70, 222, 115
+ GROUPBOX "Alte informații versiune", 14006, 6, 70, 222, 115
LTEXT "Nume element: ", 14007, 13, 82, 50, 10
LTEXT "Valoare: ", 14008, 112, 82, 45, 10
LISTBOX 14009, 12, 94, 94, 83, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY
@@ -275,16 +277,16 @@ BEGIN
LTEXT "Tip:", -1, 15, 55, 40, 10
LTEXT "", 14001, 110, 55, 100, 10
- LTEXT "Sistem de fiiere:", -1, 15, 70, 100, 10
+ LTEXT "Sistem de fișiere:", -1, 15, 70, 100, 10
LTEXT "", 14002, 110, 70, 100, 10
CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10
- LTEXT "Spaiu folosit:", -1, 25, 90, 120, 10
+ LTEXT "Spațiu folosit:", -1, 25, 90, 120, 10
LTEXT "", 14003, 110, 90, 120, 10
LTEXT "", 14004, 200, 90, 40, 10
CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10
- LTEXT "Spaiu liber:", -1, 25, 105, 70, 10
+ LTEXT "Spațiu liber:", -1, 25, 105, 70, 10
LTEXT "", 14005, 110, 105, 120, 10
LTEXT "", 14006, 200, 105, 40, 10
@@ -294,10 +296,10 @@ BEGIN
CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20
- LTEXT "Partiie %s", 14009, 100, 170, 40, 10
- PUSHBUTTON "Curire disc", 14010, 180, 175, 50, 15, WS_TABSTOP
- CHECKBOX "Comprimare pentru a salva spaiu", 14011, 15, 205, 180, 10, WS_DISABLED
- CHECKBOX "Permitere Serviciu de Indexare pentru cutare rapid", 14012, 15, 220, 200, 10, WS_DISABLED
+ LTEXT "Partiție %s", 14009, 100, 170, 40, 10
+ PUSHBUTTON "Curățire disc", 14010, 180, 175, 50, 15, WS_TABSTOP
+ CHECKBOX "Comprimare pentru a salva spațiu", 14011, 15, 205, 180, 10, WS_DISABLED
+ CHECKBOX "Permitere Serviciu de Indexare pentru căutare rapidă", 14012, 15, 220, 200, 10, WS_DISABLED
END
DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230
@@ -306,14 +308,14 @@ CAPTION "Unelte"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "Verificare pentru erori", -1, 5, 5, 230, 60
- LTEXT "Aceast opiune va verifica\npartiia pentru erori.", -1, 40, 25, 160, 20
+ LTEXT "Această opțiune va verifica\npartiția pentru erori.", -1, 40, 25, 160, 20
PUSHBUTTON "Verificare acum...", 14000, 130, 45, 90, 15, WS_TABSTOP
GROUPBOX "Defragmentare", -1, 5, 65, 230, 60
- LTEXT "Aceast opiune va defragmenta fiierele de pe partiie.", -1, 40, 85, 160, 20
+ LTEXT "Această opțiune va defragmenta fișierele de pe partiție.", -1, 40, 85, 160, 20
PUSHBUTTON "Defragmentare acum...", 14001, 130, 105, 90, 15, WS_TABSTOP
- GROUPBOX "Copie de siguran", -1, 5, 130, 230, 60
- LTEXT "Aceast opiune va crea o copie de siguran a fiierelor.", -1, 40, 150, 160, 20
- PUSHBUTTON "Creare copie de siguran...", 14002, 130, 170, 90, 15, WS_TABSTOP
+ GROUPBOX "Copie de siguranță", -1, 5, 130, 230, 60
+ LTEXT "Această opțiune va crea o copie de siguranță a fișierelor.", -1, 40, 150, 160, 20
+ PUSHBUTTON "Creare copie de siguranță...", 14002, 130, 170, 90, 15, WS_TABSTOP
END
DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 230
@@ -328,16 +330,16 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Rulare ca"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
- LTEXT "Ce cont vrei s folosii pentru a rula acest program?", -1, 10, 20, 220, 20
+ LTEXT "Ce cont vreți să folosiți pentru a rula acest program?", -1, 10, 20, 220, 20
CHECKBOX "Utilizator curent: %s", 14000, 10, 45, 150, 10
- LTEXT "Protejare computer de activii neautorizate", -1, 25, 57, 200, 10, WS_DISABLED
- CHECKBOX "Aceast opiune v poate proteja computerul de activiti care pot fi duntoare dar pot duce la funcionarea incorect a programului.", 14001, 25, 68, 200, 30, WS_DISABLED | BS_MULTILINE
+ LTEXT "Protejare computer de activiăți neautorizate", -1, 25, 57, 200, 10, WS_DISABLED
+ CHECKBOX "Această opțiune vă poate proteja computerul de activități care pot fi dăunătoare dar pot duce la funcționarea incorectă a programului.", 14001, 25, 68, 200, 30, WS_DISABLED | BS_MULTILINE
CHECKBOX "Utilizator curent:", 14002, 10, 100, 90, 10
LTEXT "Nume utilizator:", -1, 20, 118, 54, 10
COMBOBOX 14003, 75, 115, 100, 15, CBS_DROPDOWNLIST | WS_VSCROLL | WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "...", 14004, 180, 115, 30, 14, WS_TABSTOP
- LTEXT "Parol:", -1, 20, 143, 53, 10
+ LTEXT "Parolă:", -1, 20, 143, 53, 10
EDITTEXT 14005, 74, 140, 100, 14, ES_LEFT | WS_BORDER | WS_GROUP
PUSHBUTTON "...", 14006, 180, 140, 30, 14, WS_TABSTOP
PUSHBUTTON "OK", 14007, 57, 170, 60, 14, WS_TABSTOP
@@ -346,16 +348,16 @@ END
BITBUCKET_PROPERTIES_DLG DIALOGEX 0, 0, 240, 190
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Proprieti pentru Gunoi"
+CAPTION "Proprietăți pentru Coșul de gunoi"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
CONTROL "", 14000, "SysListView32", LVS_REPORT | LVS_SHAREIMAGELISTS | WS_BORDER | WS_TABSTOP, 10, 10, 220, 50
- GROUPBOX "Setri pentru locaia aleas", -1, 10, 72, 220, 70
- RADIOBUTTON "&Mrime particul.:", 14001, 20, 90, 80, 10, WS_TABSTOP
+ GROUPBOX "Setări pentru locația aleasă", -1, 10, 72, 220, 70
+ RADIOBUTTON "&Mărime particul.:", 14001, 20, 90, 80, 10, WS_TABSTOP
EDITTEXT 14002, 106, 87, 50, 14, WS_TABSTOP | ES_NUMBER
- LTEXT "M&rime maxim(MB):", -1, 20, 105, 70, 10
- RADIOBUTTON "Nu muta fiierele n &Coul de Gunoi, ci elimin-le cnd se alege tergere.", 14003, 20, 117, 170, 20, BS_MULTILINE | WS_TABSTOP
- AUTOCHECKBOX "&Afiare dialog de confirmare tergere", 14004, 20, 155, 140, 10, WS_TABSTOP
+ LTEXT "M&ărime maximă(MB):", -1, 20, 105, 70, 10
+ RADIOBUTTON "Nu se vor muta fișierele în &Coșul de gunoi, ci se vor elimina direct.", 14003, 20, 117, 170, 20, BS_MULTILINE | WS_TABSTOP
+ AUTOCHECKBOX "&Afișare dialog de confirmare ștergere", 14004, 20, 155, 140, 10, WS_TABSTOP
END
OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256
@@ -364,12 +366,12 @@ CAPTION "Open With"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
ICON IDI_SHELL_OPEN_WITH, -1, 8, 12, 21, 20
- LTEXT "Alegei programul pe care vrei s l folosii la deschiderea acestui fiier:", -1, 44, 12, 211, 10
- LTEXT "Fiier: ", 14001, 44, 25, 188, 10
+ LTEXT "Alegeți programul pe care vreți să îl folosiți la deschiderea acestui fișier:", -1, 44, 12, 211, 10
+ LTEXT "Fișier: ", 14001, 44, 25, 188, 10
GROUPBOX "&Programe", -1, 7, 42, 249, 187
LISTBOX 14002, 16 ,57, 230, 130, LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP,WS_EX_STATICEDGE
- AUTOCHECKBOX "&Folosire mereu aceast aplicaie", 14003, 20, 193, 225, 10
- PUSHBUTTON "&Rsfoire...", 14004, 198, 207, 50, 14
+ AUTOCHECKBOX "&Folosire mereu această aplicație", 14003, 20, 193, 225, 10
+ PUSHBUTTON "&Răsfoire...", 14004, 198, 207, 50, 14
PUSHBUTTON "OK", 14005, 150, 236, 50, 14
PUSHBUTTON "Anulare", 14006, 206, 236, 50, 14
END
@@ -379,19 +381,19 @@ STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
CAPTION "General"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
- GROUPBOX "Activiti", -1, 7, 10, 249, 45
+ GROUPBOX "Activități", -1, 7, 10, 249, 45
ICON "", 30109, 14, 25, 21, 20, SS_REALSIZECONTROL
- AUTORADIOBUTTON "Afiare activii comune n &dosare", 14001, 40, 25, 120, 10, WS_TABSTOP | WS_GROUP
+ AUTORADIOBUTTON "Afișare activiăți comune în &dosare", 14001, 40, 25, 120, 10, WS_TABSTOP | WS_GROUP
AUTORADIOBUTTON "Folosire dosare &clasice ReactOS", 14002, 40, 37, 120, 10, WS_TABSTOP | WS_GROUP
- GROUPBOX "Rsfoire dosare", -1, 7, 60, 249, 45, WS_TABSTOP
+ GROUPBOX "Răsfoire dosare", -1, 7, 60, 249, 45, WS_TABSTOP
ICON "", 30110, 14, 70, 21, 20, SS_REALSIZECONTROL
- AUTORADIOBUTTON "Deschidere &dosare n fereastr comun", 14004, 40, 70, 140, 10, WS_TABSTOP | WS_GROUP
- AUTORADIOBUTTON "Deschidere dosare n &fereastr proprie", 14005, 40, 82, 140, 10, WS_TABSTOP | WS_GROUP
+ AUTORADIOBUTTON "Deschidere &dosare în fereastră comună", 14004, 40, 70, 140, 10, WS_TABSTOP | WS_GROUP
+ AUTORADIOBUTTON "Deschidere dosare în &fereastră proprie", 14005, 40, 82, 140, 10, WS_TABSTOP | WS_GROUP
GROUPBOX "Selectare elemente astfel", -1, 7, 110, 249, 60
ICON "", 30111, 14, 120, 21, 20, SS_REALSIZECONTROL
AUTORADIOBUTTON "&Clic pentru deschidere (cursor deasupra pt. a selecta)", 14007, 40, 120, 170, 10, WS_TABSTOP | WS_GROUP
- AUTORADIOBUTTON "Subliniere titluri pictograme precum n navigatorul meu", 14008, 50, 132, 170, 10, WS_TABSTOP | WS_GROUP
- AUTORADIOBUTTON "Subliniere titluri cnd in cursorul deasupra", 14009, 50, 144, 170, 10, WS_TABSTOP | WS_GROUP
+ AUTORADIOBUTTON "Subliniere titluri pictograme precum în navigatorul meu", 14008, 50, 132, 170, 10, WS_TABSTOP | WS_GROUP
+ AUTORADIOBUTTON "Subliniere titluri când țin cursorul deasupra", 14009, 50, 144, 170, 10, WS_TABSTOP | WS_GROUP
AUTORADIOBUTTON "&Dublu-clic pentru a deschide (clic pt. a selecta)", 14010, 40, 156, 170, 10, WS_TABSTOP | WS_GROUP
PUSHBUTTON "&Restabilire implicite", 14011, 180, 180, 60, 14, WS_TABSTOP
END
@@ -401,22 +403,22 @@ STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
CAPTION "Vizualizare"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
-GROUPBOX "Vizualizri dosar", -1, 7, 10, 249, 60
+GROUPBOX "Vizualizări dosar", -1, 7, 10, 249, 60
//ICON
-LTEXT "Putei aplica vizualizarea (precum Detalii sau Pictogramem mari)\npe care o folosii la acest dosar pt. toate dosarele.", -1, 60, 20, 180, 20
+LTEXT "Puteți aplica vizualizarea (precum Detalii sau Pictogramem mari)\npe care o folosiți la acest dosar pt. toate dosarele.", -1, 60, 20, 180, 20
PUSHBUTTON "Aplicare la &Toate", 14001, 60, 50, 80, 14, WS_TABSTOP
PUSHBUTTON "&Resetare &Toate", 14002, 150, 50, 80, 14, WS_TABSTOP
-LTEXT "Setri avansate:", -1, 7, 80, 100, 10
+LTEXT "Setări avansate:", -1, 7, 80, 100, 10
CONTROL "", 14003, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | WS_BORDER | WS_TABSTOP, 7, 90, 249, 120
PUSHBUTTON "Restabilire &implicite", 14004, 180, 210, 80, 14, WS_TABSTOP
END
FOLDER_OPTIONS_FILETYPES_DLG DIALOGEX 0, 0, 264, 256
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
-CAPTION "Tipuri fiier"
+CAPTION "Tipuri fișier"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
-LTEXT "Tipuri fiier nregistrate:", -1, 7, 10, 70, 10
+LTEXT "Tipuri fișier înregistrate:", -1, 7, 10, 70, 10
CONTROL "", 14000, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHAREIMAGELISTS | WS_BORDER | WS_TABSTOP, 7, 20, 249, 80
PUSHBUTTON "&Nou", 14001, 120, 110, 50, 14, WS_TABSTOP
PUSHBUTTON "&Eliminare", 14002, 180, 110, 50, 14, WS_TABSTOP
@@ -425,13 +427,13 @@ LTEXT "Deschidere cu:", -1, 12, 140, 40, 10
//ICON
LTEXT "Nume ap.", 14005, 100, 140, 40, 10
PUSHBUTTON "&Schimbare", 14006, 180, 140, 50, 14, WS_TABSTOP
-LTEXT "Fiierele cu extensia '%s' sunt de tipul '%s'. \nPentru a schimbat setri care vor afecta\ntoate fiierele '%s', clic pe Avansat.", 14007, 12, 155, 160, 30
+LTEXT "Fișierele cu extensia '%s' sunt de tipul '%s'. \nPentru a schimbat setări care vor afecta\ntoate fișierele '%s', clic pe Avansat.", 14007, 12, 155, 160, 30
PUSHBUTTON "A&vansat", 14008, 180, 175, 50, 14, WS_TABSTOP
END
CONFIRM_FILE_REPLACE_DLG DIALOGEX 0, 0, 282, 143
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Confirmare nlocuire fiier"
+CAPTION "Confirmare înlocuire fișier"
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "&Da", IDYES, 20, 122, 60, 14
@@ -439,14 +441,14 @@ BEGIN
PUSHBUTTON "&Nu", IDNO, 150, 122, 60, 14
PUSHBUTTON "Anulare", IDCANCEL, 215, 122, 60, 14
ICON 146, -1, 11, 10, 21, 20, SS_REALSIZECONTROL
- LTEXT "Dosarul curent deja conine un fiier cu numele '%2'.", 12291, 44, 10, 231, 22, SS_NOPREFIX
- LTEXT "Dosarul curent deja conine un fiier doar-n-citire cu numele '%2'.", 12292, 41, 10, 222, 22, SS_NOPREFIX
- LTEXT "Dosarul curent deja conine un fiier de sistem cu numele '%2'.", 12293, 41, 10, 222, 22, SS_NOPREFIX
- LTEXT "Dorii s nlocuii fiierul acesta", -1, 44, 35, 228, 10, SS_NOPREFIX
- LTEXT "(mrime/dat necunoscut)", 12302, 79, 51, 198, 20, SS_NOPREFIX
+ LTEXT "Dosarul curent deja conține un fișier cu numele '%2'.", 12291, 44, 10, 231, 22, SS_NOPREFIX
+ LTEXT "Dosarul curent deja conține un fișier doar-în-citire cu numele '%2'.", 12292, 41, 10, 222, 22, SS_NOPREFIX
+ LTEXT "Dosarul curent deja conține un fișier de sistem cu numele '%2'.", 12293, 41, 10, 222, 22, SS_NOPREFIX
+ LTEXT "Doriți să înlocuiți fișierul acesta", -1, 44, 35, 228, 10, SS_NOPREFIX
+ LTEXT "(mărime/dată necunoscută)", 12302, 79, 51, 198, 20, SS_NOPREFIX
ICON "", 12300, 50, 49, 21, 20, SS_REALSIZECONTROL
LTEXT "cu acesta?", -1, 44, 75, 228, 10, SS_NOPREFIX
- LTEXT "(mrime/dat necunoscut)", 12303, 79, 91, 198, 20, SS_NOPREFIX
+ LTEXT "(mărime/dată necunoscută)", 12303, 79, 91, 198, 20, SS_NOPREFIX
ICON "", 12301, 50, 89, 21, 20, SS_REALSIZECONTROL
END
@@ -456,7 +458,7 @@ CAPTION "Log off din ReactOS"
FONT 8, "MS Shell Dlg"
BEGIN
ICON 45, 14344, 10, 10, 21, 20, SS_REALSIZECONTROL
- LTEXT "Sigur vrei s ieii din ReactOS ?", -1, 43, 11, 140, 22
+ LTEXT "Sigur vreți să ieșiți din ReactOS ?", -1, 43, 11, 140, 22
DEFPUSHBUTTON "&Log Off", IDOK, 57, 40, 60, 14
PUSHBUTTON "Anulare", IDCANCEL, 122, 40, 60, 14
END
@@ -467,7 +469,7 @@ CAPTION "Deconectare ReactOS"
FONT 8, "MS Shell Dlg"
BEGIN
ICON 49, 14346, 10, 10, 21, 20, SS_REALSIZECONTROL
- LTEXT "Sigur vrei s v deconectai?", -1, 49, 12, 137, 23
+ LTEXT "Sigur vreți să vă deconectați?", -1, 49, 12, 137, 23
DEFPUSHBUTTON "&Deconectare", IDOK, 57, 40, 60, 14
PUSHBUTTON "Anulare", IDCANCEL, 123, 40, 60, 14
END
@@ -477,23 +479,23 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CLIPSIBLIN
CAPTION "AutoRulare"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "&Alegei un tip de coninut i aciunea pe care ReactOS s o ndeplineasc:", 1000, 7, 7, 215, 20
+ LTEXT "&Alegeți un tip de conținut și acțiunea pe care ReactOS să o îndeplinească:", 1000, 7, 7, 215, 20
CONTROL "", 1001, "COMBOBOXEX32", WS_TABSTOP | 0x00000043, 7, 27, 212, 200
- GROUPBOX "Aciuni", -1, 7, 45, 212, 146
- AUTORADIOBUTTON "Alegei o aciune:", 1005, 14, 54, 202, 10, WS_GROUP
+ GROUPBOX "Acțiuni", -1, 7, 45, 212, 146
+ AUTORADIOBUTTON "Alegeți o acțiune:", 1005, 14, 54, 202, 10, WS_GROUP
CONTROL "LIST2", 1002, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000C04D, 22, 66, 192, 107
- AUTORADIOBUTTON "Vreau s fiu ntrebat mereu", 1006, 14, 177, 202, 10
+ AUTORADIOBUTTON "Vreau să fiu întrebat mereu", 1006, 14, 177, 202, 10
PUSHBUTTON "&Restabilire implicite", 1008, 108, 197, 110, 14, WS_DISABLED
END
MIXED_CONTENT1_DLG DIALOGEX 0, 0, 227, 207
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION
-CAPTION "Coninut mixt"
+CAPTION "Conținut mixt"
FONT 8, "MS Shell Dlg"
BEGIN
ICON "", 1000, 5, 7, 21, 20
- LTEXT "Acest disc sau dispozitiv conine mai mult de un tip de coninut.", 1001, 32, 7, 191, 20
- LTEXT "Ce vrei s fac ReactOS?", 1002, 32, 31, 188, 8
+ LTEXT "Acest disc sau dispozitiv conține mai mult de un tip de conținut.", 1001, 32, 7, 191, 20
+ LTEXT "Ce vreți să facă ReactOS?", 1002, 32, 31, 188, 8
CONTROL "", 1003, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000C04D, 32, 43, 188, 139
DEFPUSHBUTTON "OK", IDOK, 96, 186, 60, 14
PUSHBUTTON "Anulare", IDCANCEL, 160, 186, 60, 14
@@ -501,16 +503,16 @@ END
MIXED_CONTENT2_DLG DIALOGEX 0, 0, 227, 206
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION
-CAPTION "Coninut mixt"
+CAPTION "Conținut mixt"
FONT 8, "MS Shell Dlg"
BEGIN
ICON "", 1000, 5, 7, 21, 20
- LTEXT "ReactOS poate executa aceeai aciune de fiecare dat cnd introducei un disc sau conectai un dispozitiv cu acest coninut pe el:", 1001, 30, 7, 193, 20
+ LTEXT "ReactOS poate executa aceeași acțiune de fiecare dată când introduceți un disc sau conectați un dispozitiv cu acest conținut pe el:", 1001, 30, 7, 193, 20
ICON "", 1005, 32, 27, 11, 10, SS_REALSIZECONTROL
EDITTEXT 1006, 49, 28, 177, 14, ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
- LTEXT "Ce vrei s fac ReactOS?", 1002, 32, 41, 190, 8
+ LTEXT "Ce vreți să facă ReactOS?", 1002, 32, 41, 190, 8
CONTROL "", 1003, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000C04D, 32, 55, 188, 112
- AUTOCHECKBOX "Efectuare mereu aceei aciune", 1004, 32, 171, 190, 10
+ AUTOCHECKBOX "Efectuare mereu aceeși acțiune", 1004, 32, 171, 190, 10
DEFPUSHBUTTON "OK", IDOK, 96, 185, 60, 14
PUSHBUTTON "Anulare", IDCANCEL, 160, 185, 60, 14
END
@@ -521,23 +523,23 @@ CAPTION "Autorulare"
FONT 8, "MS Shell Dlg"
BEGIN
ICON "", 1000, 5, 7, 21, 20
- LTEXT "ReactOS poate executa aceeai aciune de fiecare dat cnd conectai acest dispozitiv.", 1001, 32, 7, 190, 22
- LTEXT "&Ce vrei s fac ReactOS?", 1002, 32, 31, 190, 8
+ LTEXT "ReactOS poate executa aceeași acțiune de fiecare dată când conectați acest dispozitiv.", 1001, 32, 7, 190, 22
+ LTEXT "&Ce vreți să facă ReactOS?", 1002, 32, 31, 190, 8
CONTROL "", 1003, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000C04D, 32, 43, 187, 96
- AUTOCHECKBOX "&Efectuare mereu aceeai aciune", 1004, 32, 143, 190, 8
+ AUTOCHECKBOX "&Efectuare mereu aceeași acțiune", 1004, 32, 143, 190, 8
DEFPUSHBUTTON "OK", IDOK, 94, 160, 60, 14
PUSHBUTTON "Anulare", IDCANCEL, 159, 160, 60, 14
END
SHUTDOWN_DLG DIALOGEX 0, 0, 211, 103
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION
-CAPTION "nchidere ReactOS"
+CAPTION "Închidere ReactOS"
FONT 8, "MS Shell Dlg"
BEGIN
ICON 8240, -1, 6, 6, 21, 20, SS_REALSIZECONTROL | WS_GROUP
- LTEXT "Ce vrei s fac computerul?", -1, 39, 7, 167, 10
+ LTEXT "Ce vreți să facă computerul?", -1, 39, 7, 167, 10
COMBOBOX 8224, 39, 20, 165, 200, CBS_DROPDOWNLIST | WS_VSCROLL
- LTEXT "Menine sesiunea de lucru, las computerul pe consum redus dar menine toate datele n memorie. Computerul i va reveni cnd apsai o tast sau micai mausul.", 8225, 39, 40, 167, 37
+ LTEXT "Menține sesiunea de lucru, lasă computerul pe consum redus dar menține toate datele în memorie. Computerul își va reveni când apăsați o tastă sau mișcați mausul.", 8225, 39, 40, 167, 37
DEFPUSHBUTTON "OK", 1, 7, 82, 60, 14, WS_GROUP
PUSHBUTTON "Anulare", IDCANCEL, 75, 82, 60, 14
PUSHBUTTON "&Ajutor", IDHELP, 144, 82, 60, 14
@@ -548,20 +550,20 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBL
CAPTION "Formatare"
FONT 8, "MS Shell Dlg"
BEGIN
- DEFPUSHBUTTON "&ncepere", IDOK, 53, 198, 60, 14
- PUSHBUTTON "&nchidere", IDCANCEL, 118, 198, 60, 14
+ DEFPUSHBUTTON "&Începere", IDOK, 53, 198, 60, 14
+ PUSHBUTTON "&Închidere", IDCANCEL, 118, 198, 60, 14
LTEXT "Ca&pacitate:", -1, 7, 6, 169, 9
COMBOBOX 28673, 7, 17, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
- LTEXT "&Sistem de fiiere", -1, 7, 35, 170, 9
+ LTEXT "&Sistem de fișiere", -1, 7, 35, 170, 9
COMBOBOX 28677, 7, 46, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
CONTROL "", 28678, "MSCTLS_PROGRESS32", 0, 7, 181, 170, 8
- LTEXT "&Mrime uniti de alocare", -1, 7, 64, 170, 9
+ LTEXT "&Mărime unități de alocare", -1, 7, 64, 170, 9
COMBOBOX 28680, 7, 75, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
LTEXT "Nume &volum", -1, 7, 93, 170, 9
EDITTEXT 28679, 7, 103, 170, 13, ES_AUTOHSCROLL
- GROUPBOX "Opiuni &formatare", 4610, 7, 121, 170, 49
- AUTOCHECKBOX "Formatare r&apid", 28674, 16, 135, 155, 10
- AUTOCHECKBOX "&Activare compresie", 28675, 16, 152, 155, 10
+ GROUPBOX "Opțiuni &formatare", 4610, 7, 121, 170, 49
+ AUTOCHECKBOX "Formatare r&apidă", 28674, 16, 135, 155, 10
+ AUTOCHECKBOX "&Compresie", 28675, 16, 152, 155, 10
END
CHKDSK_DLG DIALOGEX 50, 50, 194, 120
@@ -569,22 +571,22 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBL
CAPTION "Verificare disc"
FONT 8, "MS Shell Dlg"
BEGIN
- DEFPUSHBUTTON "ncepere", IDOK, 53, 100, 60, 14
- GROUPBOX "Verificare opiuni disc", -1, 7, 6, 179, 50
+ DEFPUSHBUTTON "Începere", IDOK, 53, 100, 60, 14
+ GROUPBOX "Verificare opțiuni disc", -1, 7, 6, 179, 50
PUSHBUTTON "Anulare", IDCANCEL, 118, 100, 60, 14
- AUTOCHECKBOX "Reparare automat erori", 14000, 16, 15, 155, 10
- AUTOCHECKBOX "&Scanare i reparare nregistrri eronate", 14001, 16, 30, 165, 10
+ AUTOCHECKBOX "Reparare automată erori", 14000, 16, 15, 155, 10
+ AUTOCHECKBOX "&Scanare și reparare înregistrări eronate", 14001, 16, 30, 165, 10
CONTROL "", 14002, "MSCTLS_PROGRESS32", 16, 7, 60, 170, 8
LTEXT "", 14003, 60, 80, 170, 10
END
IDD_PICK_ICON_DIALOG DIALOGEX 0, 0, 237, 204
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Schimbare pictogram"
+CAPTION "Schimbare pictogramă"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
- LTEXT "Nume fiier:", -1, 7, 14, 208, 10
- PUSHBUTTON "Rsfoire...",IDC_BUTTON_PATH, 148, 24,67,14
+ LTEXT "Nume fișier:", -1, 7, 14, 208, 10
+ PUSHBUTTON "Răsfoire...",IDC_BUTTON_PATH, 148, 24,67,14
EDITTEXT IDC_EDIT_PATH, 6, 24, 135, 15, ES_AUTOHSCROLL
LTEXT "Icons:", -1, 7, 47, 208, 10
LISTBOX IDC_PICKICON_LIST,7,57,208,119,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,WS_EX_STATICEDGE
@@ -595,48 +597,48 @@ END
STRINGTABLE DISCARDABLE
BEGIN
/* columns in the shellview */
- IDS_SHV_COLUMN1 "Fiier"
- IDS_SHV_COLUMN2 "Mrime"
+ IDS_SHV_COLUMN1 "Fișier"
+ IDS_SHV_COLUMN2 "Mărime"
IDS_SHV_COLUMN3 "Tip"
IDS_SHV_COLUMN4 "Modificat"
IDS_SHV_COLUMN5 "Atribute"
- IDS_SHV_COLUMN6 "Mrime"
- IDS_SHV_COLUMN7 "Mrime disponibil"
+ IDS_SHV_COLUMN6 "Mărime"
+ IDS_SHV_COLUMN7 "Mărime disponibilă"
IDS_SHV_COLUMN8 "Nume"
IDS_SHV_COLUMN9 "Comentarii"
IDS_SHV_COLUMN10 "Posesor"
IDS_SHV_COLUMN11 "Grup"
- IDS_SHV_COLUMN12 "Nume fiier"
+ IDS_SHV_COLUMN12 "Nume fișier"
IDS_SHV_COLUMN13 "Categorie"
- IDS_SHV_COLUMN_DELFROM "Locaie original"
- IDS_SHV_COLUMN_DELDATE "Data tergerii"
+ IDS_SHV_COLUMN_DELFROM "Locație originală"
+ IDS_SHV_COLUMN_DELDATE "Data ștergerii"
IDS_SHV_COLUMN_FONTTYPE "Tip font"
IDS_SHV_COLUMN_WORKGROUP "Grup de lucru"
- IDS_SHV_NETWORKLOCATION "Locaie reea"
+ IDS_SHV_NETWORKLOCATION "Locație rețea"
IDS_SHV_COLUMN_DOCUMENTS "Documente"
IDS_SHV_COLUMN_STATUS "Stare"
IDS_SHV_COLUMN_COMMENTS "Comentarii"
- IDS_SHV_COLUMN_LOCATION "Locaie"
+ IDS_SHV_COLUMN_LOCATION "Locație"
IDS_SHV_COLUMN_MODEL "Model"
/* special folders */
- IDS_DESKTOP "Spaiu de lucru"
+ IDS_DESKTOP "Spațiu de lucru"
IDS_MYCOMPUTER "Computerul meu"
- IDS_RECYCLEBIN_FOLDER_NAME "Gunoi"
+ IDS_RECYCLEBIN_FOLDER_NAME "Coș de gunoi"
IDS_CONTROLPANEL "Panou de control"
IDS_ADMINISTRATIVETOOLS "Unelte administrative"
/* context menus */
IDS_VIEW_LARGE "Pictograme &mari"
IDS_VIEW_SMALL "Pictograme m&ici"
- IDS_VIEW_LIST "&List"
+ IDS_VIEW_LIST "&Listă"
IDS_VIEW_DETAILS "&Detalii"
IDS_SELECT "Selectare"
IDS_OPEN "Deschidere"
- IDS_CREATELINK "Creare &legtur"
+ IDS_CREATELINK "Creare &scurtătură"
IDS_COPY "Copiere"
- IDS_DELETE "tergere"
- IDS_PROPERTIES "Proprieti"
+ IDS_DELETE "Ștergere"
+ IDS_PROPERTIES "Proprietăți"
IDS_CUT "Decupare"
IDS_RESTORE "Restabilire"
IDS_FORMATDRIVE "Formatare..."
@@ -644,28 +646,28 @@ BEGIN
IDS_INSERT "Inserare"
IDS_CREATEFOLDER_DENIED "Nu s-a putut crea dosar nou: Eroare de permisiune."
- IDS_CREATEFOLDER_CAPTION "Eroare n timpul crerii unui nou dosar"
- IDS_DELETEITEM_CAPTION "Confirmare tergere fiier"
- IDS_DELETEFOLDER_CAPTION "Confirmare tergere dosar"
- IDS_DELETEITEM_TEXT "Sigur vrei s tergei '%1'?"
- IDS_DELETEMULTIPLE_TEXT "Sigur vrei s tergei aceste %1 elemente?"
- IDS_DELETESELECTED_TEXT "Sigur vrei s tergei elementul/elementele selectat(e)?"
- IDS_TRASHITEM_TEXT "Sigur vrei s trimitei '%1' n Coul de Gunoi?"
- IDS_TRASHFOLDER_TEXT "Sigur vrei s trimitei dosarul '%1' i tot coninutul su n Coul de Gunoi?"
- IDS_TRASHMULTIPLE_TEXT "Sigur vrei s trimitei aceste %1 elemente la Coul de Gunoi?"
- IDS_CANTTRASH_TEXT "Elementul '%1' nu poate fi trimit la Gunoi. Vrei s l tergei definitiv n schimb?"
- IDS_OVERWRITEFILE_TEXT "Acest dosar deja conine un fiier numit '%1'.\n\nVrei s l nlocuii"
- IDS_OVERWRITEFILE_CAPTION "Confirmare nlocuire fiier"
- IDS_OVERWRITEFOLDER_TEXT "Acest dosar deja conine un sub-dosar cu numele '%1'.\n\n"\
- "Dac fiierele din dosarul de destinaie au acelai nume ca cele din\n"\
- "dosarul selectat, ele vor fi nlocuite. Sigur vrei s copiai sau\n"\
- "mutai dosarul?"
+ IDS_CREATEFOLDER_CAPTION "Eroare în timpul creării unui nou dosar"
+ IDS_DELETEITEM_CAPTION "Confirmare ștergere fișier"
+ IDS_DELETEFOLDER_CAPTION "Confirmare ștergere dosar"
+ IDS_DELETEITEM_TEXT "Sigur vreți să ștergeți '%1'?"
+ IDS_DELETEMULTIPLE_TEXT "Sigur vreți să ștergeți aceste %1 elemente?"
+ IDS_DELETESELECTED_TEXT "Sigur vreți să ștergeți elementul/elementele selectat(e)?"
+ IDS_TRASHITEM_TEXT "Sigur vreți să trimiteți '%1' în Coșul de gunoi?"
+ IDS_TRASHFOLDER_TEXT "Sigur vreți să trimiteți dosarul '%1' și tot conținutul său în Coșul de gunoi?"
+ IDS_TRASHMULTIPLE_TEXT "Sigur vreți să trimiteți aceste %1 elemente la Coșul de gunoi?"
+ IDS_CANTTRASH_TEXT "Elementul '%1' nu poate fi trimit la gunoi. Vreți să îl ștergeți definitiv în schimb?"
+ IDS_OVERWRITEFILE_TEXT "Acest dosar deja conține un fișier numit '%1'.\n\nVreți să îl înlocuiți"
+ IDS_OVERWRITEFILE_CAPTION "Confirmare înlocuire fișier"
+ IDS_OVERWRITEFOLDER_TEXT "Acest dosar deja conține un sub-dosar cu numele '%1'.\n\n"\
+ "Dacă fișierele din dosarul de destinație au același nume ca cele din\n"\
+ "dosarul selectat, ele vor fi înlocuite. Sigur vreți să copiați sau\n"\
+ "mutați dosarul?"
/* message box strings */
IDS_RESTART_TITLE "Repornire"
- IDS_RESTART_PROMPT "Vrei s repornii sistemul?"
- IDS_SHUTDOWN_TITLE "nchidere"
- IDS_SHUTDOWN_PROMPT "Vrei s nchidei computerul?"
+ IDS_RESTART_PROMPT "Vreți să reporniți sistemul?"
+ IDS_SHUTDOWN_TITLE "Închidere"
+ IDS_SHUTDOWN_PROMPT "Vreți să închideți computerul?"
/* shell folder path default values */
IDS_PROGRAMS "Meniu Start\\Programe"
@@ -677,76 +679,78 @@ BEGIN
IDS_STARTMENU "Meniu Start"
IDS_MYMUSIC "Muzica mea"
IDS_MYVIDEO "Filmele Mele"
- IDS_DESKTOPDIRECTORY "Spaiu de lucru"
+ IDS_DESKTOPDIRECTORY "Spațiu de lucru"
IDS_NETHOOD "NetHood"
IDS_TEMPLATES "Modele"
- IDS_APPDATA "Date Aplicaii"
+ IDS_APPDATA "Date Aplicații"
IDS_PRINTHOOD "PrintHood"
- IDS_LOCAL_APPDATA "Setri locale\\Date Aplicaii"
- IDS_INTERNET_CACHE "Setri locale\\Fiiere internet temporare"
+ IDS_LOCAL_APPDATA "Setări locale\\Date Aplicații"
+ IDS_INTERNET_CACHE "Setări locale\\Fișiere internet temporare"
IDS_COOKIES "Cookie-uri"
- IDS_HISTORY "Setri locale\\Istoric"
- IDS_PROGRAM_FILES "Fiiere Program"
+ IDS_HISTORY "Setări locale\\Istoric"
+ IDS_PROGRAM_FILES "Fișiere Program"
IDS_MYPICTURES "Fotografiile mele"
- IDS_PROGRAM_FILES_COMMON "Fiiere Program\\Fiiere Comune"
+ IDS_PROGRAM_FILES_COMMON "Fișiere Program\\Fișiere Comune"
IDS_COMMON_DOCUMENTS "Documente"
IDS_ADMINTOOLS "Meniu Start\\Programe\\Unelte administrative"
IDS_COMMON_MUSIC "Documente\\Muzica mea"
IDS_COMMON_PICTURES "Documente\\Fotografiile mele"
IDS_COMMON_VIDEO "Documente\\Filmele mele"
- IDS_CDBURN_AREA "Setri locale\\Date Aplicaii\\Microsoft\\CD Burning"
- IDS_NETWORKPLACE "Locaiile mele n reea"
+ IDS_CDBURN_AREA "Setări locale\\Date Aplicații\\Microsoft\\CD Burning"
+ IDS_NETWORKPLACE "Locațiile mele în rețea"
IDS_NEWFOLDER "Dosar nou"
IDS_DRIVE_FIXED "Disc local"
IDS_DRIVE_CDROM "CDROM"
- IDS_DRIVE_NETWORK "Disc de reea"
+ IDS_DRIVE_NETWORK "Disc de rețea"
IDS_OPEN_WITH "Deschidere cu"
IDS_OPEN_WITH_CHOOSE "Alegere program..."
IDS_SHELL_ABOUT_AUTHORS "&Autori"
- IDS_SHELL_ABOUT_BACK "< &napoi"
+ IDS_SHELL_ABOUT_BACK "< &Înapoi"
FCIDM_SHVIEW_NEW "Nou"
- FCIDM_SHVIEW_NEWFOLDER "Dosar &nou"
- FCIDM_SHVIEW_NEWLINK "Legtur &nou"
- IDS_FOLDER_OPTIONS "Opiuni dosar"
- IDS_RECYCLEBIN_LOCATION "Locaie Co de Gunoi"
- IDS_RECYCLEBIN_DISKSPACE "Spaiu disponibil"
- IDS_EMPTY_BITBUCKET "Golire Co de Gunoi"
- IDS_PICK_ICON_TITLE "Alegere pictogram"
- IDS_PICK_ICON_FILTER "Fiiere pictogram (*.ico, *.icl, *.exe, *.dll)\0*.ico;*.icl;*.exe;*.dll\0"
- IDS_OPEN_WITH_FILTER "Fiiere executabile\0*.exe\0"
+ FCIDM_SHVIEW_NEWFOLDER "Dosar"
+ FCIDM_SHVIEW_NEWLINK "Scurtătur&ă"
+ IDS_FOLDER_OPTIONS "Opțiuni dosar"
+ IDS_RECYCLEBIN_LOCATION "Locație Coș de gunoi"
+ IDS_RECYCLEBIN_DISKSPACE "Spațiu disponibil"
+ IDS_EMPTY_BITBUCKET "Golire Coș de gunoi"
+ IDS_PICK_ICON_TITLE "Alegere pictogramă"
+ IDS_PICK_ICON_FILTER "Fișiere pictogramă (*.ico, *.icl, *.exe, *.dll)\0*.ico;*.icl;*.exe;*.dll\0"
+ IDS_OPEN_WITH_FILTER "Fișiere executabile\0*.exe\0"
IDS_DIRECTORY "Dosar"
IDS_VIRTUAL_DRIVER "Driver dispozitiv virtual"
- IDS_BAT_FILE "Fiier serie de comenzi ReactOS"
- IDS_CMD_FILE "Scriptur de comenzi ReactOS"
- IDS_COM_FILE "Aplicaie DOS"
+ IDS_BAT_FILE "Fișier serie de comenzi ReactOS"
+ IDS_CMD_FILE "Scriptură de comenzi ReactOS"
+ IDS_COM_FILE "Aplicație DOS"
IDS_CPL_FILE "Element Panou de Control"
IDS_CUR_FILE "Cursor"
- IDS_DLL_FILE "Extensie aplicaie"
+ IDS_DLL_FILE "Extensie aplicație"
IDS_DRV_FILE "Driver dispozitiv"
- IDS_EXE_FILE "Aplicaie"
- IDS_FON_FILE "Fiier font"
- IDS_TTF_FILE "Fiier font TrueType"
- IDS_HLP_FILE "Fiier ajutor"
- IDS_INI_FILE "Fiier setri"
- IDS_LNK_FILE "Scurttur"
- IDS_SYS_FILE "Fiier de sistem"
+ IDS_EXE_FILE "Aplicație"
+ IDS_FON_FILE "Fișier font"
+ IDS_TTF_FILE "Fișier font TrueType"
+ IDS_HLP_FILE "Fișier ajutor"
+ IDS_INI_FILE "Fișier setări"
+ IDS_LNK_FILE "Scurtătură"
+ IDS_SYS_FILE "Fișier de sistem"
IDS_OPEN_VERB "Deschidere"
IDS_RUNAS_VERB "Rulare ca "
IDS_EDIT_VERB "Editare"
- IDS_FIND_VERB "Cutare"
+ IDS_FIND_VERB "Căutare"
IDS_PRINT_VERB "Imprimare"
IDS_PLAY_VERB "Redare"
IDS_PREVIEW_VERB "Previzualizare"
- IDS_FILE_FOLDER "%u fiiere, %u dosare"
+ IDS_FILE_FOLDER "%u fișiere, %u dosare"
IDS_PRINTERS "Imprimante"
IDS_FONTS "Fonturi"
IDS_INSTALLNEWFONT "Instalare font nou..."
- IDS_DEFAULT_CLUSTER_SIZE "Mrime de alocare implicit"
+ IDS_DEFAULT_CLUSTER_SIZE "Mărime de alocare implicită"
END
+
+#pragma code_page(default)
diff --git a/reactos/dll/win32/shell32/lang/ru-RU.rc b/reactos/dll/win32/shell32/lang/ru-RU.rc
index a3db5e49ab7..a124b7ba434 100644
--- a/reactos/dll/win32/shell32/lang/ru-RU.rc
+++ b/reactos/dll/win32/shell32/lang/ru-RU.rc
@@ -156,7 +156,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT " , , , ReactOS .", 12289, 36, 11, 182, 18
LTEXT "&:", 12305, 5, 39, 34, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 40, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 40, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/sk-SK.rc b/reactos/dll/win32/shell32/lang/sk-SK.rc
index 140e387c527..b3a8c879bf3 100644
--- a/reactos/dll/win32/shell32/lang/sk-SK.rc
+++ b/reactos/dll/win32/shell32/lang/sk-SK.rc
@@ -161,7 +161,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Zadajte nzov programu, prieinka, dokumentu alebo internetovho zdroja a systm ReactOS ho otvor.", 12289, 36, 11, 182, 18
LTEXT "&Otvori:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 36, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "Zrui", IDCANCEL, 98, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "&Prehadva...", 12288, 160, 63, 59, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/sl-SI.rc b/reactos/dll/win32/shell32/lang/sl-SI.rc
index 9fe743a72e8..1d376509d22 100644
--- a/reactos/dll/win32/shell32/lang/sl-SI.rc
+++ b/reactos/dll/win32/shell32/lang/sl-SI.rc
@@ -155,7 +155,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Vnesite ime programa, mape, dokumenta ali spletne strani, in Wine ga (jo) bo odprl.", 12289, 36, 11, 182, 18
LTEXT "&Odpri:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "V redu", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Preklii", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Pre&brskaj", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/sv-SE.rc b/reactos/dll/win32/shell32/lang/sv-SE.rc
index 4f2cf04af17..0723e47af37 100644
--- a/reactos/dll/win32/shell32/lang/sv-SE.rc
+++ b/reactos/dll/win32/shell32/lang/sv-SE.rc
@@ -155,7 +155,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Skriv namnet p ett program, en mapp eller ett dokument och wine kommer att ppna det fr dig.", 12289, 36, 11, 182, 18
LTEXT "&ppna:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "Avbryt", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Blddra...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/tr-TR.rc b/reactos/dll/win32/shell32/lang/tr-TR.rc
index 914732eb95b..7c422f1410c 100644
--- a/reactos/dll/win32/shell32/lang/tr-TR.rc
+++ b/reactos/dll/win32/shell32/lang/tr-TR.rc
@@ -155,7 +155,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Herhangi bir program, dizin, belge veya Internet kayna sein ve Wine sizin iin asn.", 12289, 36, 11, 182, 18
LTEXT "&A:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "Tamam", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "ptal", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&Gzat...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/uk-UA.rc b/reactos/dll/win32/shell32/lang/uk-UA.rc
index 4fe5fc222d2..081467ec411 100644
--- a/reactos/dll/win32/shell32/lang/uk-UA.rc
+++ b/reactos/dll/win32/shell32/lang/uk-UA.rc
@@ -156,7 +156,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT " ' , , , ReactOS .", 12289, 36, 11, 182, 18
LTEXT "&³:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "&...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/zh-CN.rc b/reactos/dll/win32/shell32/lang/zh-CN.rc
index 7d0d53d941c..88f36683dce 100644
--- a/reactos/dll/win32/shell32/lang/zh-CN.rc
+++ b/reactos/dll/win32/shell32/lang/zh-CN.rc
@@ -144,7 +144,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Ŀ¼ļInternetԴReactOSΪ", 12289, 36, 11, 182, 18
LTEXT "(&O):", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "ȷ", IDOK, 62, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "ȡ", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
PUSHBUTTON "(&B)...", 12288, 170, 63, 50, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/lang/zh-TW.rc b/reactos/dll/win32/shell32/lang/zh-TW.rc
index 8e550edd429..de647ecda55 100644
--- a/reactos/dll/win32/shell32/lang/zh-TW.rc
+++ b/reactos/dll/win32/shell32/lang/zh-TW.rc
@@ -156,7 +156,7 @@ BEGIN
ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18
LTEXT "&Open:", 12305, 7, 39, 24, 10
- CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
DEFPUSHBUTTON "OK", IDOK, 36, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "Cancel", IDCANCEL, 98, 63, 59, 14, WS_TABSTOP
PUSHBUTTON "&Browse...", 12288, 160, 63, 59, 14, WS_TABSTOP
diff --git a/reactos/dll/win32/shell32/shell32.spec b/reactos/dll/win32/shell32/shell32.spec
index dc1161e61e3..75fb65ffd3c 100644
--- a/reactos/dll/win32/shell32/shell32.spec
+++ b/reactos/dll/win32/shell32/shell32.spec
@@ -197,9 +197,9 @@
197 stdcall -noname SHGlobalDefect(long)
198 stdcall -noname SHAbortInvokeCommand()
199 stdcall ExtractAssociatedIconA(long str ptr)
-200 stdcall -noname SHLocalAlloc(long long)
-201 stdcall -noname SHLocalFree(ptr)
-202 stdcall -noname SHLocalReAlloc(ptr long long)
+200 stdcall -noname SHCreateDesktop(ptr)
+201 stdcall -noname SHDesktopMessageLoop(ptr)
+202 stub -noname DDEHandleViewFolderNotify
203 stdcall -noname AddCommasW(long wstr)
204 stdcall -noname ShortSizeFormatW(double)
205 stdcall Printer_LoadIconsW(wstr ptr ptr)
diff --git a/reactos/dll/win32/shell32/shellord.c b/reactos/dll/win32/shell32/shellord.c
index 7220067e2dc..002a6bb8e8f 100644
--- a/reactos/dll/win32/shell32/shellord.c
+++ b/reactos/dll/win32/shell32/shellord.c
@@ -1265,11 +1265,19 @@ BOOL WINAPI FileIconInit(BOOL bFullInit)
{ FIXME("(%s)\n", bFullInit ? "true" : "false");
return 0;
}
-/*************************************************************************
- * IsUserAdmin [SHELL32.680] NT 4.0
- *
- */
+/*************************************************************************
+ * IsUserAnAdmin [SHELL32.680] NT 4.0
+ *
+ * Checks whether the current user is a member of the Administrators group.
+ *
+ * PARAMS
+ * None
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
BOOL WINAPI IsUserAnAdmin(VOID)
{
SID_IDENTIFIER_AUTHORITY Authority = {SECURITY_NT_AUTHORITY};
@@ -1331,7 +1339,6 @@ BOOL WINAPI IsUserAnAdmin(VOID)
FreeSid(lpSid);
HeapFree(GetProcessHeap(), 0, lpGroups);
-
return bResult;
}
diff --git a/reactos/dll/win32/shell32/stubs.c b/reactos/dll/win32/shell32/stubs.c
index 19d586c479d..e12e2203099 100644
--- a/reactos/dll/win32/shell32/stubs.c
+++ b/reactos/dll/win32/shell32/stubs.c
@@ -14,41 +14,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(shell);
-/*
- * Unimplemented
- */
-HLOCAL
-WINAPI
-SHLocalAlloc(UINT uFlags, SIZE_T uBytes)
-{
- FIXME("SHLocalAlloc() stub\n");
- return NULL;
-}
-
-/*
- * Unimplemented
- */
-HLOCAL
-WINAPI
-SHLocalFree(HLOCAL hMem)
-{
- FIXME("SHLocalFree() stub\n");
- return NULL;
-}
-
-/*
- * Unimplemented
- */
-HLOCAL
-WINAPI
-SHLocalReAlloc(HLOCAL hMem,
- SIZE_T uBytes,
- UINT uFlags)
-{
- FIXME("SHLocalReAlloc() stub\n");
- return NULL;
-}
-
/*
* Unimplemented
*/
diff --git a/reactos/dll/win32/shlwapi/shlwapi.spec b/reactos/dll/win32/shlwapi/shlwapi.spec
index d9cc3a5f842..b6426e784db 100644
--- a/reactos/dll/win32/shlwapi/shlwapi.spec
+++ b/reactos/dll/win32/shlwapi/shlwapi.spec
@@ -193,7 +193,7 @@
193 stdcall -noname SHGetCurColorRes()
194 stdcall -noname SHWaitForSendMessageThread(ptr long)
195 stdcall -noname SHIsExpandableFolder(ptr ptr)
-196 stub -noname DnsRecordSetCompare #stdcall @(ptr ptr ptr ptr) dnsapi.DnsRecordSetCompare
+196 stdcall -noname DnsRecordSetCompare(ptr ptr ptr ptr) dnsapi.DnsRecordSetCompare
197 stdcall -noname SHFillRectClr(long ptr long)
198 stdcall -noname SHSearchMapInt(ptr ptr long long)
199 stdcall -noname IUnknown_Set(ptr ptr)
@@ -215,7 +215,7 @@
215 stdcall -noname SHAnsiToUnicode(str ptr long)
216 stdcall -noname SHAnsiToUnicodeCP(long str ptr long)
217 stdcall -noname SHUnicodeToAnsi(wstr ptr ptr)
-218 stdcall -noname SHUnicodeToAnsiCP(long wstr ptr ptr)
+218 stdcall -noname SHUnicodeToAnsiCP(long wstr ptr long)
219 stdcall -noname QISearch(long long long long)
220 stdcall -noname SHSetDefaultDialogFont(ptr long)
221 stdcall -noname SHRemoveDefaultDialogFont(ptr)
@@ -477,7 +477,7 @@
477 stub -noname SHCreatePropertyBagOnMemory
478 stdcall -noname IUnknown_TranslateAcceleratorIO(ptr ptr)
479 stub -noname IUnknown_UIActivateIO
-480 stub -noname UrlCrackW
+480 stdcall -noname UrlCrackW(wstr long long ptr) wininet.InternetCrackUrlW
481 stdcall -noname IUnknown_HasFocusIO(ptr)
482 stub -noname SHMessageBoxHelpA
483 stub -noname SHMessageBoxHelpW
diff --git a/reactos/dll/win32/shlwapi/string.c b/reactos/dll/win32/shlwapi/string.c
index da0dee3cfd2..755360d790a 100644
--- a/reactos/dll/win32/shlwapi/string.c
+++ b/reactos/dll/win32/shlwapi/string.c
@@ -2477,20 +2477,24 @@ DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
* CodePage [I] Code page to use for the conversion
* lpSrcStr [I] Source Unicode string to convert
* lpDstStr [O] Destination for converted Ascii string
- * lpiLen [I/O] Input length of lpDstStr/destination for length of lpDstStr
+ * dstlen [I] Length of buffer at lpDstStr
*
* RETURNS
- * Success: The number of characters that result from the conversion.
- * Failure: 0.
+ * Success: The length in bytes of the result at lpDstStr (including the terminator)
+ * Failure: When using CP_UTF8, CP_UTF7 or 0xc350 as codePage, 0 is returned and
+ * the result is not nul-terminated.
+ * When using a different codepage, the length in bytes of the truncated
+ * result at lpDstStr (including the terminator) is returned and
+ * lpDstStr is always nul-terminated.
+ *
*/
-INT WINAPI SHUnicodeToAnsiCP(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr,
- LPINT lpiLen)
+DWORD WINAPI SHUnicodeToAnsiCP(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr, int dstlen)
{
static const WCHAR emptyW[] = { '\0' };
int len , reqLen;
LPSTR mem;
- if (!lpDstStr || !lpiLen)
+ if (!lpDstStr || !dstlen)
return 0;
if (!lpSrcStr)
@@ -2509,41 +2513,41 @@ INT WINAPI SHUnicodeToAnsiCP(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr,
case CP_UTF8:
{
DWORD dwMode = 0;
- INT nWideCharCount = len - 1;
+ INT lenW = len - 1;
+ INT needed = dstlen - 1;
+ HRESULT hr;
- if (ConvertINetUnicodeToMultiByte(&dwMode, CodePage, lpSrcStr,
- &nWideCharCount, lpDstStr,
- lpiLen) == S_OK)
+ /* try the user supplied buffer first */
+ hr = ConvertINetUnicodeToMultiByte(&dwMode, CodePage, lpSrcStr, &lenW, lpDstStr, &needed);
+ if (hr == S_OK)
+ {
+ lpDstStr[needed] = '\0';
+ return needed + 1;
+ }
+
+ /* user buffer too small. exclude termination and copy as much as possible */
+ lenW = len;
+ hr = ConvertINetUnicodeToMultiByte(&dwMode, CodePage, lpSrcStr, &lenW, NULL, &needed);
+ needed++;
+ mem = HeapAlloc(GetProcessHeap(), 0, needed);
+ if (!mem)
return 0;
- if (nWideCharCount < len - 1)
+ hr = ConvertINetUnicodeToMultiByte(&dwMode, CodePage, lpSrcStr, &len, mem, &needed);
+ if (hr == S_OK)
{
- mem = HeapAlloc(GetProcessHeap(), 0, *lpiLen);
- if (!mem)
- return 0;
-
- *lpiLen = 0;
-
- if (ConvertINetUnicodeToMultiByte(&dwMode, CodePage, lpSrcStr, &len,
- mem, lpiLen) != S_OK)
- {
- SHTruncateString(mem, *lpiLen);
- lstrcpynA(lpDstStr, mem, *lpiLen + 1);
- HeapFree(GetProcessHeap(), 0, mem);
- return *lpiLen + 1;
- }
- HeapFree(GetProcessHeap(), 0, mem);
- return *lpiLen;
+ reqLen = SHTruncateString(mem, dstlen);
+ if (reqLen > 0) memcpy(lpDstStr, mem, reqLen-1);
}
- lpDstStr[*lpiLen] = '\0';
- return *lpiLen;
+ HeapFree(GetProcessHeap(), 0, mem);
+ return 0;
}
default:
break;
}
- reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, lpDstStr,
- *lpiLen, NULL, NULL);
+ /* try the user supplied buffer first */
+ reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, lpDstStr, dstlen, NULL, NULL);
if (!reqLen && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
@@ -2556,12 +2560,12 @@ INT WINAPI SHUnicodeToAnsiCP(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr,
reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, mem,
reqLen, NULL, NULL);
- reqLen = SHTruncateString(mem, *lpiLen);
+ reqLen = SHTruncateString(mem, dstlen -1);
reqLen++;
- lstrcpynA(lpDstStr, mem, *lpiLen);
-
+ lstrcpynA(lpDstStr, mem, reqLen);
HeapFree(GetProcessHeap(), 0, mem);
+ lpDstStr[reqLen-1] = '\0';
}
}
}
@@ -2586,9 +2590,7 @@ INT WINAPI SHUnicodeToAnsiCP(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr,
*/
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
{
- INT myint = iLen;
-
- return SHUnicodeToAnsiCP(CP_ACP, lpSrcStr, lpDstStr, &myint);
+ return SHUnicodeToAnsiCP(CP_ACP, lpSrcStr, lpDstStr, iLen);
}
/*************************************************************************
diff --git a/reactos/dll/win32/sndblst/sndblst.c b/reactos/dll/win32/sndblst/sndblst.c
index d27205245d1..e826c0098c3 100644
--- a/reactos/dll/win32/sndblst/sndblst.c
+++ b/reactos/dll/win32/sndblst/sndblst.c
@@ -32,6 +32,7 @@ PWSTR SBMixerDeviceName = L"ROS Sound Blaster Mixer";
MMRESULT
GetSoundBlasterDeviceCapabilities(
IN PSOUND_DEVICE SoundDevice,
+ IN DWORD DeviceId,
OUT PVOID Capabilities,
IN DWORD CapabilitiesSize)
{
diff --git a/reactos/dll/win32/syssetup/lang/de-DE.rc b/reactos/dll/win32/syssetup/lang/de-DE.rc
index 4e7caec023a..cbaac3c379e 100644
--- a/reactos/dll/win32/syssetup/lang/de-DE.rc
+++ b/reactos/dll/win32/syssetup/lang/de-DE.rc
@@ -150,10 +150,10 @@ FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Fertigstellung des ReactOS Setup Assistenten",IDC_FINISHTITLE,115,9,195,37
LTEXT "Das ReactOS Setup wurde erfolgreich fertiggestellt.\n\n" \
- "Wenn Sie auf Fertig klicken, wird der Computer neu gestartet.", IDC_STATIC, 115, 58, 195, 100
+ "Wenn Sie auf Beenden klicken, wird der Computer neu gestartet.", IDC_STATIC, 115, 58, 195, 100
CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 115, 138, 188, 12
LTEXT "Entfernen Sie die CD, wenn vorhanden. Danach klicken Sie "\
- "auf Fertig, um den Computer neu zu starten.", IDC_STATIC, 115, 160, 195, 31
+ "auf Beenden, um den Computer neu zu starten.", IDC_STATIC, 115, 160, 195, 31
END
diff --git a/reactos/dll/win32/syssetup/lang/ro-RO.rc b/reactos/dll/win32/syssetup/lang/ro-RO.rc
index d8768f36cf4..317b7f00675 100644
--- a/reactos/dll/win32/syssetup/lang/ro-RO.rc
+++ b/reactos/dll/win32/syssetup/lang/ro-RO.rc
@@ -19,17 +19,18 @@
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(65001)
IDD_WELCOMEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Instalare ReactOS"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Bun venit la Expertul de instalare a ReactOS.", IDC_WELCOMETITLE, 115, 8, 195, 24
- LTEXT "Acest expert instaleaz ReactOS pe computerul dvs. Expertul "\
- "trebuie s adune nite informaii despre computer"\
+ LTEXT "Bun venit la Expertul de instalare al ReactOS.", IDC_WELCOMETITLE, 115, 8, 195, 24
+ LTEXT "Acest expert instalează ReactOS pe computerul dvs. Expertul "\
+ "trebuie să adune niște informații despre computer"\
"pentru a instala ReactOS corect.", IDC_STATIC, 115, 40, 195, 100
- LTEXT "Clic pe Urmtor pentru a continua.", IDC_STATIC, 115, 169, 195, 17
+ LTEXT "Clic pe Următor pentru a continua.", IDC_STATIC, 115, 169, 195, 17
END
@@ -38,16 +39,16 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYS
CAPTION "Instalare ReactOS"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
- LTEXT "Dezvoltatorii ReactOS le sunt recunosctori urmtoarelor proiecte de software liber "\
- "din care s-au utilizat pri de cod la crearea ReactOS:",
+ LTEXT "Dezvoltatorii ReactOS le sunt recunoscători următoarelor proiecte de software liber "\
+ "care au fost utilizate la crearea ReactOS:",
IDC_STATIC,15,7,286,19
LISTBOX IDC_PROJECTS,15,30,286,75,LBS_NOSEL | LBS_HASSTRINGS |
LBS_NOINTEGRALHEIGHT | WS_VSCROLL
- LTEXT "ReactOS este sub licena GPL, astfel dac vrei s l redistribuii "\
- "trebuie s respectai licena GPL.",
+ LTEXT "ReactOS este sub licența GPL, astfel dacă vreți să îl redistribuiți "\
+ "trebuie să respectați licența GPL.",
IDC_STATIC,15,110,227,19
PUSHBUTTON "&Vizualizare GPL...",IDC_VIEWGPL,251,110,50,19
- LTEXT "Clic pe Urmtor pentru a continua.",IDC_STATIC,15,136,
+ LTEXT "Clic pe Următor pentru a continua.",IDC_STATIC,15,136,
195,17
END
@@ -58,11 +59,11 @@ CAPTION "Instalare ReactOS"
FONT 8, "MS Shell Dlg"
BEGIN
ICON IDI_ICON2, IDC_STATIC, 21, 7, 20, 20
- LTEXT "Scriei-v numele i numele companiei sau organizaiei din care facei parte.",
+ LTEXT "Scrieți-vă numele și numele companiei sau organizației din care faceți parte.",
IDC_STATIC, 54, 7, 242, 21
LTEXT "Nu&me:", IDC_STATIC, 54, 37, 44, 8
EDITTEXT IDC_OWNERNAME, 132, 35, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL
- LTEXT "&Organizaie:", IDC_STATIC, 54, 57, 44, 8
+ LTEXT "&Organizație:", IDC_STATIC, 54, 57, 44, 8
EDITTEXT IDC_OWNERORGANIZATION, 132, 55, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL
END
@@ -73,20 +74,20 @@ CAPTION "Instalare ReactOS"
FONT 8, "MS Shell Dlg"
BEGIN
ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20
- LTEXT "Scriei un nume pentru computer de maxim 63 de caractere. "\
- "Dac suntei n reea, numele computerului trebuie s fie unic.",
+ LTEXT "Scrieți un nume pentru computer de maxim 63 de caractere. "\
+ "Dacă sunteți în rețea, numele computerului trebuie să fie unic.",
IDC_STATIC, 54, 7, 250, 24
LTEXT "&Nume:", IDC_STATIC, 54, 38, 75, 8
EDITTEXT IDC_COMPUTERNAME, 165, 35, 148, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | ES_UPPERCASE
ICON IDI_ICON5, IDC_STATIC, 21, 57, 20, 20
LTEXT "Expertul va crea un cont de utilizator cu numele Administrator. "\
- "l putei folosi cnd vrei control complet asupra computerului.",
+ "Îl puteți folosi când vreți control complet asupra computerului.",
IDC_STATIC, 54, 57, 250, 25
- LTEXT "Scriei o parol pentru Administrator de maxim 14 caractere.",
+ LTEXT "Scrieți o parolă pentru Administrator de maxim 14 caractere.",
IDC_STATIC, 54, 87, 250, 8
- LTEXT "&Parol administrator:", IDC_STATIC, 54, 104, 105, 8
+ LTEXT "&Parolă administrator:", IDC_STATIC, 54, 104, 105, 8
EDITTEXT IDC_ADMINPASSWORD1, 165, 101, 148, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD
- LTEXT "C&onfirmare parol:", IDC_STATIC, 54, 123, 105, 8
+ LTEXT "C&onfirmare parolă:", IDC_STATIC, 54, 123, 105, 8
EDITTEXT IDC_ADMINPASSWORD2, 165, 120, 148, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD
END
@@ -97,17 +98,17 @@ CAPTION "Instalare ReactOS"
FONT 8, "MS Shell Dlg"
BEGIN
ICON IDI_ICON4, IDC_STATIC, 21, 7, 20, 20
- LTEXT "Setrile regionale ar trebui s se potriveasc cu limba"\
- "programelor. Acestea controleaz cum apar numerele, "\
- "datele i valutele.", IDC_STATIC, 53, 7, 253, 20
+ LTEXT "Setările regionale ar trebui să se potrivească cu limba"\
+ "programelor. Acestea controlează cum apar numerele, "\
+ "datele și valutele.", IDC_STATIC, 53, 7, 253, 20
LTEXT "", IDC_LOCALETEXT, 53, 29, 250, 16
- LTEXT "Pentru a aceste setri, clic pe Particularizare.",
+ LTEXT "Pentru a aceste setări, clic pe Particularizare.",
IDC_STATIC, 53, 60, 196, 8
PUSHBUTTON "&Particularizare", IDC_CUSTOMLOCALE, 250, 57, 50, 14
- LTEXT "Controalele de ablon tastatur seteaz cum apar literele cnd scriei.",
+ LTEXT "Controalele de șablon tastatură setează cum apar literele când scrieți.",
IDC_STATIC, 53, 86, 253, 8
LTEXT "", IDC_LAYOUTTEXT, 53, 100, 250, 16
- LTEXT "Pentru a schimba ablonul, clic pe Particularizare.",
+ LTEXT "Pentru a schimba șablonul, clic pe Particularizare.",
IDC_STATIC, 53, 126, 184, 8
PUSHBUTTON "Particularizare", IDC_CUSTOMLAYOUT, 250, 122, 50, 14
END
@@ -119,7 +120,7 @@ CAPTION "Instalare ReactOS"
FONT 8, "MS Shell Dlg"
BEGIN
ICON IDI_ICON3, IDC_STATIC, 21, 10, 20, 20
- LTEXT "Dat i timp:", IDC_STATIC, 53, 7, 253, 8
+ LTEXT "Dată și timp:", IDC_STATIC, 53, 7, 253, 8
CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
DTS_LONGDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 53, 17, 137, 14
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
@@ -127,7 +128,7 @@ BEGIN
LTEXT "Fus orar:", IDC_STATIC, 53, 42, 253, 8
COMBOBOX IDC_TIMEZONELIST, 53, 52, 201, 93,
CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- AUTOCHECKBOX "Ajustare automat ceas la schimbarea de fus orar",
+ AUTOCHECKBOX "Ajustare automată ceas la schimbarea de fus orar",
IDC_AUTODAYLIGHT, 53, 124, 201, 10
END
@@ -150,17 +151,17 @@ CAPTION "Finalizare instalare ReactOS"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Terminare Expert instalare ReactOS", IDC_FINISHTITLE, 115, 8, 195, 24
- LTEXT "Ai terminat cu succes instalarea ReactOS.\n\n" \
- "Dup ce vei apsa Termin computerul va reporni.", IDC_STATIC, 115, 40, 195, 100
+ LTEXT "Ați terminat cu succes instalarea ReactOS.\n\n" \
+ "După ce veți apăsa Termină computerul va reporni.", IDC_STATIC, 115, 40, 195, 100
CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 115, 138, 188, 12
- LTEXT "Dac avei un CD introdus n computer, scoatei-l. Pentru a "\
- "reporni computerul, clic pe Termin.", IDC_STATIC, 115, 169, 195, 17
+ LTEXT "Dacă aveți un CD introdus în computer, scoateți-l. Pentru a "\
+ "reporni computerul, clic pe Termină.", IDC_STATIC, 115, 169, 195, 17
END
IDD_GPL DIALOGEX 0, 0, 333, 230
STYLE DS_SHELLFONT | DS_CENTER | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Licena public general GNU"
+CAPTION "Licența publică generală GNU"
FONT 8, "MS Shell Dlg"
BEGIN
EDITTEXT IDC_GPL_TEXT,7,7,319,190,ES_MULTILINE | ES_AUTOHSCROLL |
@@ -171,7 +172,7 @@ END
IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26
STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP
-CAPTION "V rugm ateptai..."
+CAPTION "Vă rugăm așteptați..."
FONT 8,"MS Shell Dlg 2",400,0,1
BEGIN
LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS
@@ -181,29 +182,29 @@ END
STRINGTABLE
BEGIN
IDS_ACKTITLE "Aducere-aminte"
- IDS_ACKSUBTITLE "Cine a contribuit la ReactOS i informaii despre licen"
- IDS_OWNERTITLE "Personalizai"
- IDS_OWNERSUBTITLE "Expertul folosete informaii despre dvs pentru a personaliza ReactOS."
- IDS_COMPUTERTITLE "Nume computer i parol administrator"
- IDS_COMPUTERSUBTITLE "Trebuie s introducei un nume i o parol de administrator pentru computer."
- IDS_LOCALETITLE "Setri regionale"
- IDS_LOCALESUBTITLE "Putei particulariza ReactOS pentru diferite regiuni sau limbi."
- IDS_DATETIMETITLE "Dat i timp"
- IDS_DATETIMESUBTITLE "Setai data corect pentru computer."
- IDS_PROCESSTITLE "nregistrare componente"
- IDS_PROCESSSUBTITLE "V rugm ateptai..."
+ IDS_ACKSUBTITLE "Cine a contribuit la ReactOS și informații despre licență"
+ IDS_OWNERTITLE "Personalizați"
+ IDS_OWNERSUBTITLE "Expertul folosește informații despre dvs pentru a personaliza ReactOS."
+ IDS_COMPUTERTITLE "Nume computer și parolă administrator"
+ IDS_COMPUTERSUBTITLE "Trebuie să introduceți un nume și o parolă de administrator pentru computer."
+ IDS_LOCALETITLE "Setări regionale"
+ IDS_LOCALESUBTITLE "Puteți particulariza ReactOS pentru diferite regiuni sau limbi."
+ IDS_DATETIMETITLE "Dată și timp"
+ IDS_DATETIMESUBTITLE "Setați data corectă pentru computer."
+ IDS_PROCESSTITLE "Înregistrare componente"
+ IDS_PROCESSSUBTITLE "Vă rugăm așteptați..."
END
STRINGTABLE
BEGIN
- IDS_CMT_DOWNLOADER "Descrcare i instalare diverse programe."
+ IDS_CMT_DOWNLOADER "Descărcare și instalare diverse programe."
END
STRINGTABLE
BEGIN
IDS_ACCESSORIES "Accesorii"
IDS_CMT_CALC "Lansare Calculator"
- IDS_CMT_CMD "Pornire linie de comand"
+ IDS_CMT_CMD "Pornire linie de comandă"
IDS_CMT_DEVMGMT "Pornire Gestionarul de dispozitive"
IDS_CMT_EVENTVIEW "Pornire Vizualizator de evenimente"
IDS_CMT_EXPLORER "Pornire Explorer"
@@ -211,7 +212,7 @@ BEGIN
IDS_CMT_NOTEPAD "Pornire Editor de text"
IDS_CMT_RDESKTOP "Pornire Remote Desktop"
IDS_CMT_REGEDIT "Pornire Editor de registri"
- IDS_CMT_SCREENSHOT "Efectuare captur de ecran"
+ IDS_CMT_SCREENSHOT "Efectuare captură de ecran"
IDS_CMT_SERVMAN "Pornire Gestionar de servicii"
IDS_CMT_WORDPAD "Pornire Editor de documente"
IDS_CMT_PAINT "Pornire Paint"
@@ -229,18 +230,18 @@ BEGIN
IDS_SYS_TOOLS "Unelte de sistem"
IDS_CMT_CHARMAP "Tabel caractere"
IDS_CMT_DXDIAG "Pornire program de diagnostic React-X"
- IDS_CMT_KBSWITCH "Comutator de ablon tastatur"
+ IDS_CMT_KBSWITCH "Comutator de șablon tastatură"
END
STRINGTABLE
BEGIN
IDS_SYS_ACCESSIBILITY "Accesibilitate"
- IDS_CMT_MAGNIFY "Lup"
+ IDS_CMT_MAGNIFY "Lupă"
END
STRINGTABLE
BEGIN
- IDS_SYS_ENTERTAINMENT "Distracie"
+ IDS_SYS_ENTERTAINMENT "Distracție"
IDS_CMT_MPLAY32 "Pornire Player Multimedia"
IDS_CMT_SNDVOL32 "Pornire Control Volum"
END
@@ -248,35 +249,35 @@ END
STRINGTABLE
BEGIN
IDS_REACTOS_SETUP "Instalare ReactOS"
- IDS_UNKNOWN_ERROR "Eroare necunoscut"
- IDS_REGISTERING_COMPONENTS "nregistrare componente..."
- IDS_LOADLIBRARY_FAILED "LoadLibrary a euat: "
- IDS_GETPROCADDR_FAILED "GetProcAddr a euat: "
- IDS_REGSVR_FAILED "DllRegisterServer a euat: "
- IDS_DLLINSTALL_FAILED "DllInstall a euat: "
- IDS_TIMEOUT "Timp expirat n timpul nregistrrii"
+ IDS_UNKNOWN_ERROR "Eroare necunoscută"
+ IDS_REGISTERING_COMPONENTS "Înregistrare componente..."
+ IDS_LOADLIBRARY_FAILED "LoadLibrary a eșuat: "
+ IDS_GETPROCADDR_FAILED "GetProcAddr a eșuat: "
+ IDS_REGSVR_FAILED "DllRegisterServer a eșuat: "
+ IDS_DLLINSTALL_FAILED "DllInstall a eșuat: "
+ IDS_TIMEOUT "Timp expirat în timpul înregistrării"
IDS_REASON_UNKNOWN ""
END
STRINGTABLE
BEGIN
IDS_SHORT_CALC "Calculator.lnk"
- IDS_SHORT_CHARMAP "Character Map.lnk"
- IDS_SHORT_CMD "Linie comand.lnk"
+ IDS_SHORT_CHARMAP "Hartă caractere.lnk"
+ IDS_SHORT_CMD "Linie comandă.lnk"
IDS_SHORT_DEVICE "Gestionar dispozitive.lnk"
- IDS_SHORT_DOWNLOADER "Descarc !.lnk"
+ IDS_SHORT_DOWNLOADER "Descarcă !.lnk"
IDS_SHORT_DXDIAG "Diagnostic ReactX.lnk"
IDS_SHORT_EVENTVIEW "Vizualizator evenimente.lnk"
IDS_SHORT_EXPLORER "ReactOS Explorer.lnk"
- IDS_SHORT_KBSWITCH "Comutator ablon tastatur.lnk"
- IDS_SHORT_MAGNIFY "Lup.lnk"
+ IDS_SHORT_KBSWITCH "Comutator șablon tastatură.lnk"
+ IDS_SHORT_MAGNIFY "Lupă.lnk"
IDS_SHORT_MPLAY32 "Player Multimedia.lnk"
IDS_SHORT_MSCONFIG "Configurare sistem.lnk"
- IDS_SHORT_NOTEPAD "Carneel.lnk"
+ IDS_SHORT_NOTEPAD "Carnețel.lnk"
IDS_SHORT_RDESKTOP "Remote Desktop.lnk"
IDS_SHORT_REGEDIT "Editor de registrii.lnk"
IDS_SHORT_SERVICE "Gestionar de servicii.lnk"
- IDS_SHORT_SNAP "Captur de ecran.lnk"
+ IDS_SHORT_SNAP "Captură de ecran.lnk"
IDS_SHORT_SNDVOL32 "Control volum.lnk"
IDS_SHORT_SOLITAIRE "Solitaire.lnk"
IDS_SHORT_WINEMINE "WineMine.lnk"
@@ -286,13 +287,13 @@ END
STRINGTABLE
BEGIN
- IDS_WZD_NAME "Expertul nu poate continua pn cnd nu scriei un nume."
+ IDS_WZD_NAME "Expertul nu poate continua până când nu scrieți un nume."
IDS_WZD_SETCOMPUTERNAME "Expertul nu a putut seta numele computerului."
- IDS_WZD_COMPUTERNAME "Expertul nu poate continua pn cnd nu scriei un nume pentru computer."
- IDS_WZD_PASSWORDEMPTY "Trebuie s scriei o parol !"
- IDS_WZD_PASSWORDMATCH "Parolele scrise nu se potrivesc. V rugm rescriei parola dorit i rencercai."
- IDS_WZD_PASSWORDCHAR "Parola introdus de dumneavoastr conine caractere invalide. Rescriei parola i rencercai."
- IDS_WZD_LOCALTIME "Expertul nu a putut seta ora local."
+ IDS_WZD_COMPUTERNAME "Expertul nu poate continua până când nu scrieți un nume pentru computer."
+ IDS_WZD_PASSWORDEMPTY "Trebuie să scrieți o parolă !"
+ IDS_WZD_PASSWORDMATCH "Parolele scrise nu se potrivesc. Vă rugăm rescrieți parola dorită și reîncercați."
+ IDS_WZD_PASSWORDCHAR "Parola introdusă de dumneavoastră conține caractere invalide. Rescrieți parola și reîncercați."
+ IDS_WZD_LOCALTIME "Expertul nu a putut seta ora locală."
END
STRINGTABLE
@@ -300,4 +301,5 @@ BEGIN
IDS_STATUS_INSTALL_DEV "Instalare dispozitive..."
END
+#pragma code_page(default)
/* EOF */
diff --git a/reactos/dll/win32/urlmon/bindctx.c b/reactos/dll/win32/urlmon/bindctx.c
index 044b817eda5..8c1949bae8c 100644
--- a/reactos/dll/win32/urlmon/bindctx.c
+++ b/reactos/dll/win32/urlmon/bindctx.c
@@ -386,7 +386,7 @@ static HRESULT WINAPI BSCHttpNegotiate_GetRootSecurityId(IHttpNegotiate2 *iface,
TRACE("(%p)->(%p %p %ld)\n", This, pbSecurityId, pcbSecurityId, dwReserved);
if(!This->http_negotiate2)
- return E_FAIL;
+ return E_NOTIMPL;
return IHttpNegotiate2_GetRootSecurityId(This->http_negotiate2, pbSecurityId,
pcbSecurityId, dwReserved);
diff --git a/reactos/dll/win32/user32/controls/button.c b/reactos/dll/win32/user32/controls/button.c
index 3763fbcf173..4eb8bc66547 100644
--- a/reactos/dll/win32/user32/controls/button.c
+++ b/reactos/dll/win32/user32/controls/button.c
@@ -102,8 +102,8 @@ static void GB_Paint( HWND hwnd, HDC hDC, UINT action );
static void UB_Paint( HWND hwnd, HDC hDC, UINT action );
static void OB_Paint( HWND hwnd, HDC hDC, UINT action );
static void BUTTON_CheckAutoRadioButton( HWND hwnd );
-static LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
-static LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+//static LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+//static LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
#define MAX_BTN_TYPE 12
@@ -249,8 +249,8 @@ static BOOL button_update_uistate(HWND hwnd, BOOL unicode)
/***********************************************************************
* ButtonWndProc_common
*/
-static LRESULT ButtonWndProc_common(HWND hWnd, UINT uMsg,
- WPARAM wParam, LPARAM lParam, BOOL unicode )
+LRESULT WINAPI ButtonWndProc_common(HWND hWnd, UINT uMsg,
+ WPARAM wParam, LPARAM lParam, BOOL unicode )
{
RECT rect;
POINT pt;
@@ -467,6 +467,7 @@ static LRESULT ButtonWndProc_common(HWND hWnd, UINT uMsg,
if (style & BS_NOTIFY)
BUTTON_NOTIFY_PARENT(hWnd, BN_KILLFOCUS);
+ InvalidateRect( hWnd, NULL, FALSE );
break;
case WM_SYSCOLORCHANGE:
@@ -590,7 +591,7 @@ static LRESULT ButtonWndProc_common(HWND hWnd, UINT uMsg,
* the passed HWND and calls the real window procedure (with a WND*
* pointer pointing to the locked windowstructure).
*/
-static LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
+LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
if (!IsWindow( hWnd )) return 0;
return ButtonWndProc_common( hWnd, uMsg, wParam, lParam, TRUE );
@@ -600,7 +601,7 @@ static LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
/***********************************************************************
* ButtonWndProcA
*/
-static LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
+LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
if (!IsWindow( hWnd )) return 0;
return ButtonWndProc_common( hWnd, uMsg, wParam, lParam, FALSE );
@@ -859,8 +860,12 @@ static void PB_Paint( HWND hwnd, HDC hDC, UINT action )
SendMessageW( parent, WM_CTLCOLORBTN, (WPARAM)hDC, (LPARAM)hwnd );
setup_clipping( hwnd, hDC );
-
+#ifdef __REACTOS__
+ hOldPen = SelectObject(hDC, GetStockObject(DC_PEN));
+ SetDCPenColor(hDC, GetSysColor(COLOR_WINDOWFRAME));
+#else
hOldPen = SelectObject(hDC, SYSCOLOR_GetPen(COLOR_WINDOWFRAME));
+#endif
hOldBrush = SelectObject(hDC,GetSysColorBrush(COLOR_BTNFACE));
oldBkMode = SetBkMode(hDC, TRANSPARENT);
diff --git a/reactos/dll/win32/user32/controls/combo.c b/reactos/dll/win32/user32/controls/combo.c
index 5594858c183..8d3ef3350d1 100644
--- a/reactos/dll/win32/user32/controls/combo.c
+++ b/reactos/dll/win32/user32/controls/combo.c
@@ -74,8 +74,8 @@ static UINT CBitHeight, CBitWidth;
#define COMBO_EDITBUTTONSPACE() 0
#define EDIT_CONTROL_PADDING() 1
-static LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
-static LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
+//static LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
+//static LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
/*********************************************************************
* combo class descriptor
@@ -1836,8 +1836,8 @@ static char *strdupA(LPCSTR str)
/***********************************************************************
* ComboWndProc_common
*/
-static LRESULT ComboWndProc_common( HWND hwnd, UINT message,
- WPARAM wParam, LPARAM lParam, BOOL unicode )
+LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
+ WPARAM wParam, LPARAM lParam, BOOL unicode )
{
LPHEADCOMBO lphc = (LPHEADCOMBO)GetWindowLongPtrW( hwnd, 0 );
@@ -2361,7 +2361,7 @@ static LRESULT ComboWndProc_common( HWND hwnd, UINT message,
* This is just a wrapper for the real ComboWndProc which locks/unlocks
* window structs.
*/
-static LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
+LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
if (!IsWindow(hwnd)) return 0;
return ComboWndProc_common( hwnd, message, wParam, lParam, FALSE );
@@ -2370,7 +2370,7 @@ static LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPA
/***********************************************************************
* ComboWndProcW
*/
-static LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
+LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
if (!IsWindow(hwnd)) return 0;
return ComboWndProc_common( hwnd, message, wParam, lParam, TRUE );
diff --git a/reactos/dll/win32/user32/controls/edit.c b/reactos/dll/win32/user32/controls/edit.c
index bfc07c1f6da..9f0d9c1d47b 100644
--- a/reactos/dll/win32/user32/controls/edit.c
+++ b/reactos/dll/win32/user32/controls/edit.c
@@ -4816,7 +4816,7 @@ static inline LRESULT DefWindowProcT(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
* names).
*
*/
-static LRESULT EditWndProc_common( HWND hwnd, UINT msg,
+LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam, BOOL unicode )
{
EDITSTATE *es = (EDITSTATE *)GetWindowLongPtrW( hwnd, 0 );
diff --git a/reactos/dll/win32/user32/controls/icontitle.c b/reactos/dll/win32/user32/controls/icontitle.c
index 617f3bae91b..01231cdd03c 100644
--- a/reactos/dll/win32/user32/controls/icontitle.c
+++ b/reactos/dll/win32/user32/controls/icontitle.c
@@ -30,7 +30,7 @@
static BOOL bMultiLineTitle;
static HFONT hIconTitleFont;
-static LRESULT WINAPI IconTitleWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
+//static LRESULT WINAPI IconTitleWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
/*********************************************************************
* icon title class descriptor
diff --git a/reactos/dll/win32/user32/controls/listbox.c b/reactos/dll/win32/user32/controls/listbox.c
index f332f40fa21..d46c1bb81ba 100644
--- a/reactos/dll/win32/user32/controls/listbox.c
+++ b/reactos/dll/win32/user32/controls/listbox.c
@@ -138,8 +138,8 @@ typedef enum
static TIMER_DIRECTION LISTBOX_Timer = LB_TIMER_NONE;
-static LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
-static LRESULT WINAPI ListBoxWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
+//static LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam,LPARAM lParam );
+//static LRESULT WINAPI ListBoxWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
static LRESULT LISTBOX_GetItemRect( const LB_DESCR *descr, INT index, RECT *rect );
@@ -2659,8 +2659,8 @@ static BOOL LISTBOX_Destroy( LB_DESCR *descr )
/***********************************************************************
* ListBoxWndProc_common
*/
-static LRESULT ListBoxWndProc_common( HWND hwnd, UINT msg,
- WPARAM wParam, LPARAM lParam, BOOL unicode )
+LRESULT WINAPI ListBoxWndProc_common( HWND hwnd, UINT msg,
+ WPARAM wParam, LPARAM lParam, BOOL unicode )
{
LB_DESCR *descr = (LB_DESCR *)GetWindowLongPtrW( hwnd, 0 );
LPHEADCOMBO lphc = 0;
@@ -3446,7 +3446,7 @@ static LRESULT ListBoxWndProc_common( HWND hwnd, UINT msg,
/***********************************************************************
* ListBoxWndProcA
*/
-static LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
+LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
return ListBoxWndProc_common( hwnd, msg, wParam, lParam, FALSE );
}
@@ -3454,7 +3454,7 @@ static LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARA
/***********************************************************************
* ListBoxWndProcW
*/
-static LRESULT WINAPI ListBoxWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
+LRESULT WINAPI ListBoxWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
return ListBoxWndProc_common( hwnd, msg, wParam, lParam, TRUE );
}
diff --git a/reactos/dll/win32/user32/controls/regcontrol.c b/reactos/dll/win32/user32/controls/regcontrol.c
index 63fd47a28f0..0cc49e7a2ed 100644
--- a/reactos/dll/win32/user32/controls/regcontrol.c
+++ b/reactos/dll/win32/user32/controls/regcontrol.c
@@ -13,6 +13,10 @@
#include
+static PFNCLIENT pfnClientA;
+static PFNCLIENT pfnClientW;
+static PFNCLIENTWORKER pfnClientWorker;
+
static const struct
{
const struct builtin_class_descr *desc;
@@ -23,7 +27,6 @@ static const struct
{ &POPUPMENU_builtin_class, FNID_MENU },
{ &COMBO_builtin_class, FNID_COMBOBOX },
{ &COMBOLBOX_builtin_class, FNID_COMBOLBOX },
- { &DESKTOP_builtin_class, FNID_DESKTOP },
{ &MDICLIENT_builtin_class, FNID_MDICLIENT },
#if 0
{ &MENU_builtin_class, FNID_MENU },
@@ -61,3 +64,91 @@ BOOL WINAPI RegisterSystemControls(VOID)
return NtUserRegisterSystemClasses(sizeof(cls) / sizeof(cls[0]), cls);
}
+
+LRESULT
+WINAPI
+MsgWindowProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
+{
+ if (message == WM_NCCREATE) return TRUE;
+ return 0;
+}
+
+LRESULT
+WINAPI
+DialogWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode)
+{
+ if (unicode)
+ return DefDlgProcW( hwnd, uMsg, wParam, lParam);
+ return DefDlgProcA( hwnd, uMsg, wParam, lParam);
+}
+
+BOOL WINAPI RegisterClientPFN(VOID)
+{
+ NTSTATUS Status;
+
+ pfnClientA.pfnScrollBarWndProc = ScrollBarWndProcA;
+ pfnClientW.pfnScrollBarWndProc = ScrollBarWndProcW;
+ pfnClientA.pfnTitleWndProc = IconTitleWndProc;
+ pfnClientW.pfnTitleWndProc = IconTitleWndProc;
+ pfnClientA.pfnMenuWndProc = PopupMenuWndProcA;
+ pfnClientW.pfnMenuWndProc = PopupMenuWndProcW;
+ pfnClientA.pfnDesktopWndProc = DesktopWndProc;
+ pfnClientW.pfnDesktopWndProc = DesktopWndProc;
+ pfnClientA.pfnDefWindowProc = DefWindowProcA;
+ pfnClientW.pfnDefWindowProc = DefWindowProcW;
+ pfnClientA.pfnMessageWindowProc = MsgWindowProc;
+ pfnClientW.pfnMessageWindowProc = MsgWindowProc;
+ pfnClientA.pfnSwitchWindowProc = DefWindowProcA;
+ pfnClientW.pfnSwitchWindowProc = DefWindowProcW;
+ pfnClientA.pfnButtonWndProc = ButtonWndProcA;
+ pfnClientW.pfnButtonWndProc = ButtonWndProcW;
+ pfnClientA.pfnComboBoxWndProc = ComboWndProcA;
+ pfnClientW.pfnComboBoxWndProc = ComboWndProcW;
+ pfnClientA.pfnComboListBoxProc = ListBoxWndProcA;
+ pfnClientW.pfnComboListBoxProc = ListBoxWndProcW;
+ pfnClientA.pfnDialogWndProc = DefDlgProcA;
+ pfnClientW.pfnDialogWndProc = DefDlgProcW;
+ pfnClientA.pfnEditWndProc = EditWndProcA;
+ pfnClientW.pfnEditWndProc = EditWndProcW;
+ pfnClientA.pfnListBoxWndProc = ListBoxWndProcA;
+ pfnClientW.pfnListBoxWndProc = ListBoxWndProcW;
+ pfnClientA.pfnMDIClientWndProc = MDIClientWndProcA;
+ pfnClientW.pfnMDIClientWndProc = MDIClientWndProcW;
+ pfnClientA.pfnStaticWndProc = StaticWndProcA;
+ pfnClientW.pfnStaticWndProc = StaticWndProcW;
+ pfnClientA.pfnImeWndProc = DefWindowProcA;
+ pfnClientW.pfnImeWndProc = DefWindowProcW;
+ pfnClientA.pfnGhostWndProc = DefWindowProcA;
+ pfnClientW.pfnGhostWndProc = DefWindowProcW;
+ pfnClientA.pfnHkINLPCWPSTRUCT = DefWindowProcA;
+ pfnClientW.pfnHkINLPCWPSTRUCT = DefWindowProcW;
+ pfnClientA.pfnHkINLPCWPRETSTRUCT = DefWindowProcA;
+ pfnClientW.pfnHkINLPCWPRETSTRUCT = DefWindowProcW;
+ pfnClientA.pfnDispatchHook = DefWindowProcA;
+ pfnClientW.pfnDispatchHook = DefWindowProcW;
+ pfnClientA.pfnDispatchDefWindowProc = DefWindowProcA;
+ pfnClientW.pfnDispatchDefWindowProc = DefWindowProcW;
+ pfnClientA.pfnDispatchMessage = DefWindowProcA;
+ pfnClientW.pfnDispatchMessage = DefWindowProcW;
+ pfnClientA.pfnMDIActivateDlgProc = DefWindowProcA;
+ pfnClientW.pfnMDIActivateDlgProc = DefWindowProcW;
+
+ pfnClientWorker.pfnButtonWndProc = ButtonWndProc_common;
+ pfnClientWorker.pfnComboBoxWndProc = ComboWndProc_common;
+ pfnClientWorker.pfnComboListBoxProc = ListBoxWndProc_common;
+ pfnClientWorker.pfnDialogWndProc = DialogWndProc_common;
+ pfnClientWorker.pfnEditWndProc = EditWndProc_common;
+ pfnClientWorker.pfnListBoxWndProc = ListBoxWndProc_common;
+ pfnClientWorker.pfnMDIClientWndProc = MDIClientWndProc_common;
+ pfnClientWorker.pfnStaticWndProc = StaticWndProc_common;
+ pfnClientWorker.pfnImeWndProc = User32DefWindowProc;
+ pfnClientWorker.pfnGhostWndProc = User32DefWindowProc;
+ pfnClientWorker.pfnCtfHookProc = User32DefWindowProc;
+
+ Status = NtUserInitializeClientPfnArrays( &pfnClientA,
+ &pfnClientW,
+ &pfnClientWorker,
+ User32Instance);
+
+ return NT_SUCCESS(Status) ? TRUE : FALSE;
+}
diff --git a/reactos/dll/win32/user32/controls/scrollbar.c b/reactos/dll/win32/user32/controls/scrollbar.c
index fcba0efef6b..671e638c932 100644
--- a/reactos/dll/win32/user32/controls/scrollbar.c
+++ b/reactos/dll/win32/user32/controls/scrollbar.c
@@ -69,8 +69,8 @@ static BOOL ScrollTrackVertical;
HBRUSH DefWndControlColor(HDC hDC, UINT ctlType);
-static LRESULT WINAPI ScrollBarWndProcW( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
-static LRESULT WINAPI ScrollBarWndProcA( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+//static LRESULT WINAPI ScrollBarWndProcW( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+//static LRESULT WINAPI ScrollBarWndProcA( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
UINT WINAPI SetSystemTimer(HWND,UINT_PTR,UINT,TIMERPROC);
BOOL WINAPI KillSystemTimer(HWND,UINT_PTR);
@@ -99,7 +99,6 @@ IntDrawScrollInterior(HWND hWnd, HDC hDC, INT nBar, BOOL Vertical,
INT ThumbSize = ScrollBarInfo->xyThumbBottom - ScrollBarInfo->xyThumbTop;
INT ThumbTop = ScrollBarInfo->xyThumbTop;
RECT Rect;
- HPEN hSavePen;
HBRUSH hSaveBrush, hBrush;
BOOL TopSelected = FALSE, BottomSelected = FALSE;
@@ -124,7 +123,6 @@ IntDrawScrollInterior(HWND hWnd, HDC hDC, INT nBar, BOOL Vertical,
hBrush = DefWndControlColor(hDC, CTLCOLOR_SCROLLBAR);
}
- hSavePen = SelectObject(hDC, GetSysColorPen(COLOR_WINDOWFRAME));
hSaveBrush = SelectObject(hDC, hBrush);
/* Calculate the scroll rectangle */
@@ -150,7 +148,6 @@ IntDrawScrollInterior(HWND hWnd, HDC hDC, INT nBar, BOOL Vertical,
Rect.bottom - Rect.top, PATCOPY);
/* Cleanup and return */
- SelectObject(hDC, hSavePen);
SelectObject(hDC, hSaveBrush);
return;
}
@@ -207,7 +204,6 @@ IntDrawScrollInterior(HWND hWnd, HDC hDC, INT nBar, BOOL Vertical,
DrawEdge(hDC, &Rect, EDGE_RAISED, BF_RECT | BF_MIDDLE);
/* Cleanup */
- SelectObject(hDC, hSavePen);
SelectObject(hDC, hSaveBrush);
}
@@ -1252,7 +1248,7 @@ ScrollTrackScrollBar(HWND Wnd, INT SBType, POINT Pt)
/***********************************************************************
* ScrollBarWndProc
*/
-static LRESULT WINAPI
+LRESULT WINAPI
ScrollBarWndProc(WNDPROC DefWindowProc, HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
if (! IsWindow(Wnd))
@@ -1461,13 +1457,13 @@ ScrollBarWndProc(WNDPROC DefWindowProc, HWND Wnd, UINT Msg, WPARAM wParam, LPARA
return 0;
}
-static LRESULT WINAPI
+LRESULT WINAPI
ScrollBarWndProcW(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
return ScrollBarWndProc(DefWindowProcW, Wnd, Msg, wParam, lParam);
}
-static LRESULT WINAPI
+LRESULT WINAPI
ScrollBarWndProcA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
return ScrollBarWndProc(DefWindowProcA, Wnd, Msg, wParam, lParam);
diff --git a/reactos/dll/win32/user32/controls/static.c b/reactos/dll/win32/user32/controls/static.c
index 75d19a0f61a..bd36a423627 100644
--- a/reactos/dll/win32/user32/controls/static.c
+++ b/reactos/dll/win32/user32/controls/static.c
@@ -55,8 +55,8 @@ static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style );
static void STATIC_PaintBitmapfn( HWND hwnd, HDC hdc, DWORD style );
//static void STATIC_PaintEnhMetafn( HWND hwnd, HDC hdc, DWORD style );
static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, DWORD style );
-static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
-static LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+//static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+//static LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
static COLORREF color_3dshadow, color_3ddkshadow, color_3dhighlight;
@@ -436,7 +436,7 @@ static BOOL hasTextStyle( DWORD style )
/***********************************************************************
* StaticWndProc_common
*/
-static LRESULT StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
+LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
LPARAM lParam, BOOL unicode )
{
LRESULT lResult = 0;
@@ -663,7 +663,7 @@ static LRESULT StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
/***********************************************************************
* StaticWndProcA
*/
-static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
+LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
if (!IsWindow( hWnd )) return 0;
return StaticWndProc_common(hWnd, uMsg, wParam, lParam, FALSE);
@@ -672,7 +672,7 @@ static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
/***********************************************************************
* StaticWndProcW
*/
-static LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
+LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
if (!IsWindow( hWnd )) return 0;
return StaticWndProc_common(hWnd, uMsg, wParam, lParam, TRUE);
diff --git a/reactos/dll/win32/user32/include/controls.h b/reactos/dll/win32/user32/include/controls.h
index e001d754812..71528c3a6dc 100644
--- a/reactos/dll/win32/user32/include/controls.h
+++ b/reactos/dll/win32/user32/include/controls.h
@@ -106,4 +106,28 @@ extern BOOL COMBO_FlipListbox( LPHEADCOMBO, BOOL, BOOL );
#define LB_ADDSTRING_UPPER 0x1AC
#define LB_ADDSTRING_LOWER 0x1AD
+#define DESKTOP_CLASS_ATOM MAKEINTATOMA(32769) /* Desktop */
+LRESULT WINAPI DesktopWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
+LRESULT WINAPI User32DefWindowProc(HWND,UINT,WPARAM,LPARAM,BOOL);
+BOOL WINAPI RegisterClientPFN(VOID);
+LRESULT WINAPI IconTitleWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
+LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+LRESULT WINAPI ButtonWndProc_common(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode);
+LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
+LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
+LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL unicode);
+LRESULT WINAPI EditWndProcA(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+LRESULT WINAPI EditWndProcW(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode);
+LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
+LRESULT WINAPI ListBoxWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
+LRESULT WINAPI ListBoxWndProc_common( HWND hwnd, UINT msg,WPARAM wParam, LPARAM lParam, BOOL unicode);
+LRESULT WINAPI MDIClientWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
+LRESULT WINAPI MDIClientWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
+LRESULT WINAPI MDIClientWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL unicode);
+LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode);
+
#endif /* _ROS_CONTROLS_H */
diff --git a/reactos/dll/win32/user32/include/dde_private.h b/reactos/dll/win32/user32/include/dde_private.h
index 5011b867266..beca7483ac5 100644
--- a/reactos/dll/win32/user32/include/dde_private.h
+++ b/reactos/dll/win32/user32/include/dde_private.h
@@ -157,7 +157,6 @@ typedef struct tagWDML_INSTANCE
BOOL monitor; /* have these two as full Booleans cos they'll be tested frequently */
BOOL clientOnly; /* bit wasteful of space but it will be faster */
BOOL unicode; /* Flag to indicate Win32 API used to initialise */
- BOOL win16; /* flag to indicate Win16 API used to initialize */
HSZNode* nodeList; /* for cleaning upon exit */
PFNCALLBACK callback;
DWORD CBFflags;
@@ -191,9 +190,6 @@ typedef enum {
extern HDDEDATA WDML_InvokeCallback(WDML_INSTANCE* pInst, UINT uType, UINT uFmt, HCONV hConv,
HSZ hsz1, HSZ hsz2, HDDEDATA hdata,
ULONG_PTR dwData1, ULONG_PTR dwData2);
-extern HDDEDATA WDML_InvokeCallback16(PFNCALLBACK pfn, UINT uType, UINT uFmt, HCONV hConv,
- HSZ hsz1, HSZ hsz2, HDDEDATA hdata,
- DWORD dwData1, DWORD dwData2);
extern WDML_SERVER* WDML_AddServer(WDML_INSTANCE* pInstance, HSZ hszService, HSZ hszTopic);
extern void WDML_RemoveServer(WDML_INSTANCE* pInstance, HSZ hszService, HSZ hszTopic);
extern WDML_SERVER* WDML_FindServer(WDML_INSTANCE* pInstance, HSZ hszService, HSZ hszTopic);
@@ -203,7 +199,7 @@ extern WDML_QUEUE_STATE WDML_ServerHandle(WDML_CONV* pConv, WDML_XACT* pXAct);
HDDEDATA WDML_ClientHandle(WDML_CONV *pConv, WDML_XACT *pXAct, DWORD dwTimeout, LPDWORD pdwResult) DECLSPEC_HIDDEN;
/* called both in DdeClientTransaction and server side. */
extern UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback,
- DWORD afCmd, DWORD ulRes, BOOL bUnicode, BOOL b16);
+ DWORD afCmd, DWORD ulRes, BOOL bUnicode);
extern WDML_CONV* WDML_AddConv(WDML_INSTANCE* pInstance, WDML_SIDE side,
HSZ hszService, HSZ hszTopic, HWND hwndClient, HWND hwndServer);
extern void WDML_RemoveConv(WDML_CONV* pConv, WDML_SIDE side);
diff --git a/reactos/dll/win32/user32/include/draw.h b/reactos/dll/win32/user32/include/draw.h
index 313577d3d97..07163f5f6a2 100644
--- a/reactos/dll/win32/user32/include/draw.h
+++ b/reactos/dll/win32/user32/include/draw.h
@@ -1,2 +1 @@
-HPEN WINAPI GetSysColorPen (int nIndex);
void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo);
diff --git a/reactos/dll/win32/user32/include/menu.h b/reactos/dll/win32/user32/include/menu.h
index 223c12655da..bc039184e09 100644
--- a/reactos/dll/win32/user32/include/menu.h
+++ b/reactos/dll/win32/user32/include/menu.h
@@ -19,4 +19,7 @@ MenuTrackMouseMenuBar(HWND hWnd, ULONG Ht, POINT Pt);
VOID
MenuTrackKbdMenuBar(HWND hWnd, UINT wParam, WCHAR wChar);
+LRESULT WINAPI PopupMenuWndProcA(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);
+LRESULT WINAPI PopupMenuWndProcW(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
+
#endif /* __LIB_USER32_INCLUDE_MENU_H */
diff --git a/reactos/dll/win32/user32/include/scroll.h b/reactos/dll/win32/user32/include/scroll.h
index 2f35a21e7ae..e543f518409 100644
--- a/reactos/dll/win32/user32/include/scroll.h
+++ b/reactos/dll/win32/user32/include/scroll.h
@@ -9,6 +9,8 @@
#ifndef USER32_SCROLL_H_INCLUDED
#define USER32_SCROLL_H_INCLUDED
-extern VOID FASTCALL ScrollTrackScrollBar(HWND Wnd, INT SBType, POINT Pt);
+LRESULT WINAPI ScrollBarWndProcW( HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam );
+LRESULT WINAPI ScrollBarWndProcA( HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam );
+VOID FASTCALL ScrollTrackScrollBar(HWND Wnd, INT SBType, POINT Pt);
#endif
diff --git a/reactos/dll/win32/user32/include/user32.h b/reactos/dll/win32/user32/include/user32.h
index d6fe02df476..ef50a0984c2 100644
--- a/reactos/dll/win32/user32/include/user32.h
+++ b/reactos/dll/win32/user32/include/user32.h
@@ -90,9 +90,9 @@ SharedPtrToKernel(PVOID Ptr)
}
static __inline BOOL
-IsThreadHooked(PW32THREADINFO ti)
+IsThreadHooked(PCLIENTINFO pci)
{
- return ti->fsHooks != 0;
+ return pci->fsHooks != 0;
}
static __inline PDESKTOPINFO
@@ -108,12 +108,12 @@ GetThreadDesktopInfo(VOID)
return di;
}
-PCALLPROC FASTCALL ValidateCallProc(HANDLE hCallProc);
-PWINDOW FASTCALL ValidateHwnd(HWND hwnd);
-PWINDOW FASTCALL ValidateHwndOrDesk(HWND hwnd);
-PWINDOW FASTCALL GetThreadDesktopWnd(VOID);
+PCALLPROCDATA FASTCALL ValidateCallProc(HANDLE hCallProc);
+PWND FASTCALL ValidateHwnd(HWND hwnd);
+PWND FASTCALL ValidateHwndOrDesk(HWND hwnd);
+PWND FASTCALL GetThreadDesktopWnd(VOID);
PVOID FASTCALL ValidateHandleNoErr(HANDLE handle, UINT uType);
-PWINDOW FASTCALL ValidateHwndNoErr(HWND hwnd);
+PWND FASTCALL ValidateHwndNoErr(HWND hwnd);
VOID FASTCALL GetConnected(VOID);
BOOL FASTCALL DefSetText(HWND hWnd, PCWSTR String, BOOL Ansi);
-BOOL FASTCALL TestWindowProcess(PWINDOW);
+BOOL FASTCALL TestWindowProcess(PWND);
diff --git a/reactos/dll/win32/user32/include/user32p.h b/reactos/dll/win32/user32/include/user32p.h
index d25f5b9ec17..8b51ea2c8f2 100644
--- a/reactos/dll/win32/user32/include/user32p.h
+++ b/reactos/dll/win32/user32/include/user32p.h
@@ -64,18 +64,12 @@
#define NtUserGetSysColorBrushes(HBrushes, count) \
(BOOL)NtUserCallTwoParam((DWORD_PTR)(HBrushes), (DWORD_PTR)(count), TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES)
-#define NtUserGetSysColorPens(HPens, count) \
- (BOOL)NtUserCallTwoParam((DWORD_PTR)(HPens), (DWORD_PTR)(count), TWOPARAM_ROUTINE_GETSYSCOLORPENS)
-
#define NtUserGetSysColors(ColorRefs, count) \
(BOOL)NtUserCallTwoParam((DWORD_PTR)(ColorRefs), (DWORD_PTR)(count), TWOPARAM_ROUTINE_GETSYSCOLORS)
#define NtUserSetCaretBlinkTime(uMSeconds) \
(BOOL)NtUserCallOneParam((DWORD_PTR)uMSeconds, ONEPARAM_ROUTINE_SETCARETBLINKTIME)
-#define NtUserRegisterUserModule(hInstance) \
- (BOOL)NtUserCallOneParam((DWORD_PTR)hInstance, ONEPARAM_ROUTINE_REGISTERUSERMODULE)
-
/*
#define NtUserEnumClipboardFormats(format) \
(UINT)NtUserCallOneParam(format, ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS)
@@ -229,7 +223,6 @@ extern PUSER_HANDLE_ENTRY gHandleEntries;
PUSER_HANDLE_ENTRY FASTCALL GetUser32Handle(HANDLE);
PVOID FASTCALL ValidateHandle(HANDLE, UINT);
-#define SYSCOLOR_GetPen(index) GetSysColorPen(index)
#define WIN_GetFullHandle(h) ((HWND)(h))
#ifndef __ms_va_list
diff --git a/reactos/dll/win32/user32/include/window.h b/reactos/dll/win32/user32/include/window.h
index 0ac6e2a1e57..2e88d9a9dd2 100644
--- a/reactos/dll/win32/user32/include/window.h
+++ b/reactos/dll/win32/user32/include/window.h
@@ -40,7 +40,7 @@ BOOL UserDrawSysMenuButton( HWND hWnd, HDC hDC, LPRECT, BOOL down );
void
UserGetFrameSize(ULONG Style, ULONG ExStyle, SIZE *Size);
void
-UserGetInsideRectNC(PWINDOW Wnd, RECT *rect);
+UserGetInsideRectNC(PWND Wnd, RECT *rect);
DWORD
SCROLL_HitTest( HWND hwnd, INT nBar, POINT pt, BOOL bDragging );
diff --git a/reactos/dll/win32/user32/lang/ro-RO.rc b/reactos/dll/win32/user32/lang/ro-RO.rc
index 4f69f65d17c..23b6ef7f666 100644
--- a/reactos/dll/win32/user32/lang/ro-RO.rc
+++ b/reactos/dll/win32/user32/lang/ro-RO.rc
@@ -5,15 +5,17 @@ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
// Dialogs
//
+#pragma code_page(65001)
+
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 "Alegere fereastr"
+CAPTION "Alegere fereastră"
BEGIN
LISTBOX 100, 5, 5, 210, 110, LBS_NOTIFY | LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL
PUSHBUTTON "&OK", 1, 60, 120, 40, 15, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP
- PUSHBUTTON "&Revocare", 2, 120, 120, 40, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+ PUSHBUTTON "&Anulare", 2, 120, 120, 40, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP
END
/////////////////////////////////////////////////////////////////////////////
@@ -30,9 +32,9 @@ BEGIN
MENUITEM "D&ecupare", WM_CUT
MENUITEM "&Copiere", WM_COPY
MENUITEM "&Lipire", WM_PASTE
- MENUITEM "&tergere", WM_CLEAR
+ MENUITEM "&Ștergere", WM_CLEAR
MENUITEM SEPARATOR
- MENUITEM "Selectare &total", EM_SETSEL
+ MENUITEM "Selectare &totală", EM_SETSEL
END
END
@@ -45,7 +47,7 @@ BEGIN
MENUITEM "Mi&nimizare", SC_MINIMIZE
MENUITEM "Ma&ximizare", SC_MAXIMIZE
MENUITEM SEPARATOR
- MENUITEM "&nchidere\tAlt-F4", SC_CLOSE
+ MENUITEM "&Închidere\tAlt-F4", SC_CLOSE
END
/////////////////////////////////////////////////////////////////////////////
@@ -59,12 +61,12 @@ BEGIN
IDS_OK, "OK"
IDS_CANCEL, "Anulare"
IDS_ABORT, "&Abandon"
- IDS_RETRY, "&Rencercare"
+ IDS_RETRY, "&Reîncercare"
IDS_IGNORE, "&Ignorare"
IDS_YES, "&Da"
IDS_NO, "&Nu"
IDS_HELP, "Ajutor"
- IDS_TRYAGAIN, "&Rencercare"
+ IDS_TRYAGAIN, "&Reîncercare"
IDS_CONTINUE, "&Continuare"
END
@@ -72,3 +74,5 @@ STRINGTABLE
BEGIN
IDS_MDI_MOREWINDOWS, "&Mai multe ferestre..."
END
+
+#pragma code_page(default)
diff --git a/reactos/dll/win32/user32/misc/dde.c b/reactos/dll/win32/user32/misc/dde.c
index 6ebe5fec7fe..ac7dd6066ca 100644
--- a/reactos/dll/win32/user32/misc/dde.c
+++ b/reactos/dll/win32/user32/misc/dde.c
@@ -329,7 +329,7 @@ static LRESULT CALLBACK WDML_EventProc(HWND hwndEvent, UINT uMsg, WPARAM wParam,
*
*/
UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback,
- DWORD afCmd, DWORD ulRes, BOOL bUnicode, BOOL b16)
+ DWORD afCmd, DWORD ulRes, BOOL bUnicode)
{
WDML_INSTANCE* pInstance;
WDML_INSTANCE* reference_inst;
@@ -365,7 +365,6 @@ UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback,
pInstance->threadID = GetCurrentThreadId();
pInstance->callback = *pfnCallback;
pInstance->unicode = bUnicode;
- pInstance->win16 = b16;
pInstance->nodeList = NULL; /* node will be added later */
pInstance->monitorFlags = afCmd & MF_MASK;
pInstance->wStatus = 0;
@@ -579,7 +578,7 @@ UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback,
UINT WINAPI DdeInitializeA(LPDWORD pidInst, PFNCALLBACK pfnCallback,
DWORD afCmd, DWORD ulRes)
{
- return WDML_Initialize(pidInst, pfnCallback, afCmd, ulRes, FALSE, FALSE);
+ return WDML_Initialize(pidInst, pfnCallback, afCmd, ulRes, FALSE);
}
/******************************************************************************
@@ -599,7 +598,7 @@ UINT WINAPI DdeInitializeA(LPDWORD pidInst, PFNCALLBACK pfnCallback,
UINT WINAPI DdeInitializeW(LPDWORD pidInst, PFNCALLBACK pfnCallback,
DWORD afCmd, DWORD ulRes)
{
- return WDML_Initialize(pidInst, pfnCallback, afCmd, ulRes, TRUE, FALSE);
+ return WDML_Initialize(pidInst, pfnCallback, afCmd, ulRes, TRUE);
}
/*****************************************************************
@@ -716,12 +715,10 @@ HDDEDATA WDML_InvokeCallback(WDML_INSTANCE* pInstance, UINT uType, UINT uFmt, H
if (pInstance == NULL)
return NULL;
- TRACE("invoking CB%d[%p] (%x %x %p %p %p %p %lx %lx)\n",
- pInstance->win16 ? 16 : 32, pInstance->callback, uType, uFmt,
+ TRACE("invoking CB[%p] (%x %x %p %p %p %p %lx %lx)\n",
+ pInstance->callback, uType, uFmt,
hConv, hsz1, hsz2, hdata, dwData1, dwData2);
-
ret = pInstance->callback(uType, uFmt, hConv, hsz1, hsz2, hdata, dwData1, dwData2);
-
TRACE("done => %p\n", ret);
return ret;
}
@@ -1629,7 +1626,7 @@ HGLOBAL WDML_DataHandle2Global(HDDEDATA hDdeData, BOOL fResponse, BOOL fRelease,
*/
WDML_SERVER* WDML_AddServer(WDML_INSTANCE* pInstance, HSZ hszService, HSZ hszTopic)
{
- static const WCHAR fmtW[] = {'%','s','(','0','x','%','0','8','l','x',')',0};
+ static const WCHAR fmtW[] = {'%','s','(','0','x','%','*','x',')',0};
WDML_SERVER* pServer;
WCHAR buf1[256];
WCHAR buf2[256];
diff --git a/reactos/dll/win32/user32/misc/desktop.c b/reactos/dll/win32/user32/misc/desktop.c
index c3eb8266530..1e27b3deed1 100644
--- a/reactos/dll/win32/user32/misc/desktop.c
+++ b/reactos/dll/win32/user32/misc/desktop.c
@@ -14,12 +14,10 @@
#include
WINE_DEFAULT_DEBUG_CHANNEL(user32);
-#define DESKTOP_CLASS_ATOM MAKEINTATOMA(32769) /* Desktop */
-static LRESULT WINAPI DesktopWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
-
/*********************************************************************
* desktop class descriptor
*/
+#if 0 // Kept for referencing.
const struct builtin_class_descr DESKTOP_builtin_class =
{
(LPCWSTR) DESKTOP_CLASS_ATOM, /* name */
@@ -30,13 +28,12 @@ const struct builtin_class_descr DESKTOP_builtin_class =
IDC_ARROW, /* cursor */
(HBRUSH)(COLOR_BACKGROUND+1) /* brush */
};
-
-static
+#endif
LRESULT
WINAPI
DesktopWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
- FIXME("Desktop Class Atom!\n");
+ TRACE("Desktop Class Atom! hWnd 0x%x, Msg %d\n", hwnd, message);
if (message == WM_NCCREATE) return TRUE;
return 0; /* all other messages are ignored */
}
@@ -102,7 +99,7 @@ GetSystemMetrics(int nIndex)
GetConnected();
// FIXME("Global Sever Data -> %x\n",g_psi);
if (nIndex < 0 || nIndex >= SM_CMETRICS) return 0;
- return g_psi->SystemMetrics[nIndex];
+ return g_psi->aiSysMet[nIndex];
}
@@ -124,15 +121,6 @@ SystemParametersInfoA(UINT uiAction,
{
switch (uiAction)
{
- case SPI_GETHIGHCONTRAST:
- case SPI_SETHIGHCONTRAST:
- case SPI_GETSOUNDSENTRY:
- case SPI_SETSOUNDSENTRY:
- {
- /* FIXME: Support this accessibility SPI actions */
- FIXME("FIXME: Unsupported SPI Code: %lx \n",uiAction );
- return FALSE;
- }
case SPI_GETNONCLIENTMETRICS:
{
@@ -248,88 +236,40 @@ SystemParametersInfoA(UINT uiAction,
}
case SPI_GETDESKWALLPAPER:
{
- HKEY hKey;
- BOOL Ret = FALSE;
+ BOOL Ret;
+ WCHAR awc[MAX_PATH];
+ UNICODE_STRING ustrWallpaper;
+ ANSI_STRING astrWallpaper;
-#if 0
- /* Get the desktop bitmap handle, this does NOT return the file name! */
- if(!NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, 0, &hbmWallpaper, 0))
- {
- /* Return an empty string, no wallpapaper is set */
- *(CHAR*)pvParam = '\0';
- return TRUE;
- }
-#endif
+ Ret = NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, awc, fWinIni);
+ RtlInitUnicodeString(&ustrWallpaper, awc);
+ RtlUnicodeStringToAnsiString(&astrWallpaper, &ustrWallpaper, TRUE);
- /* FIXME - Read the registry key for now, but what happens if the wallpaper was
- changed without SPIF_UPDATEINIFILE?! */
- if(RegOpenKeyExW(HKEY_CURRENT_USER,
- L"Control Panel\\Desktop",
- 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
- {
- DWORD Type, Size;
- Size = uiParam;
- if(RegQueryValueExA(hKey,
- "Wallpaper",
- NULL,
- &Type,
- (LPBYTE)pvParam,
- &Size) == ERROR_SUCCESS
- && Type == REG_SZ)
- {
- Ret = TRUE;
- }
- RegCloseKey(hKey);
- }
+ RtlCopyMemory(pvParam, astrWallpaper.Buffer, uiParam);
+ RtlFreeAnsiString(&astrWallpaper);
return Ret;
}
+
case SPI_SETDESKWALLPAPER:
{
- HBITMAP hNewWallpaper;
- BOOL Ret;
- LPSTR lpWallpaper = (LPSTR)pvParam;
+ NTSTATUS Status;
+ UNICODE_STRING ustrWallpaper;
+ BOOL Ret;
- if(lpWallpaper != NULL && *lpWallpaper != '\0')
- {
- hNewWallpaper = LoadImageA(0, lpWallpaper, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
- if(hNewWallpaper == NULL)
+ if (pvParam)
{
- return FALSE;
+ Status = RtlCreateUnicodeStringFromAsciiz(&ustrWallpaper, pvParam);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("Status = 0x%x\n", Status);
+ return FALSE;
+ }
+ pvParam = &ustrWallpaper;
}
- }
- else
- {
- hNewWallpaper = NULL;
- lpWallpaper = NULL;
- }
- /* Set the wallpaper bitmap */
- if(!NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &hNewWallpaper, fWinIni & SPIF_SENDCHANGE))
- {
- if(hNewWallpaper != NULL)
- DeleteObject(hNewWallpaper);
- return FALSE;
- }
- /* Do not use the bitmap handle anymore, it doesn't belong to our process anymore! */
-
- Ret = TRUE;
- if(fWinIni & SPIF_UPDATEINIFILE)
- {
- /* Save the path to the file in the registry */
- HKEY hKey;
- if(RegOpenKeyExW(HKEY_CURRENT_USER,
- L"Control Panel\\Desktop",
- 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS)
- {
- Ret = RegSetValueExA(hKey, "Wallpaper", 0, REG_SZ, (LPBYTE)(lpWallpaper != NULL ? lpWallpaper : ""),
- (lpWallpaper != NULL ? (lstrlenA(lpWallpaper) + 1) * sizeof(CHAR) : sizeof(CHAR)) == ERROR_SUCCESS);
- RegCloseKey(hKey);
- }
- }
-
- RedrawWindow(GetShellWindow(), NULL, NULL, RDW_INVALIDATE | RDW_ERASE);
-
- return Ret;
+ Ret = NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, uiParam, pvParam, fWinIni);
+ RtlFreeUnicodeString(&ustrWallpaper);
+ return Ret;
}
}
return NtUserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni);
@@ -347,97 +287,14 @@ SystemParametersInfoW(UINT uiAction,
{
switch(uiAction)
{
- case SPI_GETHIGHCONTRAST:
- case SPI_SETHIGHCONTRAST:
- case SPI_GETSOUNDSENTRY:
- case SPI_SETSOUNDSENTRY:
- {
- /* FIXME: Support this accessibility SPI actions */
- FIXME("FIXME: Unsupported SPI Code: %lx \n",uiAction );
- return FALSE;
- }
- case SPI_GETDESKWALLPAPER:
- {
- HKEY hKey;
- BOOL Ret = FALSE;
-#if 0
- /* Get the desktop bitmap handle, this does NOT return the file name! */
- if(!NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, 0, &hbmWallpaper, 0))
- {
- /* Return an empty string, no wallpapaper is set */
- *(WCHAR*)pvParam = L'\0';
- return TRUE;
- }
-#endif
-
- /* FIXME - Read the registry key for now, but what happens if the wallpaper was
- changed without SPIF_UPDATEINIFILE?! */
- if(RegOpenKeyExW(HKEY_CURRENT_USER,
- L"Control Panel\\Desktop",
- 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
- {
- DWORD Type, Size;
- Size = uiParam * sizeof(WCHAR);
- if(RegQueryValueExW(hKey,
- L"Wallpaper",
- NULL,
- &Type,
- (LPBYTE)pvParam,
- &Size) == ERROR_SUCCESS
- && Type == REG_SZ)
- {
- Ret = TRUE;
- }
- RegCloseKey(hKey);
- }
- return Ret;
- }
case SPI_SETDESKWALLPAPER:
- {
- HBITMAP hNewWallpaper;
- BOOL Ret;
- LPWSTR lpWallpaper = (LPWSTR)pvParam;
-
- if(lpWallpaper != NULL && *lpWallpaper != L'\0')
{
- hNewWallpaper = LoadImageW(0, lpWallpaper, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
+ UNICODE_STRING ustrWallpaper;
- if(hNewWallpaper == NULL)
- {
- return FALSE;
- }
+ RtlInitUnicodeString(&ustrWallpaper, pvParam);
+ return NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, uiParam, &ustrWallpaper, fWinIni);
}
- else
- {
- hNewWallpaper = NULL;
- lpWallpaper = NULL;
- }
-
- /* Set the wallpaper bitmap */
- if(!NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &hNewWallpaper, fWinIni & SPIF_SENDCHANGE))
- return FALSE;
- /* Do not use the bitmap handle anymore, it doesn't belong to our process anymore! */
- Ret = TRUE;
- if(fWinIni & SPIF_UPDATEINIFILE)
- {
- /* Save the path to the file in the registry */
- HKEY hKey;
-
- if(RegOpenKeyExW(HKEY_CURRENT_USER,
- L"Control Panel\\Desktop",
- 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS)
- {
- Ret = (RegSetValueExW(hKey, L"Wallpaper", 0, REG_SZ, (lpWallpaper != NULL ? (LPBYTE)lpWallpaper : (LPBYTE)L""),
- (lpWallpaper != NULL ? (lstrlenW(lpWallpaper) + 1) * sizeof(WCHAR) : sizeof(WCHAR))) == ERROR_SUCCESS);
- RegCloseKey(hKey);
- }
- }
-
- RedrawWindow(GetShellWindow(), NULL, NULL, RDW_INVALIDATE | RDW_ERASE);
-
- return Ret;
- }
}
return NtUserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni);
}
@@ -496,19 +353,35 @@ CreateDesktopW(LPCWSTR lpszDesktop,
ACCESS_MASK dwDesiredAccess,
LPSECURITY_ATTRIBUTES lpsa)
{
- UNICODE_STRING DesktopName;
+ OBJECT_ATTRIBUTES oas;
+ UNICODE_STRING DesktopName, DesktopDevice;
HWINSTA hWinSta;
HDESK hDesktop;
+ ULONG Attributes = (OBJ_OPENIF|OBJ_CASE_INSENSITIVE);
+ /* Retrive WinStation handle. */
hWinSta = NtUserGetProcessWindowStation();
+ /* Initialize the strings. */
RtlInitUnicodeString(&DesktopName, lpszDesktop);
+ RtlInitUnicodeString(&DesktopDevice, lpszDevice);
- hDesktop = NtUserCreateDesktop(&DesktopName,
- dwFlags,
- dwDesiredAccess,
- lpsa,
- hWinSta);
+ /* Check for process is inherited, set flag if set. */
+ if (lpsa && lpsa->bInheritHandle) Attributes |= OBJ_INHERIT;
+
+ /* Initialize the attributes for the desktop. */
+ InitializeObjectAttributes( &oas,
+ &DesktopName,
+ Attributes,
+ hWinSta,
+ lpsa ? lpsa->lpSecurityDescriptor : NULL);
+
+ /* Send the request and call to win32k. */
+ hDesktop = NtUserCreateDesktop( &oas,
+ &DesktopDevice,
+ pDevmode,
+ dwFlags,
+ dwDesiredAccess);
return(hDesktop);
}
diff --git a/reactos/dll/win32/user32/misc/dllmain.c b/reactos/dll/win32/user32/misc/dllmain.c
index 34ebf88a778..d03a3e7bdb2 100644
--- a/reactos/dll/win32/user32/misc/dllmain.c
+++ b/reactos/dll/win32/user32/misc/dllmain.c
@@ -230,6 +230,8 @@ Init(VOID)
(PVOID)User32CallHookProcFromKernel;
NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_EVENTPROC] =
(PVOID)User32CallEventProcFromKernel;
+ NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADMENU] =
+ (PVOID)User32CallLoadMenuFromKernel;
NtUserProcessConnect( NtCurrentProcess(),
&UserCon,
@@ -287,7 +289,7 @@ DllMain(
{
case DLL_PROCESS_ATTACH:
User32Instance = hInstanceDll;
- if (!NtUserRegisterUserModule(hInstanceDll) ||
+ if (!RegisterClientPFN() ||
!RegisterSystemControls())
{
return FALSE;
@@ -348,5 +350,6 @@ GetConnected(VOID)
g_ulSharedDelta = UserCon.siClient.ulSharedDelta;
g_psi = SharedPtrToUser(UserCon.siClient.psi);
gHandleTable = SharedPtrToUser(UserCon.siClient.aheList);
- gHandleEntries = SharedPtrToUser(gHandleTable->handles);
+ gHandleEntries = SharedPtrToUser(gHandleTable->handles);
+
}
diff --git a/reactos/dll/win32/user32/misc/misc.c b/reactos/dll/win32/user32/misc/misc.c
index cb0c2e897d4..20c65763ce8 100644
--- a/reactos/dll/win32/user32/misc/misc.c
+++ b/reactos/dll/win32/user32/misc/misc.c
@@ -268,12 +268,12 @@ IsGUIThread(
BOOL
FASTCALL
-TestWindowProcess(PWINDOW Wnd)
+TestWindowProcess(PWND Wnd)
{
- if (Wnd->ti == (PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo)
+ if (Wnd->head.pti == (PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo)
return TRUE;
else
- return (NtUserQueryWindow(Wnd->hdr.Handle, QUERY_WINDOW_UNIQUE_PROCESS_ID) ==
+ return (NtUserQueryWindow(Wnd->head.h, QUERY_WINDOW_UNIQUE_PROCESS_ID) ==
(DWORD)NtCurrentTeb()->ClientId.UniqueProcess );
}
@@ -426,25 +426,30 @@ ValidateHandleNoErr(HANDLE handle, UINT uType)
//
// Validate a callproc handle and return the pointer to the object.
//
-PCALLPROC
+PCALLPROCDATA
FASTCALL
ValidateCallProc(HANDLE hCallProc)
{
- PCALLPROC CallProc = ValidateHandle(hCallProc, VALIDATE_TYPE_CALLPROC);
- if (CallProc != NULL && CallProc->pi == g_ppi)
- return CallProc;
+ PUSER_HANDLE_ENTRY pEntry;
- return NULL;
+ PCALLPROCDATA CallProc = ValidateHandle(hCallProc, VALIDATE_TYPE_CALLPROC);
+
+ pEntry = GetUser32Handle(hCallProc);
+
+ if (CallProc != NULL && pEntry->ppi == g_ppi)
+ return CallProc;
+
+ return NULL;
}
//
// Validate a window handle and return the pointer to the object.
//
-PWINDOW
+PWND
FASTCALL
ValidateHwnd(HWND hwnd)
{
- PWINDOW Wnd;
+ PWND Wnd;
PCLIENTINFO ClientInfo = GetWin32ClientInfo();
ASSERT(ClientInfo != NULL);
@@ -479,11 +484,11 @@ ValidateHwnd(HWND hwnd)
//
// Validate a window handle and return the pointer to the object.
//
-PWINDOW
+PWND
FASTCALL
ValidateHwndNoErr(HWND hwnd)
{
- PWINDOW Wnd;
+ PWND Wnd;
PCLIENTINFO ClientInfo = GetWin32ClientInfo();
ASSERT(ClientInfo != NULL);
@@ -515,11 +520,11 @@ ValidateHwndNoErr(HWND hwnd)
return NULL;
}
-PWINDOW
+PWND
FASTCALL
GetThreadDesktopWnd(VOID)
{
- PWINDOW Wnd = GetThreadDesktopInfo()->Wnd;
+ PWND Wnd = GetThreadDesktopInfo()->Wnd;
if (Wnd != NULL)
Wnd = DesktopPtrToUser(Wnd);
return Wnd;
@@ -528,7 +533,7 @@ GetThreadDesktopWnd(VOID)
//
// Validate a window handle and return the pointer to the object.
//
-PWINDOW
+PWND
FASTCALL
ValidateHwndOrDesk(HWND hwnd)
{
diff --git a/reactos/dll/win32/user32/user32.pspec b/reactos/dll/win32/user32/user32.pspec
index b31f81c378a..2b6da356ed9 100644
--- a/reactos/dll/win32/user32/user32.pspec
+++ b/reactos/dll/win32/user32/user32.pspec
@@ -483,8 +483,8 @@
@ stdcall MapVirtualKeyW(long long)
@ stdcall MapWindowPoints(long long ptr long)
@ stdcall MenuItemFromPoint(long long double) ; Direct call NtUserMenuItemFromPoint
-@ stdcall MenuWindowProcA (long long long long)
-@ stdcall MenuWindowProcW (long long long long)
+@ stdcall MenuWindowProcA (long ptr long long long)
+@ stdcall MenuWindowProcW (long ptr long long long)
@ stdcall MessageBeep(long)
@ stdcall MessageBoxA(long str str long)
@ stdcall MessageBoxExA(long str str long long)
@@ -712,8 +712,8 @@
@ stdcall UnregisterHotKey(long long) NtUserUnregisterHotKey
@ stub UnregisterMessagePumpHook
@ stub UnregisterUserApiHook
-@ stdcall UpdateLayeredWindow(long long ptr ptr long ptr long ptr long) NtUserUpdateLayeredWindow
-@ stub UpdateLayeredWindowIndirect
+@ stdcall UpdateLayeredWindow(long long ptr ptr long ptr long ptr long)
+@ stdcall UpdateLayeredWindowIndirect(long ptr)
@ stdcall UpdatePerUserSystemParameters(long long)
@ stdcall UpdateWindow(long)
@ stdcall User32InitializeImmEntryTable(ptr)
@@ -740,6 +740,7 @@
@ stdcall WinHelpW(long wstr long long)
@ stdcall WindowFromDC(long)
@ stdcall WindowFromPoint(double)
+@ stdcall WindowFromPhysicalPoint(double) NtUserWindowFromPhysicalPoint
@ stdcall keybd_event(long long long long)
@ stdcall mouse_event(long long long long long)
@ varargs wsprintfA(str str)
diff --git a/reactos/dll/win32/user32/user32.rbuild b/reactos/dll/win32/user32/user32.rbuild
index 5f955a654b5..897c69a7a51 100644
--- a/reactos/dll/win32/user32/user32.rbuild
+++ b/reactos/dll/win32/user32/user32.rbuild
@@ -11,7 +11,7 @@
win32ksys
pseh
ntdll
-
+ -fms-extensions
\n");
-
- if (lpBuffersOut)
- {
- INTERNET_SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
lpwhr = (LPWININETHTTPREQW) WININET_GetObject( hRequest );
if (NULL == lpwhr || lpwhr->hdr.htype != WH_HHTTPREQ)
@@ -857,27 +837,58 @@ BOOL WINAPI HttpEndRequestW(HINTERNET hRequest,
INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
if (lpwhr)
WININET_Release( &lpwhr->hdr );
- return FALSE;
+ return FALSE;
}
+
lpwhr->hdr.dwFlags |= dwFlags;
+ lpwhr->hdr.dwContext = dwContext;
- if (lpwhr->lpHttpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC)
+ /* We appear to do nothing with lpBuffersOut.. is that correct? */
+
+ SendAsyncCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
+ INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0);
+
+ responseLen = HTTP_GetResponseHeaders(lpwhr, TRUE);
+ if (responseLen)
+ rc = TRUE;
+
+ SendAsyncCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
+ INTERNET_STATUS_RESPONSE_RECEIVED, &responseLen, sizeof(DWORD));
+
+ /* process cookies here. Is this right? */
+ HTTP_ProcessCookies(lpwhr);
+
+ dwBufferSize = sizeof(lpwhr->dwContentLength);
+ if (!HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_CONTENT_LENGTH,
+ &lpwhr->dwContentLength,&dwBufferSize,NULL))
+ lpwhr->dwContentLength = -1;
+
+ if (lpwhr->dwContentLength == 0)
+ HTTP_FinishedReading(lpwhr);
+
+ if(!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_AUTO_REDIRECT))
{
- WORKREQUEST work;
- struct WORKREQ_HTTPENDREQUESTW *request;
-
- work.asyncproc = AsyncHttpEndRequestProc;
- work.hdr = WININET_AddRef( &lpwhr->hdr );
-
- request = &work.u.HttpEndRequestW;
- request->dwFlags = dwFlags;
- request->dwContext = dwContext;
-
- INTERNET_AsyncCall(&work);
- INTERNET_SetLastError(ERROR_IO_PENDING);
+ DWORD dwCode,dwCodeLength=sizeof(DWORD);
+ if(HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_STATUS_CODE,&dwCode,&dwCodeLength,NULL) &&
+ (dwCode==302 || dwCode==301))
+ {
+ WCHAR szNewLocation[INTERNET_MAX_URL_LENGTH];
+ dwBufferSize=sizeof(szNewLocation);
+ if(HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_LOCATION,szNewLocation,&dwBufferSize,NULL))
+ {
+ /* redirects are always GETs */
+ HeapFree(GetProcessHeap(),0,lpwhr->lpszVerb);
+ lpwhr->lpszVerb = WININET_strdupW(szGET);
+ HTTP_DrainContent(lpwhr);
+ INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
+ INTERNET_STATUS_REDIRECT, szNewLocation,
+ dwBufferSize);
+ rc = HTTP_HandleRedirect(lpwhr, szNewLocation);
+ if (rc)
+ rc = HTTP_HttpSendRequestW(lpwhr, NULL, 0, NULL, 0, 0, TRUE);
+ }
+ }
}
- else
- rc = HTTP_HttpEndRequestW(lpwhr, dwFlags, dwContext);
WININET_Release( &lpwhr->hdr );
TRACE("%i <--\n",rc);
@@ -1006,20 +1017,12 @@ HINTERNET WINAPI HttpOpenRequestA(HINTERNET hHttpSession,
types = lpszAcceptTypes;
while (*types)
{
- __TRY
+ /* find out how many there are */
+ if (((ULONG_PTR)*types >> 16) && **types)
{
- /* find out how many there are */
- if (*types && **types)
- {
- TRACE("accept type: %s\n", debugstr_a(*types));
- acceptTypesCount++;
- }
+ TRACE("accept type: %s\n", debugstr_a(*types));
+ acceptTypesCount++;
}
- __EXCEPT_PAGE_FAULT
- {
- WARN("invalid accept type pointer\n");
- }
- __ENDTRY;
types++;
}
szAcceptTypes = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR *) * (acceptTypesCount+1));
@@ -1029,26 +1032,20 @@ HINTERNET WINAPI HttpOpenRequestA(HINTERNET hHttpSession,
types = lpszAcceptTypes;
while (*types)
{
- __TRY
+ if (((ULONG_PTR)*types >> 16) && **types)
{
- if (*types && **types)
- {
- len = MultiByteToWideChar(CP_ACP, 0, *types, -1, NULL, 0 );
- szAcceptTypes[acceptTypesCount] = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ len = MultiByteToWideChar(CP_ACP, 0, *types, -1, NULL, 0 );
+ szAcceptTypes[acceptTypesCount] = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (!szAcceptTypes[acceptTypesCount]) goto end;
- MultiByteToWideChar(CP_ACP, 0, *types, -1, szAcceptTypes[acceptTypesCount], len);
- acceptTypesCount++;
- }
+ MultiByteToWideChar(CP_ACP, 0, *types, -1, szAcceptTypes[acceptTypesCount], len);
+ acceptTypesCount++;
}
- __EXCEPT_PAGE_FAULT
- {
- /* ignore invalid pointer */
- }
- __ENDTRY;
types++;
}
szAcceptTypes[acceptTypesCount] = NULL;
}
+ else szAcceptTypes = 0;
rc = HttpOpenRequestW(hHttpSession, szVerb, szObjectName,
szVersion, szReferrer,
@@ -1380,32 +1377,6 @@ static void HTTPREQ_Destroy(WININETHANDLEHEADER *hdr)
WININET_Release(&lpwhr->lpHttpSession->hdr);
- if (lpwhr->pAuthInfo)
- {
- if (SecIsValidHandle(&lpwhr->pAuthInfo->ctx))
- DeleteSecurityContext(&lpwhr->pAuthInfo->ctx);
- if (SecIsValidHandle(&lpwhr->pAuthInfo->cred))
- FreeCredentialsHandle(&lpwhr->pAuthInfo->cred);
-
- HeapFree(GetProcessHeap(), 0, lpwhr->pAuthInfo->auth_data);
- HeapFree(GetProcessHeap(), 0, lpwhr->pAuthInfo->scheme);
- HeapFree(GetProcessHeap(), 0, lpwhr->pAuthInfo);
- lpwhr->pAuthInfo = NULL;
- }
-
- if (lpwhr->pProxyAuthInfo)
- {
- if (SecIsValidHandle(&lpwhr->pProxyAuthInfo->ctx))
- DeleteSecurityContext(&lpwhr->pProxyAuthInfo->ctx);
- if (SecIsValidHandle(&lpwhr->pProxyAuthInfo->cred))
- FreeCredentialsHandle(&lpwhr->pProxyAuthInfo->cred);
-
- HeapFree(GetProcessHeap(), 0, lpwhr->pProxyAuthInfo->auth_data);
- HeapFree(GetProcessHeap(), 0, lpwhr->pProxyAuthInfo->scheme);
- HeapFree(GetProcessHeap(), 0, lpwhr->pProxyAuthInfo);
- lpwhr->pProxyAuthInfo = NULL;
- }
-
HeapFree(GetProcessHeap(), 0, lpwhr->lpszPath);
HeapFree(GetProcessHeap(), 0, lpwhr->lpszVerb);
HeapFree(GetProcessHeap(), 0, lpwhr->lpszRawHeaders);
@@ -1431,6 +1402,31 @@ static void HTTPREQ_CloseConnection(WININETHANDLEHEADER *hdr)
if (!NETCON_connected(&lpwhr->netConnection))
return;
+ if (lpwhr->pAuthInfo)
+ {
+ if (SecIsValidHandle(&lpwhr->pAuthInfo->ctx))
+ DeleteSecurityContext(&lpwhr->pAuthInfo->ctx);
+ if (SecIsValidHandle(&lpwhr->pAuthInfo->cred))
+ FreeCredentialsHandle(&lpwhr->pAuthInfo->cred);
+
+ HeapFree(GetProcessHeap(), 0, lpwhr->pAuthInfo->auth_data);
+ HeapFree(GetProcessHeap(), 0, lpwhr->pAuthInfo->scheme);
+ HeapFree(GetProcessHeap(), 0, lpwhr->pAuthInfo);
+ lpwhr->pAuthInfo = NULL;
+ }
+ if (lpwhr->pProxyAuthInfo)
+ {
+ if (SecIsValidHandle(&lpwhr->pProxyAuthInfo->ctx))
+ DeleteSecurityContext(&lpwhr->pProxyAuthInfo->ctx);
+ if (SecIsValidHandle(&lpwhr->pProxyAuthInfo->cred))
+ FreeCredentialsHandle(&lpwhr->pProxyAuthInfo->cred);
+
+ HeapFree(GetProcessHeap(), 0, lpwhr->pProxyAuthInfo->auth_data);
+ HeapFree(GetProcessHeap(), 0, lpwhr->pProxyAuthInfo->scheme);
+ HeapFree(GetProcessHeap(), 0, lpwhr->pProxyAuthInfo);
+ lpwhr->pProxyAuthInfo = NULL;
+ }
+
INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
INTERNET_STATUS_CLOSING_CONNECTION, 0, 0);
@@ -1602,224 +1598,29 @@ static DWORD HTTPREQ_SetOption(WININETHANDLEHEADER *hdr, DWORD option, void *buf
return NETCON_set_timeout(&req->netConnection, option == INTERNET_OPTION_SEND_TIMEOUT,
*(DWORD*)buffer);
-
- case INTERNET_OPTION_USERNAME:
- HeapFree(GetProcessHeap(), 0, req->lpHttpSession->lpszUserName);
- if (!(req->lpHttpSession->lpszUserName = WININET_strdupW(buffer))) return ERROR_OUTOFMEMORY;
- return ERROR_SUCCESS;
-
- case INTERNET_OPTION_PASSWORD:
- HeapFree(GetProcessHeap(), 0, req->lpHttpSession->lpszPassword);
- if (!(req->lpHttpSession->lpszPassword = WININET_strdupW(buffer))) return ERROR_OUTOFMEMORY;
- return ERROR_SUCCESS;
}
return ERROR_INTERNET_INVALID_OPTION;
}
-/* read some more data into the read buffer */
-static BOOL read_more_data( WININETHTTPREQW *req, int maxlen )
+static DWORD HTTP_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync)
{
- int len;
+ int bytes_read;
- if (req->read_size && req->read_pos)
- {
- /* move existing data to the start of the buffer */
- memmove( req->read_buf, req->read_buf + req->read_pos, req->read_size );
- req->read_pos = 0;
- }
+ if(!NETCON_recv(&req->netConnection, buffer, min(size, req->dwContentLength - req->dwContentRead),
+ sync ? MSG_WAITALL : 0, &bytes_read)) {
+ if(req->dwContentLength != -1 && req->dwContentRead != req->dwContentLength)
+ ERR("not all data received %d/%d\n", req->dwContentRead, req->dwContentLength);
- if (maxlen == -1) maxlen = sizeof(req->read_buf);
- if (!NETCON_recv( &req->netConnection, req->read_buf + req->read_size,
- maxlen - req->read_size, 0, &len )) return FALSE;
- req->read_size += len;
- return TRUE;
-}
-
-/* remove some amount of data from the read buffer */
-static void remove_data( WININETHTTPREQW *req, int count )
-{
- if (!(req->read_size -= count)) req->read_pos = 0;
- else req->read_pos += count;
-}
-
-static BOOL read_line( WININETHTTPREQW *req, LPSTR buffer, DWORD *len )
-{
- int count, bytes_read, pos = 0;
-
- for (;;)
- {
- char *eol = memchr( req->read_buf + req->read_pos, '\n', req->read_size );
-
- if (eol)
- {
- count = eol - (req->read_buf + req->read_pos);
- bytes_read = count + 1;
- }
- else count = bytes_read = req->read_size;
-
- count = min( count, *len - pos );
- memcpy( buffer + pos, req->read_buf + req->read_pos, count );
- pos += count;
- remove_data( req, bytes_read );
- if (eol) break;
-
- if (!read_more_data( req, -1 )) return FALSE;
- if (!req->read_size)
- {
- *len = 0;
- TRACE( "returning empty string\n" );
- return FALSE;
- }
- }
-
- if (pos < *len)
- {
- if (pos && buffer[pos - 1] == '\r') pos--;
- *len = pos + 1;
- }
- buffer[*len - 1] = 0;
- TRACE( "returning %s\n", debugstr_a(buffer));
- return TRUE;
-}
-
-/* discard data contents until we reach end of line */
-static BOOL discard_eol( WININETHTTPREQW *req )
-{
- do
- {
- char *eol = memchr( req->read_buf + req->read_pos, '\n', req->read_size );
- if (eol)
- {
- remove_data( req, (eol + 1) - (req->read_buf + req->read_pos) );
- break;
- }
- req->read_pos = req->read_size = 0; /* discard everything */
- if (!read_more_data( req, -1 )) return FALSE;
- } while (req->read_size);
- return TRUE;
-}
-
-/* read the size of the next chunk */
-static BOOL start_next_chunk( WININETHTTPREQW *req )
-{
- DWORD chunk_size = 0;
-
- if (!req->dwContentLength) return TRUE;
- if (req->dwContentLength == req->dwContentRead)
- {
- /* read terminator for the previous chunk */
- if (!discard_eol( req )) return FALSE;
- req->dwContentLength = ~0u;
- req->dwContentRead = 0;
- }
- for (;;)
- {
- while (req->read_size)
- {
- char ch = req->read_buf[req->read_pos];
- if (ch >= '0' && ch <= '9') chunk_size = chunk_size * 16 + ch - '0';
- else if (ch >= 'a' && ch <= 'f') chunk_size = chunk_size * 16 + ch - 'a' + 10;
- else if (ch >= 'A' && ch <= 'F') chunk_size = chunk_size * 16 + ch - 'A' + 10;
- else if (ch == ';' || ch == '\r' || ch == '\n')
- {
- TRACE( "reading %u byte chunk\n", chunk_size );
- req->dwContentLength = chunk_size;
- req->dwContentRead = 0;
- if (!discard_eol( req )) return FALSE;
- return TRUE;
- }
- remove_data( req, 1 );
- }
- if (!read_more_data( req, -1 )) return FALSE;
- if (!req->read_size)
- {
- req->dwContentLength = req->dwContentRead = 0;
- return TRUE;
- }
- }
-}
-
-/* return the size of data available to be read immediately */
-static DWORD get_avail_data( WININETHTTPREQW *req )
-{
- if (req->read_chunked && (req->dwContentLength == ~0u || req->dwContentLength == req->dwContentRead))
- return 0;
- return min( req->read_size, req->dwContentLength - req->dwContentRead );
-}
-
-/* check if we have reached the end of the data to read */
-static BOOL end_of_read_data( WININETHTTPREQW *req )
-{
- if (req->read_chunked) return (req->dwContentLength == 0);
- if (req->dwContentLength == ~0u) return FALSE;
- return (req->dwContentLength == req->dwContentRead);
-}
-
-static BOOL refill_buffer( WININETHTTPREQW *req )
-{
- int len = sizeof(req->read_buf);
-
- if (req->read_chunked && (req->dwContentLength == ~0u || req->dwContentLength == req->dwContentRead))
- {
- if (!start_next_chunk( req )) return FALSE;
- }
-
- if (req->dwContentLength != ~0u) len = min( len, req->dwContentLength - req->dwContentRead );
- if (len <= req->read_size) return TRUE;
-
- if (!read_more_data( req, len )) return FALSE;
- if (!req->read_size) req->dwContentLength = req->dwContentRead = 0;
- return TRUE;
-}
-
-static void HTTP_ReceiveRequestData(WININETHTTPREQW *req, BOOL first_notif)
-{
- INTERNET_ASYNC_RESULT iar;
-
- TRACE("%p\n", req);
-
- if (refill_buffer( req )) {
- iar.dwResult = (DWORD_PTR)req->hdr.hInternet;
- iar.dwError = first_notif ? 0 : get_avail_data(req);
- }else {
- iar.dwResult = 0;
- iar.dwError = INTERNET_GetLastError();
- }
-
- INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_REQUEST_COMPLETE, &iar,
- sizeof(INTERNET_ASYNC_RESULT));
-}
-
-static DWORD HTTPREQ_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync)
-{
- int len, bytes_read = 0;
-
- if (req->read_chunked && (req->dwContentLength == ~0u || req->dwContentLength == req->dwContentRead))
- {
- if (!start_next_chunk( req )) goto done;
- }
- if (req->dwContentLength != ~0u) size = min( size, req->dwContentLength - req->dwContentRead );
-
- if (req->read_size)
- {
- bytes_read = min( req->read_size, size );
- memcpy( buffer, req->read_buf + req->read_pos, bytes_read );
- remove_data( req, bytes_read );
- }
-
- if (size > bytes_read && (!bytes_read || sync))
- {
- if (NETCON_recv( &req->netConnection, (char *)buffer + bytes_read, size - bytes_read,
- sync ? MSG_WAITALL : 0, &len))
- bytes_read += len;
/* always return success, even if the network layer returns an error */
+ *read = 0;
+ HTTP_FinishedReading(req);
+ return ERROR_SUCCESS;
}
-done:
+
req->dwContentRead += bytes_read;
*read = bytes_read;
- TRACE( "retrieved %u bytes (%u/%u)\n", bytes_read, req->dwContentRead, req->dwContentLength );
if(req->lpszCacheFile) {
BOOL res;
DWORD dwBytesWritten;
@@ -1835,6 +1636,102 @@ done:
return ERROR_SUCCESS;
}
+static DWORD get_chunk_size(const char *buffer)
+{
+ const char *p;
+ DWORD size = 0;
+
+ for (p = buffer; *p; p++)
+ {
+ if (*p >= '0' && *p <= '9') size = size * 16 + *p - '0';
+ else if (*p >= 'a' && *p <= 'f') size = size * 16 + *p - 'a' + 10;
+ else if (*p >= 'A' && *p <= 'F') size = size * 16 + *p - 'A' + 10;
+ else if (*p == ';') break;
+ }
+ return size;
+}
+
+static DWORD HTTP_ReadChunked(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync)
+{
+ char reply[MAX_REPLY_LEN], *p = buffer;
+ DWORD buflen, to_read, to_write = size;
+ int bytes_read;
+
+ *read = 0;
+ for (;;)
+ {
+ if (*read == size) break;
+
+ if (req->dwContentLength == ~0UL) /* new chunk */
+ {
+ buflen = sizeof(reply);
+ if (!NETCON_getNextLine(&req->netConnection, reply, &buflen)) break;
+
+ if (!(req->dwContentLength = get_chunk_size(reply)))
+ {
+ /* zero sized chunk marks end of transfer; read any trailing headers and return */
+ HTTP_GetResponseHeaders(req, FALSE);
+ break;
+ }
+ }
+ to_read = min(to_write, req->dwContentLength - req->dwContentRead);
+
+ if (!NETCON_recv(&req->netConnection, p, to_read, sync ? MSG_WAITALL : 0, &bytes_read))
+ {
+ if (bytes_read != to_read)
+ ERR("Not all data received %d/%d\n", bytes_read, to_read);
+
+ /* always return success, even if the network layer returns an error */
+ *read = 0;
+ break;
+ }
+ if (!bytes_read) break;
+
+ req->dwContentRead += bytes_read;
+ to_write -= bytes_read;
+ *read += bytes_read;
+
+ if (req->lpszCacheFile)
+ {
+ DWORD dwBytesWritten;
+
+ if (!WriteFile(req->hCacheFile, p, bytes_read, &dwBytesWritten, NULL))
+ WARN("WriteFile failed: %u\n", GetLastError());
+ }
+ p += bytes_read;
+
+ if (req->dwContentRead == req->dwContentLength) /* chunk complete */
+ {
+ req->dwContentRead = 0;
+ req->dwContentLength = ~0UL;
+
+ buflen = sizeof(reply);
+ if (!NETCON_getNextLine(&req->netConnection, reply, &buflen))
+ {
+ ERR("Malformed chunk\n");
+ *read = 0;
+ break;
+ }
+ }
+ }
+ if (!*read) HTTP_FinishedReading(req);
+ return ERROR_SUCCESS;
+}
+
+static DWORD HTTPREQ_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync)
+{
+ WCHAR encoding[20];
+ DWORD buflen = sizeof(encoding);
+ static const WCHAR szChunked[] = {'c','h','u','n','k','e','d',0};
+
+ if (HTTP_HttpQueryInfoW(req, HTTP_QUERY_TRANSFER_ENCODING, encoding, &buflen, NULL) &&
+ !strcmpiW(encoding, szChunked))
+ {
+ return HTTP_ReadChunked(req, buffer, size, read, sync);
+ }
+ else
+ return HTTP_Read(req, buffer, size, read, sync);
+}
static DWORD HTTPREQ_ReadFile(WININETHANDLEHEADER *hdr, void *buffer, DWORD size, DWORD *read)
{
@@ -1842,7 +1739,7 @@ static DWORD HTTPREQ_ReadFile(WININETHANDLEHEADER *hdr, void *buffer, DWORD size
return HTTPREQ_Read(req, buffer, size, read, TRUE);
}
-static void HTTPREQ_AsyncReadFileExAProc(WORKREQUEST *workRequest)
+static void HTTPREQ_AsyncReadFileExProc(WORKREQUEST *workRequest)
{
struct WORKREQ_INTERNETREADFILEEXA const *data = &workRequest->u.InternetReadFileExA;
WININETHTTPREQW *req = (WININETHTTPREQW*)workRequest->hdr;
@@ -1877,77 +1774,22 @@ static DWORD HTTPREQ_ReadFileExA(WININETHANDLEHEADER *hdr, INTERNET_BUFFERSA *bu
INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0);
- if ((hdr->dwFlags & INTERNET_FLAG_ASYNC) && !get_avail_data(req))
- {
- WORKREQUEST workRequest;
+ if (hdr->dwFlags & INTERNET_FLAG_ASYNC) {
+ DWORD available = 0;
- workRequest.asyncproc = HTTPREQ_AsyncReadFileExAProc;
- workRequest.hdr = WININET_AddRef(&req->hdr);
- workRequest.u.InternetReadFileExA.lpBuffersOut = buffers;
+ NETCON_query_data_available(&req->netConnection, &available);
+ if (!available)
+ {
+ WORKREQUEST workRequest;
- INTERNET_AsyncCall(&workRequest);
+ workRequest.asyncproc = HTTPREQ_AsyncReadFileExProc;
+ workRequest.hdr = WININET_AddRef(&req->hdr);
+ workRequest.u.InternetReadFileExA.lpBuffersOut = buffers;
- return ERROR_IO_PENDING;
- }
+ INTERNET_AsyncCall(&workRequest);
- res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength,
- !(flags & IRF_NO_WAIT));
-
- if (res == ERROR_SUCCESS) {
- DWORD size = buffers->dwBufferLength;
- INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED,
- &size, sizeof(size));
- }
-
- return res;
-}
-
-static void HTTPREQ_AsyncReadFileExWProc(WORKREQUEST *workRequest)
-{
- struct WORKREQ_INTERNETREADFILEEXW const *data = &workRequest->u.InternetReadFileExW;
- WININETHTTPREQW *req = (WININETHTTPREQW*)workRequest->hdr;
- INTERNET_ASYNC_RESULT iar;
- DWORD res;
-
- TRACE("INTERNETREADFILEEXW %p\n", workRequest->hdr);
-
- res = HTTPREQ_Read(req, data->lpBuffersOut->lpvBuffer,
- data->lpBuffersOut->dwBufferLength, &data->lpBuffersOut->dwBufferLength, TRUE);
-
- iar.dwResult = res == ERROR_SUCCESS;
- iar.dwError = res;
-
- INTERNET_SendCallback(&req->hdr, req->hdr.dwContext,
- INTERNET_STATUS_REQUEST_COMPLETE, &iar,
- sizeof(INTERNET_ASYNC_RESULT));
-}
-
-static DWORD HTTPREQ_ReadFileExW(WININETHANDLEHEADER *hdr, INTERNET_BUFFERSW *buffers,
- DWORD flags, DWORD_PTR context)
-{
-
- WININETHTTPREQW *req = (WININETHTTPREQW*)hdr;
- DWORD res;
-
- if (flags & ~(IRF_ASYNC|IRF_NO_WAIT))
- FIXME("these dwFlags aren't implemented: 0x%x\n", flags & ~(IRF_ASYNC|IRF_NO_WAIT));
-
- if (buffers->dwStructSize != sizeof(*buffers))
- return ERROR_INVALID_PARAMETER;
-
- INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0);
-
- if ((hdr->dwFlags & INTERNET_FLAG_ASYNC) && !get_avail_data(req))
- {
- WORKREQUEST workRequest;
-
- workRequest.asyncproc = HTTPREQ_AsyncReadFileExWProc;
- workRequest.hdr = WININET_AddRef(&req->hdr);
- workRequest.u.InternetReadFileExW.lpBuffersOut = buffers;
-
- INTERNET_AsyncCall(&workRequest);
-
- return ERROR_IO_PENDING;
+ return ERROR_IO_PENDING;
+ }
}
res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength,
@@ -1964,62 +1806,58 @@ static DWORD HTTPREQ_ReadFileExW(WININETHANDLEHEADER *hdr, INTERNET_BUFFERSW *bu
static BOOL HTTPREQ_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWORD size, DWORD *written)
{
- BOOL ret;
LPWININETHTTPREQW lpwhr = (LPWININETHTTPREQW)hdr;
- INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_SENDING_REQUEST, NULL, 0);
-
- *written = 0;
- if ((ret = NETCON_send(&lpwhr->netConnection, buffer, size, 0, (LPINT)written)))
- lpwhr->dwBytesWritten += *written;
-
- INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_REQUEST_SENT, written, sizeof(DWORD));
- return ret;
+ return NETCON_send(&lpwhr->netConnection, buffer, size, 0, (LPINT)written);
}
static void HTTPREQ_AsyncQueryDataAvailableProc(WORKREQUEST *workRequest)
{
WININETHTTPREQW *req = (WININETHTTPREQW*)workRequest->hdr;
+ INTERNET_ASYNC_RESULT iar;
+ char buffer[4048];
- HTTP_ReceiveRequestData(req, FALSE);
+ TRACE("%p\n", workRequest->hdr);
+
+ iar.dwResult = NETCON_recv(&req->netConnection, buffer,
+ min(sizeof(buffer), req->dwContentLength - req->dwContentRead),
+ MSG_PEEK, (int *)&iar.dwError);
+
+ INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_REQUEST_COMPLETE, &iar,
+ sizeof(INTERNET_ASYNC_RESULT));
}
static DWORD HTTPREQ_QueryDataAvailable(WININETHANDLEHEADER *hdr, DWORD *available, DWORD flags, DWORD_PTR ctx)
{
WININETHTTPREQW *req = (WININETHTTPREQW*)hdr;
+ BYTE buffer[4048];
+ BOOL async;
TRACE("(%p %p %x %lx)\n", req, available, flags, ctx);
- if (!(*available = get_avail_data( req )))
+ if(!NETCON_query_data_available(&req->netConnection, available) || *available)
+ return ERROR_SUCCESS;
+
+ /* Even if we are in async mode, we need to determine whether
+ * there is actually more data available. We do this by trying
+ * to peek only a single byte in async mode. */
+ async = (req->lpHttpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC) != 0;
+
+ if (NETCON_recv(&req->netConnection, buffer,
+ min(async ? 1 : sizeof(buffer), req->dwContentLength - req->dwContentRead),
+ MSG_PEEK, (int *)available) && async && *available)
{
- if (end_of_read_data( req )) return ERROR_SUCCESS;
+ WORKREQUEST workRequest;
- if (req->lpHttpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC)
- {
- WORKREQUEST workRequest;
+ *available = 0;
+ workRequest.asyncproc = HTTPREQ_AsyncQueryDataAvailableProc;
+ workRequest.hdr = WININET_AddRef( &req->hdr );
- workRequest.asyncproc = HTTPREQ_AsyncQueryDataAvailableProc;
- workRequest.hdr = WININET_AddRef( &req->hdr );
+ INTERNET_AsyncCall(&workRequest);
- INTERNET_AsyncCall(&workRequest);
-
- return ERROR_IO_PENDING;
- }
- else
- {
- refill_buffer( req );
- *available = get_avail_data( req );
- }
+ return ERROR_IO_PENDING;
}
- if (*available == sizeof(req->read_buf)) /* check if we have even more pending in the socket */
- {
- DWORD extra;
- if (NETCON_query_data_available(&req->netConnection, &extra))
- *available = min( *available + extra, req->dwContentLength - req->dwContentRead );
- }
-
- TRACE( "returning %u\n", *available );
return ERROR_SUCCESS;
}
@@ -2030,7 +1868,6 @@ static const HANDLEHEADERVtbl HTTPREQVtbl = {
HTTPREQ_SetOption,
HTTPREQ_ReadFile,
HTTPREQ_ReadFileExA,
- HTTPREQ_ReadFileExW,
HTTPREQ_WriteFile,
HTTPREQ_QueryDataAvailable,
NULL
@@ -2076,7 +1913,6 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs,
lpwhr->hdr.refs = 1;
lpwhr->hdr.lpfnStatusCB = lpwhs->hdr.lpfnStatusCB;
lpwhr->hdr.dwInternalFlags = lpwhs->hdr.dwInternalFlags & INET_CALLBACKW;
- lpwhr->dwContentLength = ~0u;
WININET_AddRef( &lpwhs->hdr );
lpwhr->lpHttpSession = lpwhs;
@@ -2114,7 +1950,7 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs,
lpwhr->lpszPath = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
rc = UrlEscapeW(lpszObjectName, lpwhr->lpszPath, &len,
URL_ESCAPE_SPACES_ONLY);
- if (rc != S_OK)
+ if (rc)
{
ERR("Unable to escape string!(%s) (%d)\n",debugstr_w(lpszObjectName),rc);
strcpyW(lpwhr->lpszPath,lpszObjectName);
@@ -2191,15 +2027,12 @@ static void HTTP_DrainContent(WININETHTTPREQW *req)
if (!NETCON_connected(&req->netConnection)) return;
if (req->dwContentLength == -1)
- {
NETCON_close(&req->netConnection);
- return;
- }
do
{
char buffer[2048];
- if (HTTPREQ_Read(req, buffer, sizeof(buffer), &bytes_read, TRUE) != ERROR_SUCCESS)
+ if (HTTP_Read(req, buffer, sizeof(buffer), &bytes_read, TRUE) != ERROR_SUCCESS)
return;
} while (bytes_read);
}
@@ -2336,28 +2169,27 @@ static const LPCWSTR header_lookup[] = {
/***********************************************************************
* HTTP_HttpQueryInfoW (internal)
*/
-static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel,
+static BOOL WINAPI HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel,
LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex)
{
LPHTTPHEADERW lphttpHdr = NULL;
BOOL bSuccess = FALSE;
BOOL request_only = dwInfoLevel & HTTP_QUERY_FLAG_REQUEST_HEADERS;
INT requested_index = lpdwIndex ? *lpdwIndex : 0;
- DWORD level = (dwInfoLevel & ~HTTP_QUERY_MODIFIER_FLAGS_MASK);
+ INT level = (dwInfoLevel & ~HTTP_QUERY_MODIFIER_FLAGS_MASK);
INT index = -1;
/* Find requested header structure */
switch (level)
{
case HTTP_QUERY_CUSTOM:
- if (!lpBuffer) return FALSE;
index = HTTP_GetCustomHeaderIndex(lpwhr, lpBuffer, requested_index, request_only);
break;
case HTTP_QUERY_RAW_HEADERS_CRLF:
{
LPWSTR headers;
- DWORD len = 0;
+ DWORD len;
BOOL ret = FALSE;
if (request_only)
@@ -2365,24 +2197,15 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel,
else
headers = lpwhr->lpszRawHeaders;
- if (headers)
- len = strlenW(headers) * sizeof(WCHAR);
-
- if (len + sizeof(WCHAR) > *lpdwBufferLength)
+ len = (strlenW(headers) + 1) * sizeof(WCHAR);
+ if (len > *lpdwBufferLength)
{
- len += sizeof(WCHAR);
INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
ret = FALSE;
}
else if (lpBuffer)
{
- if (headers)
- memcpy(lpBuffer, headers, len + sizeof(WCHAR));
- else
- {
- len = strlenW(szCrLf) * sizeof(WCHAR);
- memcpy(lpBuffer, szCrLf, sizeof(szCrLf));
- }
+ memcpy(lpBuffer, headers, len);
TRACE("returning data: %s\n", debugstr_wn(lpBuffer, len / sizeof(WCHAR)));
ret = TRUE;
}
@@ -2394,9 +2217,10 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel,
}
case HTTP_QUERY_RAW_HEADERS:
{
+ static const WCHAR szCrLf[] = {'\r','\n',0};
LPWSTR * ppszRawHeaderLines = HTTP_Tokenize(lpwhr->lpszRawHeaders, szCrLf);
DWORD i, size = 0;
- LPWSTR pszString = lpBuffer;
+ LPWSTR pszString = (WCHAR*)lpBuffer;
for (i = 0; ppszRawHeaderLines[i]; i++)
size += strlenW(ppszRawHeaderLines[i]) + 1;
@@ -2408,17 +2232,17 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel,
INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
- if (pszString)
+
+ for (i = 0; ppszRawHeaderLines[i]; i++)
{
- for (i = 0; ppszRawHeaderLines[i]; i++)
- {
- DWORD len = strlenW(ppszRawHeaderLines[i]);
- memcpy(pszString, ppszRawHeaderLines[i], (len+1)*sizeof(WCHAR));
- pszString += len+1;
- }
- *pszString = '\0';
- TRACE("returning data: %s\n", debugstr_wn(lpBuffer, size));
+ DWORD len = strlenW(ppszRawHeaderLines[i]);
+ memcpy(pszString, ppszRawHeaderLines[i], (len+1)*sizeof(WCHAR));
+ pszString += len+1;
}
+ *pszString = '\0';
+
+ TRACE("returning data: %s\n", debugstr_wn((WCHAR*)lpBuffer, size));
+
*lpdwBufferLength = size * sizeof(WCHAR);
HTTP_FreeTokens(ppszRawHeaderLines);
@@ -2434,12 +2258,11 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel,
INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
- if (lpBuffer)
- {
- memcpy(lpBuffer, lpwhr->lpszStatusText, (len + 1) * sizeof(WCHAR));
- TRACE("returning data: %s\n", debugstr_wn(lpBuffer, len));
- }
+ memcpy(lpBuffer, lpwhr->lpszStatusText, (len+1)*sizeof(WCHAR));
*lpdwBufferLength = len * sizeof(WCHAR);
+
+ TRACE("returning data: %s\n", debugstr_wn((WCHAR*)lpBuffer, len));
+
return TRUE;
}
break;
@@ -2453,19 +2276,18 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel,
INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
- if (lpBuffer)
- {
- memcpy(lpBuffer, lpwhr->lpszVersion, (len + 1) * sizeof(WCHAR));
- TRACE("returning data: %s\n", debugstr_wn(lpBuffer, len));
- }
+ memcpy(lpBuffer, lpwhr->lpszVersion, (len+1)*sizeof(WCHAR));
*lpdwBufferLength = len * sizeof(WCHAR);
+
+ TRACE("returning data: %s\n", debugstr_wn((WCHAR*)lpBuffer, len));
+
return TRUE;
}
break;
default:
assert (LAST_TABLE_HEADER == (HTTP_QUERY_UNLESS_MODIFIED_SINCE + 1));
- if (level < LAST_TABLE_HEADER && header_lookup[level])
+ if (level >= 0 && level < LAST_TABLE_HEADER && header_lookup[level])
index = HTTP_GetCustomHeaderIndex(lpwhr, header_lookup[level],
requested_index,request_only);
}
@@ -2482,16 +2304,18 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel,
return bSuccess;
}
- if (lpdwIndex && level != HTTP_QUERY_STATUS_CODE) (*lpdwIndex)++;
+ if (lpdwIndex)
+ (*lpdwIndex)++;
/* coalesce value to requested type */
- if (dwInfoLevel & HTTP_QUERY_FLAG_NUMBER && lpBuffer)
+ if (dwInfoLevel & HTTP_QUERY_FLAG_NUMBER)
{
- *(int *)lpBuffer = atoiW(lphttpHdr->lpszValue);
- TRACE(" returning number: %d\n", *(int *)lpBuffer);
- bSuccess = TRUE;
+ *(int *)lpBuffer = atoiW(lphttpHdr->lpszValue);
+ bSuccess = TRUE;
+
+ TRACE(" returning number : %d\n", *(int *)lpBuffer);
}
- else if (dwInfoLevel & HTTP_QUERY_FLAG_SYSTEMTIME && lpBuffer)
+ else if (dwInfoLevel & HTTP_QUERY_FLAG_SYSTEMTIME)
{
time_t tmpTime;
struct tm tmpTM;
@@ -2500,20 +2324,24 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel,
tmpTime = ConvertTimeString(lphttpHdr->lpszValue);
tmpTM = *gmtime(&tmpTime);
- STHook = (SYSTEMTIME *)lpBuffer;
- STHook->wDay = tmpTM.tm_mday;
- STHook->wHour = tmpTM.tm_hour;
- STHook->wMilliseconds = 0;
- STHook->wMinute = tmpTM.tm_min;
- STHook->wDayOfWeek = tmpTM.tm_wday;
- STHook->wMonth = tmpTM.tm_mon + 1;
- STHook->wSecond = tmpTM.tm_sec;
- STHook->wYear = tmpTM.tm_year;
- bSuccess = TRUE;
+ STHook = (SYSTEMTIME *) lpBuffer;
+ if(STHook==NULL)
+ return bSuccess;
+
+ STHook->wDay = tmpTM.tm_mday;
+ STHook->wHour = tmpTM.tm_hour;
+ STHook->wMilliseconds = 0;
+ STHook->wMinute = tmpTM.tm_min;
+ STHook->wDayOfWeek = tmpTM.tm_wday;
+ STHook->wMonth = tmpTM.tm_mon + 1;
+ STHook->wSecond = tmpTM.tm_sec;
+ STHook->wYear = tmpTM.tm_year;
- TRACE(" returning time: %04d/%02d/%02d - %d - %02d:%02d:%02d.%02d\n",
- STHook->wYear, STHook->wMonth, STHook->wDay, STHook->wDayOfWeek,
- STHook->wHour, STHook->wMinute, STHook->wSecond, STHook->wMilliseconds);
+ bSuccess = TRUE;
+
+ TRACE(" returning time : %04d/%02d/%02d - %d - %02d:%02d:%02d.%02d\n",
+ STHook->wYear, STHook->wMonth, STHook->wDay, STHook->wDayOfWeek,
+ STHook->wHour, STHook->wMinute, STHook->wSecond, STHook->wMilliseconds);
}
else if (lphttpHdr->lpszValue)
{
@@ -2525,13 +2353,12 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel,
INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
return bSuccess;
}
- if (lpBuffer)
- {
- memcpy(lpBuffer, lphttpHdr->lpszValue, len);
- TRACE(" returning string: %s\n", debugstr_w(lpBuffer));
- }
+
+ memcpy(lpBuffer, lphttpHdr->lpszValue, len);
*lpdwBufferLength = len - sizeof(WCHAR);
bSuccess = TRUE;
+
+ TRACE(" returning string : %s\n", debugstr_w(lpBuffer));
}
return bSuccess;
}
@@ -2951,13 +2778,8 @@ BOOL WINAPI HttpSendRequestW(HINTERNET hHttpRequest, LPCWSTR lpszHeaders,
req = &workRequest.u.HttpSendRequestW;
if (lpszHeaders)
{
- DWORD size;
-
- if (dwHeaderLength == ~0u) size = (strlenW(lpszHeaders) + 1) * sizeof(WCHAR);
- else size = dwHeaderLength * sizeof(WCHAR);
-
- req->lpszHeader = HeapAlloc(GetProcessHeap(), 0, size);
- memcpy(req->lpszHeader, lpszHeaders, size);
+ req->lpszHeader = HeapAlloc(GetProcessHeap(), 0, dwHeaderLength * sizeof(WCHAR));
+ memcpy(req->lpszHeader, lpszHeaders, dwHeaderLength * sizeof(WCHAR));
}
else
req->lpszHeader = 0;
@@ -3027,75 +2849,13 @@ static BOOL HTTP_GetRequestURL(WININETHTTPREQW *req, LPWSTR buf)
return TRUE;
}
-/***********************************************************************
- * HTTP_GetRedirectURL (internal)
- */
-static LPWSTR HTTP_GetRedirectURL(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl)
-{
- static WCHAR szHttp[] = {'h','t','t','p',0};
- static WCHAR szHttps[] = {'h','t','t','p','s',0};
- LPWININETHTTPSESSIONW lpwhs = lpwhr->lpHttpSession;
- URL_COMPONENTSW urlComponents;
- DWORD url_length = 0;
- LPWSTR orig_url;
- LPWSTR combined_url;
-
- if (lpszUrl[0]=='/') return WININET_strdupW( lpszUrl );
-
- urlComponents.dwStructSize = sizeof(URL_COMPONENTSW);
- urlComponents.lpszScheme = (lpwhr->hdr.dwFlags & INTERNET_FLAG_SECURE) ? szHttps : szHttp;
- urlComponents.dwSchemeLength = 0;
- urlComponents.lpszHostName = lpwhs->lpszHostName;
- urlComponents.dwHostNameLength = 0;
- urlComponents.nPort = lpwhs->nHostPort;
- urlComponents.lpszUserName = lpwhs->lpszUserName;
- urlComponents.dwUserNameLength = 0;
- urlComponents.lpszPassword = NULL;
- urlComponents.dwPasswordLength = 0;
- urlComponents.lpszUrlPath = lpwhr->lpszPath;
- urlComponents.dwUrlPathLength = 0;
- urlComponents.lpszExtraInfo = NULL;
- urlComponents.dwExtraInfoLength = 0;
-
- if (!InternetCreateUrlW(&urlComponents, 0, NULL, &url_length) &&
- (GetLastError() != ERROR_INSUFFICIENT_BUFFER))
- return NULL;
-
- orig_url = HeapAlloc(GetProcessHeap(), 0, url_length);
-
- /* convert from bytes to characters */
- url_length = url_length / sizeof(WCHAR) - 1;
- if (!InternetCreateUrlW(&urlComponents, 0, orig_url, &url_length))
- {
- HeapFree(GetProcessHeap(), 0, orig_url);
- return NULL;
- }
-
- url_length = 0;
- if (!InternetCombineUrlW(orig_url, lpszUrl, NULL, &url_length, ICU_ENCODE_SPACES_ONLY) &&
- (GetLastError() != ERROR_INSUFFICIENT_BUFFER))
- {
- HeapFree(GetProcessHeap(), 0, orig_url);
- return NULL;
- }
- combined_url = HeapAlloc(GetProcessHeap(), 0, url_length * sizeof(WCHAR));
-
- if (!InternetCombineUrlW(orig_url, lpszUrl, combined_url, &url_length, ICU_ENCODE_SPACES_ONLY))
- {
- HeapFree(GetProcessHeap(), 0, orig_url);
- HeapFree(GetProcessHeap(), 0, combined_url);
- return NULL;
- }
- HeapFree(GetProcessHeap(), 0, orig_url);
- return combined_url;
-}
-
-
/***********************************************************************
* HTTP_HandleRedirect (internal)
*/
static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl)
{
+ static const WCHAR szContentType[] = {'C','o','n','t','e','n','t','-','T','y','p','e',0};
+ static const WCHAR szContentLength[] = {'C','o','n','t','e','n','t','-','L','e','n','g','t','h',0};
LPWININETHTTPSESSIONW lpwhs = lpwhr->lpHttpSession;
LPWININETAPPINFOW hIC = lpwhs->lpAppInfo;
BOOL using_proxy = hIC->lpszProxy && hIC->lpszProxy[0];
@@ -3113,6 +2873,55 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl)
WCHAR protocol[32], hostName[MAXHOSTNAME], userName[1024];
static WCHAR szHttp[] = {'h','t','t','p',0};
static WCHAR szHttps[] = {'h','t','t','p','s',0};
+ DWORD url_length = 0;
+ LPWSTR orig_url;
+ LPWSTR combined_url;
+
+ urlComponents.dwStructSize = sizeof(URL_COMPONENTSW);
+ urlComponents.lpszScheme = (lpwhr->hdr.dwFlags & INTERNET_FLAG_SECURE) ? szHttps : szHttp;
+ urlComponents.dwSchemeLength = 0;
+ urlComponents.lpszHostName = lpwhs->lpszHostName;
+ urlComponents.dwHostNameLength = 0;
+ urlComponents.nPort = lpwhs->nHostPort;
+ urlComponents.lpszUserName = lpwhs->lpszUserName;
+ urlComponents.dwUserNameLength = 0;
+ urlComponents.lpszPassword = NULL;
+ urlComponents.dwPasswordLength = 0;
+ urlComponents.lpszUrlPath = lpwhr->lpszPath;
+ urlComponents.dwUrlPathLength = 0;
+ urlComponents.lpszExtraInfo = NULL;
+ urlComponents.dwExtraInfoLength = 0;
+
+ if (!InternetCreateUrlW(&urlComponents, 0, NULL, &url_length) &&
+ (GetLastError() != ERROR_INSUFFICIENT_BUFFER))
+ return FALSE;
+
+ orig_url = HeapAlloc(GetProcessHeap(), 0, url_length);
+
+ /* convert from bytes to characters */
+ url_length = url_length / sizeof(WCHAR) - 1;
+ if (!InternetCreateUrlW(&urlComponents, 0, orig_url, &url_length))
+ {
+ HeapFree(GetProcessHeap(), 0, orig_url);
+ return FALSE;
+ }
+
+ url_length = 0;
+ if (!InternetCombineUrlW(orig_url, lpszUrl, NULL, &url_length, ICU_ENCODE_SPACES_ONLY) &&
+ (GetLastError() != ERROR_INSUFFICIENT_BUFFER))
+ {
+ HeapFree(GetProcessHeap(), 0, orig_url);
+ return FALSE;
+ }
+ combined_url = HeapAlloc(GetProcessHeap(), 0, url_length * sizeof(WCHAR));
+
+ if (!InternetCombineUrlW(orig_url, lpszUrl, combined_url, &url_length, ICU_ENCODE_SPACES_ONLY))
+ {
+ HeapFree(GetProcessHeap(), 0, orig_url);
+ HeapFree(GetProcessHeap(), 0, combined_url);
+ return FALSE;
+ }
+ HeapFree(GetProcessHeap(), 0, orig_url);
userName[0] = 0;
hostName[0] = 0;
@@ -3131,8 +2940,13 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl)
urlComponents.dwUrlPathLength = 2048;
urlComponents.lpszExtraInfo = NULL;
urlComponents.dwExtraInfoLength = 0;
- if(!InternetCrackUrlW(lpszUrl, strlenW(lpszUrl), 0, &urlComponents))
+ if(!InternetCrackUrlW(combined_url, strlenW(combined_url), 0, &urlComponents))
+ {
+ HeapFree(GetProcessHeap(), 0, combined_url);
return FALSE;
+ }
+
+ HeapFree(GetProcessHeap(), 0, combined_url);
if (!strncmpW(szHttp, urlComponents.lpszScheme, strlenW(szHttp)) &&
(lpwhr->hdr.dwFlags & INTERNET_FLAG_SECURE))
@@ -3206,8 +3020,6 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl)
NETCON_close(&lpwhr->netConnection);
if (!HTTP_ResolveName(lpwhr)) return FALSE;
if (!NETCON_init(&lpwhr->netConnection, lpwhr->hdr.dwFlags & INTERNET_FLAG_SECURE)) return FALSE;
- lpwhr->read_pos = lpwhr->read_size = 0;
- lpwhr->read_chunked = FALSE;
}
}
else
@@ -3227,7 +3039,7 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl)
lpwhr->lpszPath = HeapAlloc(GetProcessHeap(), 0, needed*sizeof(WCHAR));
rc = UrlEscapeW(path, lpwhr->lpszPath, &needed,
URL_ESCAPE_SPACES_ONLY);
- if (rc != S_OK)
+ if (rc)
{
ERR("Unable to escape string!(%s) (%d)\n",debugstr_w(path),rc);
strcpyW(lpwhr->lpszPath,path);
@@ -3235,10 +3047,10 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl)
}
/* Remove custom content-type/length headers on redirects. */
- index = HTTP_GetCustomHeaderIndex(lpwhr, szContent_Type, 0, TRUE);
+ index = HTTP_GetCustomHeaderIndex(lpwhr, szContentType, 0, TRUE);
if (0 <= index)
HTTP_DeleteCustomHeader(lpwhr, index);
- index = HTTP_GetCustomHeaderIndex(lpwhr, szContent_Length, 0, TRUE);
+ index = HTTP_GetCustomHeaderIndex(lpwhr, szContentLength, 0, TRUE);
if (0 <= index)
HTTP_DeleteCustomHeader(lpwhr, index);
@@ -3312,28 +3124,29 @@ static BOOL HTTP_SecureProxyConnect(LPWININETHTTPREQW lpwhr)
static void HTTP_InsertCookies(LPWININETHTTPREQW lpwhr)
{
- static const WCHAR szUrlForm[] = {'h','t','t','p',':','/','/','%','s','%','s',0};
+ static const WCHAR szUrlForm[] = {'h','t','t','p',':','/','/','%','s',0};
LPWSTR lpszCookies, lpszUrl = NULL;
DWORD nCookieSize, size;
LPHTTPHEADERW Host = HTTP_GetHeader(lpwhr,szHost);
- size = (strlenW(Host->lpszValue) + strlenW(szUrlForm) + strlenW(lpwhr->lpszPath)) * sizeof(WCHAR);
+ size = (strlenW(Host->lpszValue) + strlenW(szUrlForm)) * sizeof(WCHAR);
if (!(lpszUrl = HeapAlloc(GetProcessHeap(), 0, size))) return;
- sprintfW( lpszUrl, szUrlForm, Host->lpszValue, lpwhr->lpszPath);
+ sprintfW( lpszUrl, szUrlForm, Host->lpszValue );
if (InternetGetCookieW(lpszUrl, NULL, NULL, &nCookieSize))
{
int cnt = 0;
static const WCHAR szCookie[] = {'C','o','o','k','i','e',':',' ',0};
+ static const WCHAR szcrlf[] = {'\r','\n',0};
- size = sizeof(szCookie) + nCookieSize * sizeof(WCHAR) + sizeof(szCrLf);
+ size = sizeof(szCookie) + nCookieSize * sizeof(WCHAR) + sizeof(szcrlf);
if ((lpszCookies = HeapAlloc(GetProcessHeap(), 0, size)))
{
cnt += sprintfW(lpszCookies, szCookie);
InternetGetCookieW(lpszUrl, NULL, lpszCookies + cnt, &nCookieSize);
- strcatW(lpszCookies, szCrLf);
+ strcatW(lpszCookies, szcrlf);
- HTTP_HttpAddRequestHeadersW(lpwhr, lpszCookies, strlenW(lpszCookies), HTTP_ADDREQ_FLAG_REPLACE);
+ HTTP_HttpAddRequestHeadersW(lpwhr, lpszCookies, strlenW(lpszCookies), HTTP_ADDREQ_FLAG_ADD);
HeapFree(GetProcessHeap(), 0, lpszCookies);
}
}
@@ -3355,7 +3168,7 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
DWORD dwContentLength, BOOL bEndRequest)
{
INT cnt;
- BOOL bSuccess = FALSE, redirected = FALSE;
+ BOOL bSuccess = FALSE;
LPWSTR requestString = NULL;
INT responseLen;
BOOL loop_next;
@@ -3373,11 +3186,10 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
if (!lpwhr->lpszVerb)
lpwhr->lpszVerb = WININET_strdupW(szGET);
- if (dwContentLength || strcmpW(lpwhr->lpszVerb, szGET))
+ if (dwContentLength || !strcmpW(lpwhr->lpszVerb, szPost))
{
sprintfW(contentLengthStr, szContentLength, dwContentLength);
- HTTP_HttpAddRequestHeadersW(lpwhr, contentLengthStr, -1L, HTTP_ADDREQ_FLAG_REPLACE);
- lpwhr->dwBytesToWrite = dwContentLength;
+ HTTP_HttpAddRequestHeadersW(lpwhr, contentLengthStr, -1L, HTTP_ADDREQ_FLAG_ADD_IF_NEW);
}
if (lpwhr->lpHttpSession->lpAppInfo->lpszAgent)
{
@@ -3457,7 +3269,7 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
goto lend;
/* send the request as ASCII, tack on the optional data */
- if (!lpOptional || redirected)
+ if( !lpOptional )
dwOptionalLength = 0;
len = WideCharToMultiByte( CP_ACP, 0, requestString, -1,
NULL, 0, NULL, NULL );
@@ -3476,8 +3288,6 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
NETCON_send(&lpwhr->netConnection, ascii_req, len, 0, &cnt);
HeapFree( GetProcessHeap(), 0, ascii_req );
- lpwhr->dwBytesWritten = dwOptionalLength;
-
INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
INTERNET_STATUS_REQUEST_SENT,
&len, sizeof(DWORD));
@@ -3486,6 +3296,8 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
{
DWORD dwBufferSize;
DWORD dwStatusCode;
+ WCHAR encoding[20];
+ static const WCHAR szChunked[] = {'c','h','u','n','k','e','d',0};
INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0);
@@ -3503,7 +3315,22 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
HTTP_ProcessCookies(lpwhr);
- if (!set_content_length( lpwhr )) HTTP_FinishedReading(lpwhr);
+ dwBufferSize = sizeof(lpwhr->dwContentLength);
+ if (!HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_CONTENT_LENGTH,
+ &lpwhr->dwContentLength,&dwBufferSize,NULL))
+ lpwhr->dwContentLength = -1;
+
+ if (lpwhr->dwContentLength == 0)
+ HTTP_FinishedReading(lpwhr);
+
+ /* Correct the case where both a Content-Length and Transfer-encoding = chunked are set */
+
+ dwBufferSize = sizeof(encoding);
+ if (HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_TRANSFER_ENCODING, encoding, &dwBufferSize, NULL) &&
+ !strcmpiW(encoding, szChunked))
+ {
+ lpwhr->dwContentLength = -1;
+ }
dwBufferSize = sizeof(dwStatusCode);
if (!HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_STATUS_CODE,
@@ -3512,29 +3339,21 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
if (!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_AUTO_REDIRECT) && bSuccess)
{
- WCHAR *new_url, szNewLocation[INTERNET_MAX_URL_LENGTH];
+ WCHAR szNewLocation[INTERNET_MAX_URL_LENGTH];
dwBufferSize=sizeof(szNewLocation);
if ((dwStatusCode==HTTP_STATUS_REDIRECT || dwStatusCode==HTTP_STATUS_MOVED) &&
HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_LOCATION,szNewLocation,&dwBufferSize,NULL))
{
- /* redirects are always GETs */
- HeapFree(GetProcessHeap(), 0, lpwhr->lpszVerb);
- lpwhr->lpszVerb = WININET_strdupW(szGET);
-
HTTP_DrainContent(lpwhr);
- if ((new_url = HTTP_GetRedirectURL( lpwhr, szNewLocation )))
+ INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
+ INTERNET_STATUS_REDIRECT, szNewLocation,
+ dwBufferSize);
+ bSuccess = HTTP_HandleRedirect(lpwhr, szNewLocation);
+ if (bSuccess)
{
- INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_REDIRECT,
- new_url, (strlenW(new_url) + 1) * sizeof(WCHAR));
- bSuccess = HTTP_HandleRedirect(lpwhr, new_url);
- if (bSuccess)
- {
- HeapFree(GetProcessHeap(), 0, requestString);
- loop_next = TRUE;
- }
- HeapFree( GetProcessHeap(), 0, new_url );
+ HeapFree(GetProcessHeap(), 0, requestString);
+ loop_next = TRUE;
}
- redirected = TRUE;
}
}
if (!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_AUTH) && bSuccess)
@@ -3610,31 +3429,12 @@ lend:
/* TODO: send notification for P3P header */
- if (lpwhr->lpHttpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC)
- {
- if (bSuccess)
- {
- if (lpwhr->dwBytesWritten == lpwhr->dwBytesToWrite) HTTP_ReceiveRequestData(lpwhr, TRUE);
- else
- {
- iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet;
- iar.dwError = 0;
+ iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet;
+ iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError();
- INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
- INTERNET_STATUS_REQUEST_COMPLETE, &iar,
- sizeof(INTERNET_ASYNC_RESULT));
- }
- }
- else
- {
- iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet;
- iar.dwError = INTERNET_GetLastError();
-
- INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
- INTERNET_STATUS_REQUEST_COMPLETE, &iar,
- sizeof(INTERNET_ASYNC_RESULT));
- }
- }
+ INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
+ INTERNET_STATUS_REQUEST_COMPLETE, &iar,
+ sizeof(INTERNET_ASYNC_RESULT));
TRACE("<--\n");
if (bSuccess) INTERNET_SetLastError(ERROR_SUCCESS);
@@ -3679,34 +3479,11 @@ static DWORD HTTPSESSION_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, voi
return INET_QueryOption(option, buffer, size, unicode);
}
-static DWORD HTTPSESSION_SetOption(WININETHANDLEHEADER *hdr, DWORD option, void *buffer, DWORD size)
-{
- WININETHTTPSESSIONW *ses = (WININETHTTPSESSIONW*)hdr;
-
- switch(option) {
- case INTERNET_OPTION_USERNAME:
- {
- HeapFree(GetProcessHeap(), 0, ses->lpszUserName);
- if (!(ses->lpszUserName = WININET_strdupW(buffer))) return ERROR_OUTOFMEMORY;
- return ERROR_SUCCESS;
- }
- case INTERNET_OPTION_PASSWORD:
- {
- HeapFree(GetProcessHeap(), 0, ses->lpszPassword);
- if (!(ses->lpszPassword = WININET_strdupW(buffer))) return ERROR_OUTOFMEMORY;
- return ERROR_SUCCESS;
- }
- default: break;
- }
-
- return ERROR_INTERNET_INVALID_OPTION;
-}
-
static const HANDLEHEADERVtbl HTTPSESSIONVtbl = {
HTTPSESSION_Destroy,
NULL,
HTTPSESSION_QueryOption,
- HTTPSESSION_SetOption,
+ NULL,
NULL,
NULL,
NULL,
@@ -3834,7 +3611,7 @@ static BOOL HTTP_OpenConnection(LPWININETHTTPREQW lpwhr)
TRACE("-->\n");
- if (lpwhr->hdr.htype != WH_HHTTPREQ)
+ if (NULL == lpwhr || lpwhr->hdr.htype != WH_HHTTPREQ)
{
INTERNET_SetLastError(ERROR_INVALID_PARAMETER);
goto lend;
@@ -3893,9 +3670,6 @@ static BOOL HTTP_OpenConnection(LPWININETHTTPREQW lpwhr)
bSuccess = TRUE;
lend:
- lpwhr->read_pos = lpwhr->read_size = 0;
- lpwhr->read_chunked = FALSE;
-
TRACE("%d <--\n", bSuccess);
return bSuccess;
}
@@ -3940,6 +3714,7 @@ static INT HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr, BOOL clear)
DWORD buflen = MAX_REPLY_LEN;
BOOL bSuccess = FALSE;
INT rc = 0;
+ static const WCHAR szCrLf[] = {'\r','\n',0};
static const WCHAR szHundred[] = {'1','0','0',0};
char bufferA[MAX_REPLY_LEN];
LPWSTR status_code, status_text;
@@ -3957,12 +3732,17 @@ static INT HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr, BOOL clear)
do {
/*
- * We should first receive 'HTTP/1.x nnn OK' where nnn is the status code.
+ * HACK peek at the buffer
*/
buflen = MAX_REPLY_LEN;
- if (!read_line(lpwhr, bufferA, &buflen))
+ NETCON_recv(&lpwhr->netConnection, buffer, buflen, MSG_PEEK, &rc);
+
+ /*
+ * We should first receive 'HTTP/1.x nnn OK' where nnn is the status code.
+ */
+ memset(buffer, 0, MAX_REPLY_LEN);
+ if (!NETCON_getNextLine(&lpwhr->netConnection, bufferA, &buflen))
goto lend;
- rc += buflen;
MultiByteToWideChar( CP_ACP, 0, bufferA, buflen, buffer, MAX_REPLY_LEN );
/* split the version from the status code */
@@ -4012,18 +3792,11 @@ static INT HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr, BOOL clear)
do
{
buflen = MAX_REPLY_LEN;
- if (read_line(lpwhr, bufferA, &buflen))
+ if (NETCON_getNextLine(&lpwhr->netConnection, bufferA, &buflen))
{
LPWSTR * pFieldAndValue;
TRACE("got line %s, now interpreting\n", debugstr_a(bufferA));
-
- if (!bufferA[0]) break;
- if (!strchr(bufferA, ':'))
- {
- WARN("invalid header\n");
- continue;
- }
MultiByteToWideChar( CP_ACP, 0, bufferA, buflen, buffer, MAX_REPLY_LEN );
while (cchRawHeaders + buflen + strlenW(szCrLf) > cchMaxRawHeaders)
@@ -4278,7 +4051,7 @@ static BOOL HTTP_ProcessHeader(LPWININETHTTPREQW lpwhr, LPCWSTR field, LPCWSTR v
* Called when all content from server has been read by client.
*
*/
-static BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr)
+BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr)
{
WCHAR szVersion[10];
WCHAR szConnectionResponse[20];
@@ -4289,9 +4062,9 @@ static BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr)
/* as per RFC 2068, S8.1.2.1, if the client is HTTP/1.1 then assume that
* the connection is keep-alive by default */
- if (HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_VERSION, szVersion,
- &dwBufferSize, NULL) &&
- !strcmpiW(szVersion, g_szHttp1_1))
+ if (!HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_VERSION, szVersion,
+ &dwBufferSize, NULL) ||
+ strcmpiW(szVersion, g_szHttp1_1))
{
keepalive = TRUE;
}
diff --git a/reactos/dll/win32/wininet/internet.c b/reactos/dll/win32/wininet/internet.c
index aa2a6b720f0..bad795ddbd4 100644
--- a/reactos/dll/win32/wininet/internet.c
+++ b/reactos/dll/win32/wininet/internet.c
@@ -31,10 +31,6 @@
#define MAXHOSTNAME 100 /* from http.c */
-#if defined(__MINGW32__) || defined (_MSC_VER)
-#include
-#endif
-
#include
#include
#include
@@ -117,7 +113,7 @@ HINTERNET WININET_AllocHandle( LPWININETHANDLEHEADER info )
{
num = HANDLE_CHUNK_SIZE;
p = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof (*WININET_Handles)* num);
+ sizeof (UINT)* num);
if( !p )
goto end;
WININET_Handles = p;
@@ -127,7 +123,7 @@ HINTERNET WININET_AllocHandle( LPWININETHANDLEHEADER info )
{
num = WININET_dwMaxHandles + HANDLE_CHUNK_SIZE;
p = HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
- WININET_Handles, sizeof (*WININET_Handles)* num);
+ WININET_Handles, sizeof (UINT)* num);
if( !p )
goto end;
WININET_Handles = p;
@@ -186,8 +182,7 @@ BOOL WININET_Release( LPWININETHANDLEHEADER info )
info->vtbl->CloseConnection( info );
}
/* Don't send a callback if this is a session handle created with InternetOpenUrl */
- if ((info->htype != WH_HHTTPSESSION && info->htype != WH_HFTPSESSION)
- || !(info->dwInternalFlags & INET_OPENURL))
+ if (info->htype != WH_HHTTPSESSION || !(info->dwInternalFlags & INET_OPENURL))
{
INTERNET_SendCallback(info, info->dwContext,
INTERNET_STATUS_HANDLE_CLOSING, &info->hInternet,
@@ -415,11 +410,8 @@ static BOOL INTERNET_ConfigureProxy( LPWININETAPPINFOW lpwai )
TRACE("http proxy (from environment) = %s\n", debugstr_w(lpwai->lpszProxy));
enabled = 1;
}
- if (!enabled)
- {
- TRACE("Proxy is not enabled.\n");
- lpwai->dwAccessType = INTERNET_OPEN_TYPE_DIRECT;
- }
+ if (!enabled) TRACE("Proxy is not enabled.\n");
+
RegCloseKey( key );
return (enabled > 0);
}
@@ -467,8 +459,8 @@ static void dump_INTERNET_FLAGS(DWORD dwFlags)
FE(INTERNET_FLAG_TRANSFER_BINARY)
};
#undef FE
- unsigned int i;
-
+ int i;
+
for (i = 0; i < (sizeof(flag) / sizeof(flag[0])); i++) {
if (flag[i].val & dwFlags) {
TRACE(" %s", flag[i].name);
@@ -551,10 +543,8 @@ static DWORD APPINFO_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, void *b
if (ai->lpszProxyBypass)
proxyBypassBytesRequired = (lstrlenW(ai->lpszProxyBypass) + 1) * sizeof(WCHAR);
if (*size < sizeof(INTERNET_PROXY_INFOW) + proxyBytesRequired + proxyBypassBytesRequired)
- {
- *size = sizeof(INTERNET_PROXY_INFOW) + proxyBytesRequired + proxyBypassBytesRequired;
- return ERROR_INSUFFICIENT_BUFFER;
- }
+ return ERROR_INSUFFICIENT_BUFFER;
+
proxy = (LPWSTR)((LPBYTE)buffer + sizeof(INTERNET_PROXY_INFOW));
proxy_bypass = (LPWSTR)((LPBYTE)buffer + sizeof(INTERNET_PROXY_INFOW) + proxyBytesRequired);
@@ -584,10 +574,8 @@ static DWORD APPINFO_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, void *b
proxyBypassBytesRequired = WideCharToMultiByte(CP_ACP, 0, ai->lpszProxyBypass, -1,
NULL, 0, NULL, NULL);
if (*size < sizeof(INTERNET_PROXY_INFOA) + proxyBytesRequired + proxyBypassBytesRequired)
- {
- *size = sizeof(INTERNET_PROXY_INFOA) + proxyBytesRequired + proxyBypassBytesRequired;
return ERROR_INSUFFICIENT_BUFFER;
- }
+
proxy = (LPSTR)((LPBYTE)buffer + sizeof(INTERNET_PROXY_INFOA));
proxy_bypass = (LPSTR)((LPBYTE)buffer + sizeof(INTERNET_PROXY_INFOA) + proxyBytesRequired);
@@ -791,7 +779,7 @@ HINTERNET WINAPI InternetOpenA(LPCSTR lpszAgent, DWORD dwAccessType,
BOOL WINAPI InternetGetLastResponseInfoA(LPDWORD lpdwError,
LPSTR lpszBuffer, LPDWORD lpdwBufferLength)
{
- LPWITHREADERROR lpwite = TlsGetValue(g_dwTlsErrIndex);
+ LPWITHREADERROR lpwite = (LPWITHREADERROR)TlsGetValue(g_dwTlsErrIndex);
TRACE("\n");
@@ -828,7 +816,7 @@ BOOL WINAPI InternetGetLastResponseInfoA(LPDWORD lpdwError,
BOOL WINAPI InternetGetLastResponseInfoW(LPDWORD lpdwError,
LPWSTR lpszBuffer, LPDWORD lpdwBufferLength)
{
- LPWITHREADERROR lpwite = TlsGetValue(g_dwTlsErrIndex);
+ LPWITHREADERROR lpwite = (LPWITHREADERROR)TlsGetValue(g_dwTlsErrIndex);
TRACE("\n");
@@ -868,7 +856,7 @@ BOOL WINAPI InternetGetConnectedState(LPDWORD lpdwStatus, DWORD dwReserved)
TRACE("(%p, 0x%08x)\n", lpdwStatus, dwReserved);
if (lpdwStatus) {
- WARN("always returning LAN connection.\n");
+ FIXME("always returning LAN connection.\n");
*lpdwStatus = INTERNET_CONNECTION_LAN;
}
return TRUE;
@@ -912,7 +900,7 @@ BOOL WINAPI InternetGetConnectedStateExW(LPDWORD lpdwStatus, LPWSTR lpszConnecti
return FALSE;
if (lpdwStatus) {
- WARN("always returning LAN connection.\n");
+ FIXME("always returning LAN connection.\n");
*lpdwStatus = INTERNET_CONNECTION_LAN;
}
return LoadStringW(WININET_hModule, IDS_LANCONNECTION, lpszConnectionName, dwNameLen);
@@ -1825,8 +1813,8 @@ INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallbackA(
INTERNET_STATUS_CALLBACK retVal;
LPWININETHANDLEHEADER lpwh;
- TRACE("%p\n", hInternet);
-
+ TRACE("0x%08x\n", (ULONG)hInternet);
+
if (!(lpwh = WININET_GetObject(hInternet)))
return INTERNET_INVALID_STATUS_CALLBACK;
@@ -1853,7 +1841,7 @@ INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallbackW(
INTERNET_STATUS_CALLBACK retVal;
LPWININETHANDLEHEADER lpwh;
- TRACE("%p\n", hInternet);
+ TRACE("0x%08x\n", (ULONG)hInternet);
if (!(lpwh = WININET_GetObject(hInternet)))
return INTERNET_INVALID_STATUS_CALLBACK;
@@ -2006,40 +1994,33 @@ BOOL WINAPI InternetReadFileExA(HINTERNET hFile, LPINTERNET_BUFFERSA lpBuffersOu
/***********************************************************************
* InternetReadFileExW (WININET.@)
- * SEE
- * InternetReadFileExA()
+ *
+ * Read data from an open internet file.
+ *
+ * PARAMS
+ * hFile [I] Handle returned by InternetOpenUrl() or HttpOpenRequest().
+ * lpBuffersOut [I/O] Buffer.
+ * dwFlags [I] Flags.
+ * dwContext [I] Context for callbacks.
+ *
+ * RETURNS
+ * FALSE, last error is set to ERROR_CALL_NOT_IMPLEMENTED
+ *
+ * NOTES
+ * Not implemented in Wine or native either (as of IE6 SP2).
+ *
*/
BOOL WINAPI InternetReadFileExW(HINTERNET hFile, LPINTERNET_BUFFERSW lpBuffer,
DWORD dwFlags, DWORD_PTR dwContext)
{
- LPWININETHANDLEHEADER hdr;
- DWORD res = ERROR_INTERNET_INCORRECT_HANDLE_TYPE;
+ ERR("(%p, %p, 0x%x, 0x%lx): not implemented in native\n", hFile, lpBuffer, dwFlags, dwContext);
- TRACE("(%p %p 0x%x 0x%lx)\n", hFile, lpBuffer, dwFlags, dwContext);
-
- hdr = WININET_GetObject(hFile);
- if (!hdr) {
- INTERNET_SetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
- }
-
- if(hdr->vtbl->ReadFileExW)
- res = hdr->vtbl->ReadFileExW(hdr, lpBuffer, dwFlags, dwContext);
-
- WININET_Release(hdr);
-
- TRACE("-- %s (%u, bytes read: %d)\n", res == ERROR_SUCCESS ? "TRUE": "FALSE",
- res, lpBuffer->dwBufferLength);
-
- if(res != ERROR_SUCCESS)
- SetLastError(res);
- return res == ERROR_SUCCESS;
+ INTERNET_SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
}
DWORD INET_QueryOption(DWORD option, void *buffer, DWORD *size, BOOL unicode)
{
- static BOOL warn = TRUE;
-
switch(option) {
case INTERNET_OPTION_REQUEST_FLAGS:
TRACE("INTERNET_OPTION_REQUEST_FLAGS\n");
@@ -2066,11 +2047,8 @@ DWORD INET_QueryOption(DWORD option, void *buffer, DWORD *size, BOOL unicode)
return ERROR_SUCCESS;
case INTERNET_OPTION_CONNECTED_STATE:
+ FIXME("INTERNET_OPTION_CONNECTED_STATE: semi-stub\n");
- if (warn) {
- FIXME("INTERNET_OPTION_CONNECTED_STATE: semi-stub\n");
- warn = FALSE;
- }
if (*size < sizeof(ULONG))
return ERROR_INSUFFICIENT_BUFFER;
@@ -2155,7 +2133,8 @@ DWORD INET_QueryOption(DWORD option, void *buffer, DWORD *size, BOOL unicode)
case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_TIME:
case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_URL:
FIXME("Unhandled dwOption %d\n", option->dwOption);
- memset(&option->Value, 0, sizeof(option->Value));
+ option->Value.dwValue = 0;
+ res = ERROR_INVALID_PARAMETER;
break;
default:
@@ -2277,14 +2256,9 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption,
{
case INTERNET_OPTION_CALLBACK:
{
- if (!lpwhh)
- {
- INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
- return FALSE;
- }
- WININET_Release(lpwhh);
- INTERNET_SetLastError(ERROR_INTERNET_OPTION_NOT_SETTABLE);
- return FALSE;
+ INTERNET_STATUS_CALLBACK callback = *(INTERNET_STATUS_CALLBACK *)lpBuffer;
+ ret = (set_status_callback(lpwhh, callback, TRUE) != INTERNET_INVALID_STATUS_CALLBACK);
+ break;
}
case INTERNET_OPTION_HTTP_VERSION:
{
@@ -2368,35 +2342,8 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption,
case INTERNET_OPTION_DISABLE_AUTODIAL:
FIXME("Option INTERNET_OPTION_DISABLE_AUTODIAL; STUB\n");
break;
- case INTERNET_OPTION_HTTP_DECODING:
- FIXME("INTERNET_OPTION_HTTP_DECODING; STUB\n");
- INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION);
- ret = FALSE;
- break;
- case INTERNET_OPTION_COOKIES_3RD_PARTY:
- FIXME("INTERNET_OPTION_COOKIES_3RD_PARTY; STUB\n");
- INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION);
- ret = FALSE;
- break;
- case INTERNET_OPTION_SEND_UTF8_SERVERNAME_TO_PROXY:
- FIXME("INTERNET_OPTION_SEND_UTF8_SERVERNAME_TO_PROXY; STUB\n");
- INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION);
- ret = FALSE;
- break;
- case INTERNET_OPTION_CODEPAGE_PATH:
- FIXME("INTERNET_OPTION_CODEPAGE_PATH; STUB\n");
- INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION);
- ret = FALSE;
- break;
- case INTERNET_OPTION_CODEPAGE_EXTRA:
- FIXME("INTERNET_OPTION_CODEPAGE_EXTRA; STUB\n");
- INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION);
- ret = FALSE;
- break;
- case INTERNET_OPTION_IDN:
- FIXME("INTERNET_OPTION_IDN; STUB\n");
- INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION);
- ret = FALSE;
+ case 86:
+ FIXME("86\n");
break;
default:
FIXME("Option %d STUB\n",dwOption);
@@ -2434,15 +2381,12 @@ BOOL WINAPI InternetSetOptionA(HINTERNET hInternet, DWORD dwOption,
case INTERNET_OPTION_CALLBACK:
{
LPWININETHANDLEHEADER lpwh;
+ INTERNET_STATUS_CALLBACK callback = *(INTERNET_STATUS_CALLBACK *)lpBuffer;
- if (!(lpwh = WININET_GetObject(hInternet)))
- {
- INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
- return FALSE;
- }
+ if (!(lpwh = WININET_GetObject(hInternet))) return FALSE;
+ r = (set_status_callback(lpwh, callback, FALSE) != INTERNET_INVALID_STATUS_CALLBACK);
WININET_Release(lpwh);
- INTERNET_SetLastError(ERROR_INTERNET_OPTION_NOT_SETTABLE);
- return FALSE;
+ return r;
}
case INTERNET_OPTION_PROXY:
{
@@ -2531,18 +2475,6 @@ BOOL WINAPI InternetTimeFromSystemTimeA( const SYSTEMTIME* time, DWORD format, L
TRACE( "%p 0x%08x %p 0x%08x\n", time, format, string, size );
- if (!time || !string || format != INTERNET_RFC1123_FORMAT)
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
- if (size < INTERNET_RFC1123_BUFSIZE * sizeof(*string))
- {
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- return FALSE;
- }
-
ret = InternetTimeFromSystemTimeW( time, format, stringW, sizeof(stringW) );
if (ret) WideCharToMultiByte( CP_ACP, 0, stringW, -1, string, size, NULL, NULL );
@@ -2560,17 +2492,10 @@ BOOL WINAPI InternetTimeFromSystemTimeW( const SYSTEMTIME* time, DWORD format, L
TRACE( "%p 0x%08x %p 0x%08x\n", time, format, string, size );
- if (!time || !string || format != INTERNET_RFC1123_FORMAT)
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
+ if (!time || !string) return FALSE;
- if (size < INTERNET_RFC1123_BUFSIZE * sizeof(*string))
- {
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ if (format != INTERNET_RFC1123_FORMAT || size < INTERNET_RFC1123_BUFSIZE * sizeof(WCHAR))
return FALSE;
- }
sprintfW( string, date,
WININET_wkday[time->wDayOfWeek],
@@ -2880,8 +2805,6 @@ static HINTERNET INTERNET_InternetOpenUrlW(LPWININETAPPINFOW hIC, LPCWSTR lpszUr
else
urlComponents.nPort = INTERNET_DEFAULT_HTTPS_PORT;
}
- if (urlComponents.nScheme == INTERNET_SCHEME_HTTPS) dwFlags |= INTERNET_FLAG_SECURE;
-
/* FIXME: should use pointers, not handles, as handles are not thread-safe */
client = HTTP_Connect(hIC, hostName, urlComponents.nPort,
userName, password, dwFlags, dwContext, INET_OPENURL);
@@ -3087,7 +3010,7 @@ static LPWITHREADERROR INTERNET_AllocThreadError(void)
*/
void INTERNET_SetLastError(DWORD dwError)
{
- LPWITHREADERROR lpwite = TlsGetValue(g_dwTlsErrIndex);
+ LPWITHREADERROR lpwite = (LPWITHREADERROR)TlsGetValue(g_dwTlsErrIndex);
if (!lpwite)
lpwite = INTERNET_AllocThreadError();
@@ -3108,7 +3031,7 @@ void INTERNET_SetLastError(DWORD dwError)
*/
DWORD INTERNET_GetLastError(void)
{
- LPWITHREADERROR lpwite = TlsGetValue(g_dwTlsErrIndex);
+ LPWITHREADERROR lpwite = (LPWITHREADERROR)TlsGetValue(g_dwTlsErrIndex);
if (!lpwite) return 0;
/* TlsGetValue clears last error, so set it again here */
SetLastError(lpwite->dwError);
@@ -3181,7 +3104,7 @@ BOOL INTERNET_AsyncCall(LPWORKREQUEST lpWorkRequest)
*/
LPSTR INTERNET_GetResponseBuffer(void)
{
- LPWITHREADERROR lpwite = TlsGetValue(g_dwTlsErrIndex);
+ LPWITHREADERROR lpwite = (LPWITHREADERROR)TlsGetValue(g_dwTlsErrIndex);
if (!lpwite)
lpwite = INTERNET_AllocThreadError();
TRACE("\n");
@@ -3528,9 +3451,6 @@ static BOOL calc_url_length(LPURL_COMPONENTSW lpUrlComponents,
if (lpUrlComponents->lpszUrlPath)
*lpdwUrlLength += URL_GET_COMP_LENGTH(lpUrlComponents, UrlPath);
- if (lpUrlComponents->lpszExtraInfo)
- *lpdwUrlLength += URL_GET_COMP_LENGTH(lpUrlComponents, ExtraInfo);
-
return TRUE;
}
@@ -3779,6 +3699,7 @@ BOOL WINAPI InternetCreateUrlW(LPURL_COMPONENTSW lpUrlComponents, DWORD dwFlags,
}
}
+
if (lpUrlComponents->lpszUrlPath)
{
dwLen = URL_GET_COMP_LENGTH(lpUrlComponents, UrlPath);
@@ -3786,13 +3707,6 @@ BOOL WINAPI InternetCreateUrlW(LPURL_COMPONENTSW lpUrlComponents, DWORD dwFlags,
lpszUrl += dwLen;
}
- if (lpUrlComponents->lpszExtraInfo)
- {
- dwLen = URL_GET_COMP_LENGTH(lpUrlComponents, ExtraInfo);
- memcpy(lpszUrl, lpUrlComponents->lpszExtraInfo, dwLen * sizeof(WCHAR));
- lpszUrl += dwLen;
- }
-
*lpszUrl = '\0';
return TRUE;
@@ -3818,25 +3732,6 @@ DWORD WINAPI InternetConfirmZoneCrossingW( HWND hWnd, LPWSTR szUrlPrev, LPWSTR s
return ERROR_SUCCESS;
}
-/***********************************************************************
- * PrivacySetZonePreferenceW (WININET.@)
- */
-DWORD WINAPI PrivacySetZonePreferenceW( DWORD zone, DWORD type, DWORD template, LPCWSTR preference )
-{
- FIXME( "%x %x %x %s: stub\n", zone, type, template, debugstr_w(preference) );
- return 0;
-}
-
-/***********************************************************************
- * PrivacyGetZonePreferenceW (WININET.@)
- */
-DWORD WINAPI PrivacyGetZonePreferenceW( DWORD zone, DWORD type, LPDWORD template,
- LPWSTR preference, LPDWORD length )
-{
- FIXME( "%x %x: stub\n", zone, type );
- return 0;
-}
-
DWORD WINAPI InternetDialA( HWND hwndParent, LPSTR lpszConnectoid, DWORD dwFlags,
DWORD_PTR* lpdwConnection, DWORD dwReserved )
{
diff --git a/reactos/dll/win32/wininet/internet.h b/reactos/dll/win32/wininet/internet.h
index 48271d650ec..0dcf5a22ce6 100644
--- a/reactos/dll/win32/wininet/internet.h
+++ b/reactos/dll/win32/wininet/internet.h
@@ -42,17 +42,29 @@
# include
#endif
-#if !defined(__MINGW32__) && !defined(_MSC_VER)
+#if defined(__MINGW32__) || defined (_MSC_VER)
+#include "ws2tcpip.h"
+#ifndef MSG_WAITALL
+#define MSG_WAITALL 0
+#endif
+#else
#define closesocket close
#define ioctlsocket ioctl
#endif /* __MINGW32__ */
+/* ReactOS-specific definitions */
+#undef CP_UNIXCP
+#define CP_UNIXCP CP_THREAD_ACP
+
/* used for netconnection.c stuff */
typedef struct
{
BOOL useSSL;
int socketFD;
void *ssl_s;
+ char *peek_msg;
+ char *peek_msg_mem;
+ size_t peek_len;
} WININET_NETCONNECTION;
static inline LPWSTR WININET_strdupW( LPCWSTR str )
@@ -121,7 +133,6 @@ typedef struct {
DWORD (*SetOption)(WININETHANDLEHEADER*,DWORD,void*,DWORD);
DWORD (*ReadFile)(WININETHANDLEHEADER*,void*,DWORD,DWORD*);
DWORD (*ReadFileExA)(WININETHANDLEHEADER*,INTERNET_BUFFERSA*,DWORD,DWORD_PTR);
- DWORD (*ReadFileExW)(WININETHANDLEHEADER*,INTERNET_BUFFERSW*,DWORD,DWORD_PTR);
BOOL (*WriteFile)(WININETHANDLEHEADER*,const void*,DWORD,DWORD*);
DWORD (*QueryDataAvailable)(WININETHANDLEHEADER*,DWORD*,DWORD,DWORD_PTR);
DWORD (*FindNextFileW)(WININETHANDLEHEADER*,void*);
@@ -195,18 +206,12 @@ typedef struct
LPWSTR lpszStatusText;
DWORD dwContentLength; /* total number of bytes to be read */
DWORD dwContentRead; /* bytes of the content read so far */
- DWORD dwBytesToWrite;
- DWORD dwBytesWritten;
HTTPHEADERW *pCustHeaders;
DWORD nCustHeaders;
HANDLE hCacheFile;
LPWSTR lpszCacheFile;
struct HttpAuthInfo *pAuthInfo;
struct HttpAuthInfo *pProxyAuthInfo;
- BOOL read_chunked; /* are we reading in chunked mode? */
- DWORD read_pos; /* current read position in read_buf */
- DWORD read_size; /* valid data size in read_buf */
- char read_buf[4096]; /* buffer for already read but not returned data */
} WININETHTTPREQW, *LPWININETHTTPREQW;
@@ -292,12 +297,6 @@ struct WORKREQ_HTTPSENDREQUESTW
BOOL bEndRequest;
};
-struct WORKREQ_HTTPENDREQUESTW
-{
- DWORD dwFlags;
- DWORD_PTR dwContext;
-};
-
struct WORKREQ_SENDCALLBACK
{
DWORD_PTR dwContext;
@@ -321,11 +320,6 @@ struct WORKREQ_INTERNETREADFILEEXA
LPINTERNET_BUFFERSA lpBuffersOut;
};
-struct WORKREQ_INTERNETREADFILEEXW
-{
- LPINTERNET_BUFFERSW lpBuffersOut;
-};
-
typedef struct WORKREQ
{
void (*asyncproc)(struct WORKREQ*);
@@ -344,11 +338,9 @@ typedef struct WORKREQ
struct WORKREQ_FTPRENAMEFILEW FtpRenameFileW;
struct WORKREQ_FTPFINDNEXTW FtpFindNextW;
struct WORKREQ_HTTPSENDREQUESTW HttpSendRequestW;
- struct WORKREQ_HTTPENDREQUESTW HttpEndRequestW;
struct WORKREQ_SENDCALLBACK SendCallback;
- struct WORKREQ_INTERNETOPENURLW InternetOpenUrlW;
+ struct WORKREQ_INTERNETOPENURLW InternetOpenUrlW;
struct WORKREQ_INTERNETREADFILEEXA InternetReadFileExA;
- struct WORKREQ_INTERNETREADFILEEXW InternetReadFileExW;
} u;
} WORKREQUEST, *LPWORKREQUEST;
@@ -389,6 +381,7 @@ INTERNETAPI HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs,
LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion,
LPCWSTR lpszReferrer , LPCWSTR *lpszAcceptTypes,
DWORD dwFlags, DWORD_PTR dwContext);
+BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr);
VOID SendAsyncCallback(LPWININETHANDLEHEADER hdr, DWORD_PTR dwContext,
DWORD dwInternetStatus, LPVOID lpvStatusInfo,
@@ -398,6 +391,8 @@ VOID INTERNET_SendCallback(LPWININETHANDLEHEADER hdr, DWORD_PTR dwContext,
DWORD dwInternetStatus, LPVOID lpvStatusInfo,
DWORD dwStatusInfoLength);
+LPHTTPHEADERW HTTP_GetHeader(LPWININETHTTPREQW lpwhr, LPCWSTR header);
+
BOOL NETCON_connected(WININET_NETCONNECTION *connection);
BOOL NETCON_init(WININET_NETCONNECTION *connnection, BOOL useSSL);
BOOL NETCON_create(WININET_NETCONNECTION *connection, int domain,
@@ -411,6 +406,7 @@ BOOL NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len,
BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
int *recvd /* out */);
BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *available);
+BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection);
DWORD NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value);
diff --git a/reactos/dll/win32/wininet/netconnection.c b/reactos/dll/win32/wininet/netconnection.c
index d0d6f8e1dd2..5d8b4d75534 100644
--- a/reactos/dll/win32/wininet/netconnection.c
+++ b/reactos/dll/win32/wininet/netconnection.c
@@ -23,10 +23,6 @@
#include "config.h"
#include "wine/port.h"
-#if defined(__MINGW32__) || defined (_MSC_VER)
-#include
-#endif
-
#include
#ifdef HAVE_POLL_H
#include
@@ -37,12 +33,10 @@
#ifdef HAVE_SYS_TIME_H
# include
#endif
+#include
#ifdef HAVE_SYS_SOCKET_H
# include
#endif
-#ifdef HAVE_SYS_FILIO_H
-# include
-#endif
#ifdef HAVE_UNISTD_H
# include
#endif
@@ -61,6 +55,9 @@
#undef FAR
#undef DSA
#endif
+#ifdef HAVE_SYS_SOCKET_H
+# include
+#endif
#include
#include
@@ -118,18 +115,17 @@ MAKE_FUNCPTR(SSL_connect);
MAKE_FUNCPTR(SSL_shutdown);
MAKE_FUNCPTR(SSL_write);
MAKE_FUNCPTR(SSL_read);
-MAKE_FUNCPTR(SSL_pending);
MAKE_FUNCPTR(SSL_get_verify_result);
MAKE_FUNCPTR(SSL_get_peer_certificate);
MAKE_FUNCPTR(SSL_CTX_get_timeout);
MAKE_FUNCPTR(SSL_CTX_set_timeout);
MAKE_FUNCPTR(SSL_CTX_set_default_verify_paths);
+MAKE_FUNCPTR(i2d_X509);
/* OpenSSL's libcrypto functions that we use */
MAKE_FUNCPTR(BIO_new_fp);
MAKE_FUNCPTR(ERR_get_error);
MAKE_FUNCPTR(ERR_error_string);
-MAKE_FUNCPTR(i2d_X509);
#undef MAKE_FUNCPTR
#endif
@@ -182,12 +178,12 @@ BOOL NETCON_init(WININET_NETCONNECTION *connection, BOOL useSSL)
DYNSSL(SSL_shutdown);
DYNSSL(SSL_write);
DYNSSL(SSL_read);
- DYNSSL(SSL_pending);
DYNSSL(SSL_get_verify_result);
DYNSSL(SSL_get_peer_certificate);
DYNSSL(SSL_CTX_get_timeout);
DYNSSL(SSL_CTX_set_timeout);
DYNSSL(SSL_CTX_set_default_verify_paths);
+ DYNSSL(i2d_X509);
#undef DYNSSL
#define DYNCRYPTO(x) \
@@ -201,7 +197,6 @@ BOOL NETCON_init(WININET_NETCONNECTION *connection, BOOL useSSL)
DYNCRYPTO(BIO_new_fp);
DYNCRYPTO(ERR_get_error);
DYNCRYPTO(ERR_error_string);
- DYNCRYPTO(i2d_X509);
#undef DYNCRYPTO
pSSL_library_init();
@@ -209,6 +204,8 @@ BOOL NETCON_init(WININET_NETCONNECTION *connection, BOOL useSSL)
pBIO_new_fp(stderr, BIO_NOCLOSE); /* FIXME: should use winedebug stuff */
meth = pSSLv23_method();
+ connection->peek_msg = NULL;
+ connection->peek_msg_mem = NULL;
#else
FIXME("can't use SSL, not compiled in.\n");
INTERNET_SetLastError(ERROR_INTERNET_SECURITY_CHANNEL_ERROR);
@@ -329,6 +326,11 @@ BOOL NETCON_close(WININET_NETCONNECTION *connection)
#ifdef SONAME_LIBSSL
if (connection->useSSL)
{
+ HeapFree(GetProcessHeap(),0,connection->peek_msg_mem);
+ connection->peek_msg = NULL;
+ connection->peek_msg_mem = NULL;
+ connection->peek_len = 0;
+
pSSL_shutdown(connection->ssl_s);
pSSL_free(connection->ssl_s);
connection->ssl_s = NULL;
@@ -536,8 +538,55 @@ BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int f
else
{
#ifdef SONAME_LIBSSL
- *recvd = pSSL_read(connection->ssl_s, buf, len);
- return *recvd > 0 || !len;
+ if (flags & ~(MSG_PEEK|MSG_WAITALL))
+ FIXME("SSL_read does not support the following flag: %08x\n", flags);
+
+ /* this ugly hack is all for MSG_PEEK. eww gross */
+ if (flags & MSG_PEEK && !connection->peek_msg)
+ {
+ connection->peek_msg = connection->peek_msg_mem = HeapAlloc(GetProcessHeap(), 0, (sizeof(char) * len) + 1);
+ }
+ else if (flags & MSG_PEEK && connection->peek_msg)
+ {
+ if (len < connection->peek_len)
+ FIXME("buffer isn't big enough. Do the expect us to wrap?\n");
+ *recvd = min(len, connection->peek_len);
+ memcpy(buf, connection->peek_msg, *recvd);
+ return TRUE;
+ }
+ else if (connection->peek_msg)
+ {
+ *recvd = min(len, connection->peek_len);
+ memcpy(buf, connection->peek_msg, *recvd);
+ connection->peek_len -= *recvd;
+ connection->peek_msg += *recvd;
+ if (connection->peek_len == 0)
+ {
+ HeapFree(GetProcessHeap(), 0, connection->peek_msg_mem);
+ connection->peek_msg_mem = NULL;
+ connection->peek_msg = NULL;
+ }
+ /* check if we got enough data from the peek buffer */
+ if (!(flags & MSG_WAITALL) || (*recvd == len))
+ return TRUE;
+ /* otherwise, fall through */
+ }
+ *recvd += pSSL_read(connection->ssl_s, (char*)buf + *recvd, len - *recvd);
+ if (flags & MSG_PEEK) /* must copy stuff into buffer */
+ {
+ connection->peek_len = *recvd;
+ if (!*recvd)
+ {
+ HeapFree(GetProcessHeap(), 0, connection->peek_msg_mem);
+ connection->peek_msg_mem = NULL;
+ connection->peek_msg = NULL;
+ }
+ else
+ memcpy(connection->peek_msg, buf, *recvd);
+ }
+ if (*recvd < 1 && len)
+ return FALSE;
+ return TRUE;
#else
return FALSE;
#endif
@@ -555,9 +604,13 @@ BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *avail
if (!NETCON_connected(connection))
return FALSE;
+#ifdef SONAME_LIBSSL
+ if (connection->peek_msg) *available = connection->peek_len;
+#endif
+
+#ifdef FIONREAD
if (!connection->useSSL)
{
-#ifdef FIONREAD
int unread;
int retval = ioctlsocket(connection->socketFD, FIONREAD, &unread);
if (!retval)
@@ -565,17 +618,115 @@ BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *avail
TRACE("%d bytes of queued, but unread data\n", unread);
*available += unread;
}
+ }
#endif
+ return TRUE;
+}
+
+/******************************************************************************
+ * NETCON_getNextLine
+ */
+BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer)
+{
+
+ TRACE("\n");
+
+ if (!NETCON_connected(connection)) return FALSE;
+
+ if (!connection->useSSL)
+ {
+ struct timeval tv;
+ fd_set infd;
+ BOOL bSuccess = FALSE;
+ DWORD nRecv = 0;
+
+ FD_ZERO(&infd);
+ FD_SET(connection->socketFD, &infd);
+ tv.tv_sec=RESPONSE_TIMEOUT;
+ tv.tv_usec=0;
+
+ while (nRecv < *dwBuffer)
+ {
+ if (select(connection->socketFD+1,&infd,NULL,NULL,&tv) > 0)
+ {
+ if (recv(connection->socketFD, &lpszBuffer[nRecv], 1, 0) <= 0)
+ {
+ INTERNET_SetLastError(sock_get_error(errno));
+ goto lend;
+ }
+
+ if (lpszBuffer[nRecv] == '\n')
+ {
+ bSuccess = TRUE;
+ break;
+ }
+ if (lpszBuffer[nRecv] != '\r')
+ nRecv++;
+ }
+ else
+ {
+ INTERNET_SetLastError(ERROR_INTERNET_TIMEOUT);
+ goto lend;
+ }
+ }
+
+ lend: /* FIXME: don't use labels */
+ if (bSuccess)
+ {
+ lpszBuffer[nRecv++] = '\0';
+ *dwBuffer = nRecv;
+ TRACE(":%u %s\n", nRecv, lpszBuffer);
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
}
else
{
#ifdef SONAME_LIBSSL
- *available = pSSL_pending(connection->ssl_s);
+ long prev_timeout;
+ DWORD nRecv = 0;
+ BOOL success = TRUE;
+
+ prev_timeout = pSSL_CTX_get_timeout(ctx);
+ pSSL_CTX_set_timeout(ctx, RESPONSE_TIMEOUT);
+
+ while (nRecv < *dwBuffer)
+ {
+ int recv = 1;
+ if (!NETCON_recv(connection, &lpszBuffer[nRecv], 1, 0, &recv))
+ {
+ INTERNET_SetLastError(ERROR_CONNECTION_ABORTED);
+ success = FALSE;
+ }
+
+ if (lpszBuffer[nRecv] == '\n')
+ {
+ success = TRUE;
+ break;
+ }
+ if (lpszBuffer[nRecv] != '\r')
+ nRecv++;
+ }
+
+ pSSL_CTX_set_timeout(ctx, prev_timeout);
+ if (success)
+ {
+ lpszBuffer[nRecv++] = '\0';
+ *dwBuffer = nRecv;
+ TRACE("_SSL:%u %s\n", nRecv, lpszBuffer);
+ return TRUE;
+ }
+ return FALSE;
+#else
+ return FALSE;
#endif
}
- return TRUE;
}
+
LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection)
{
#ifdef SONAME_LIBSSL
@@ -637,7 +788,7 @@ DWORD NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value
tv.tv_usec = (value % 1000) * 1000;
result = setsockopt(connection->socketFD, SOL_SOCKET,
- send ? SO_SNDTIMEO : SO_RCVTIMEO, (void*)&tv,
+ send ? SO_SNDTIMEO : SO_RCVTIMEO, &tv,
sizeof(tv));
if (result == -1)
diff --git a/reactos/dll/win32/wininet/urlcache.c b/reactos/dll/win32/wininet/urlcache.c
index f385c7e81cb..b4feba3260c 100644
--- a/reactos/dll/win32/wininet/urlcache.c
+++ b/reactos/dll/win32/wininet/urlcache.c
@@ -692,7 +692,6 @@ static LPURLCACHE_HEADER URLCacheContainer_LockIndex(URLCACHECONTAINER * pContai
* of the memory mapped file */
if (pHeader->dwFileSize != pContainer->file_size)
{
- UnmapViewOfFile( pHeader );
URLCacheContainer_CloseIndex(pContainer);
error = URLCacheContainer_OpenIndex(pContainer);
if (error != ERROR_SUCCESS)
@@ -3624,26 +3623,10 @@ BOOL WINAPI IsUrlCacheEntryExpiredW( LPCWSTR url, DWORD dwFlags, FILETIME* pftLa
/***********************************************************************
* GetDiskInfoA (WININET.@)
*/
-BOOL WINAPI GetDiskInfoA(PCSTR path, PDWORD cluster_size, PDWORDLONG free, PDWORDLONG total)
+DWORD WINAPI GetDiskInfoA(void *p0, void *p1, void *p2, void *p3)
{
- BOOL ret;
- ULARGE_INTEGER bytes_free, bytes_total;
-
- TRACE("(%s, %p, %p, %p)\n", debugstr_a(path), cluster_size, free, total);
-
- if (!path)
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
- if ((ret = GetDiskFreeSpaceExA(path, NULL, &bytes_total, &bytes_free)))
- {
- if (cluster_size) *cluster_size = 1;
- if (free) *free = bytes_free.QuadPart;
- if (total) *total = bytes_total.QuadPart;
- }
- return ret;
+ FIXME("(%p, %p, %p, %p)\n", p0, p1, p2, p3);
+ return 0;
}
/***********************************************************************
@@ -3654,12 +3637,3 @@ DWORD WINAPI RegisterUrlCacheNotification(LPVOID a, DWORD b, DWORD c, DWORD d, D
FIXME("(%p %x %x %x %x %x)\n", a, b, c, d, e, f);
return 0;
}
-
-/***********************************************************************
- * IncrementUrlCacheHeaderData (WININET.@)
- */
-BOOL WINAPI IncrementUrlCacheHeaderData(DWORD index, LPDWORD data)
-{
- FIXME("(%u, %p)\n", index, data);
- return FALSE;
-}
diff --git a/reactos/dll/win32/wininet/utility.c b/reactos/dll/win32/wininet/utility.c
index b68cf8d4a57..b0d9c9c91c6 100644
--- a/reactos/dll/win32/wininet/utility.c
+++ b/reactos/dll/win32/wininet/utility.c
@@ -25,10 +25,6 @@
#include "config.h"
#include "wine/port.h"
-#if defined(__MINGW32__) || defined (_MSC_VER)
-#include
-#endif
-
#include
#include
#include
@@ -44,8 +40,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(wininet);
-#ifndef HAVE_GETADDRINFO
-
/* critical section to protect non-reentrant gethostbyname() */
static CRITICAL_SECTION cs_gethostbyname;
static CRITICAL_SECTION_DEBUG critsect_debug =
@@ -56,8 +50,6 @@ static CRITICAL_SECTION_DEBUG critsect_debug =
};
static CRITICAL_SECTION cs_gethostbyname = { &critsect_debug, -1, 0, 0, 0, 0 };
-#endif
-
#define TIME_STRING_LEN 30
time_t ConvertTimeString(LPCWSTR asctime)
@@ -150,12 +142,7 @@ BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort,
WCHAR *found;
char *name;
int len, sz;
-#ifdef HAVE_GETADDRINFO
- struct addrinfo *res, hints;
- int ret;
-#else
struct hostent *phe;
-#endif
TRACE("%s\n", debugstr_w(lpszServerName));
@@ -171,45 +158,27 @@ BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort,
len = strlenW(lpszServerName);
sz = WideCharToMultiByte( CP_UNIXCP, 0, lpszServerName, len, NULL, 0, NULL, NULL );
- if (!(name = HeapAlloc( GetProcessHeap(), 0, sz + 1 ))) return FALSE;
+ name = HeapAlloc(GetProcessHeap(), 0, sz+1);
WideCharToMultiByte( CP_UNIXCP, 0, lpszServerName, len, name, sz, NULL, NULL );
name[sz] = 0;
-#ifdef HAVE_GETADDRINFO
- memset( &hints, 0, sizeof(struct addrinfo) );
- hints.ai_family = AF_INET;
-
- ret = getaddrinfo( name, NULL, &hints, &res );
- HeapFree( GetProcessHeap(), 0, name );
- if (ret != 0)
- {
- TRACE("failed to get address of %s (%s)\n", debugstr_w(lpszServerName), gai_strerror(ret));
- return FALSE;
- }
- memset( psa, 0, sizeof(struct sockaddr_in) );
- memcpy( &psa->sin_addr, &((struct sockaddr_in *)res->ai_addr)->sin_addr, sizeof(struct in_addr) );
- psa->sin_family = res->ai_family;
- psa->sin_port = htons(nServerPort);
-
- freeaddrinfo( res );
-#else
EnterCriticalSection( &cs_gethostbyname );
phe = gethostbyname(name);
HeapFree( GetProcessHeap(), 0, name );
if (NULL == phe)
{
- TRACE("failed to get address of %s (%d)\n", debugstr_w(lpszServerName), h_errno);
+ TRACE("Failed to get hostname: (%s)\n", debugstr_w(lpszServerName) );
LeaveCriticalSection( &cs_gethostbyname );
return FALSE;
}
+
memset(psa,0,sizeof(struct sockaddr_in));
memcpy((char *)&psa->sin_addr, phe->h_addr, phe->h_length);
psa->sin_family = phe->h_addrtype;
psa->sin_port = htons(nServerPort);
LeaveCriticalSection( &cs_gethostbyname );
-#endif
return TRUE;
}
diff --git a/reactos/dll/win32/wininet/wininet.rbuild b/reactos/dll/win32/wininet/wininet.rbuild
index e2a96c941f1..cf0064396ea 100644
--- a/reactos/dll/win32/wininet/wininet.rbuild
+++ b/reactos/dll/win32/wininet/wininet.rbuild
@@ -18,7 +18,6 @@
secur32
crypt32
ws2_32
- pseh
cookie.c
dialogs.c
ftp.c
diff --git a/reactos/dll/win32/wininet/wininet.spec b/reactos/dll/win32/wininet/wininet.spec
index d5995eb3cc3..dfbc38c02fc 100644
--- a/reactos/dll/win32/wininet/wininet.spec
+++ b/reactos/dll/win32/wininet/wininet.spec
@@ -1,5 +1,5 @@
101 stub -noname DoConnectoidsExist
-102 stdcall -noname GetDiskInfoA(str ptr ptr ptr)
+102 stub -noname GetDiskInfoA
103 stub -noname PerformOperationOverUrlCacheA
104 stub -noname HttpCheckDavComplianceA
105 stub -noname HttpCheckDavComplianceW
@@ -9,7 +9,7 @@
111 stub -noname ExportCookieFileW
112 stub -noname IsProfilesEnabled
116 stub -noname IsDomainlegalCookieDomainA
-117 stdcall -noname IsDomainLegalCookieDomainW(wstr wstr)
+117 stub -noname IsDomainLegalCookieDomainW
118 stub -noname FindP3PPolicySymbol
120 stub -noname MapResourceToPolicy
121 stub -noname GetP3PPolicy
@@ -109,7 +109,7 @@
@ stdcall HttpSendRequestExA(long ptr ptr long long)
@ stdcall HttpSendRequestExW(long ptr ptr long long)
@ stdcall HttpSendRequestW(ptr wstr long ptr long)
-@ stdcall IncrementUrlCacheHeaderData(long ptr)
+@ stub IncrementUrlCacheHeaderData
@ stub InternetAlgIdToStringA
@ stub InternetAlgIdToStringW
@ stdcall InternetAttemptConnect(long)
@@ -213,10 +213,10 @@
@ stdcall IsUrlCacheEntryExpiredW(wstr long ptr)
@ stub LoadUrlCacheContent
@ stub ParseX509EncodedCertificateForListBoxEntry
-@ stdcall PrivacyGetZonePreferenceW(long long ptr ptr ptr)
-@ stdcall PrivacySetZonePreferenceW(long long long wstr)
+@ stub PrivacyGetZonePreferenceW # (long long ptr ptr ptr)
+@ stub PrivacySetZonePreferenceW # (long long long wstr)
@ stdcall ReadUrlCacheEntryStream(ptr long ptr ptr long)
-@ stdcall RegisterUrlCacheNotification(ptr long long long long long)
+@ stub RegisterUrlCacheNotification
@ stdcall ResumeSuspendedDownload(long long)
@ stdcall RetrieveUrlCacheEntryFileA(str ptr ptr long)
@ stdcall RetrieveUrlCacheEntryFileW(wstr ptr ptr long)
diff --git a/reactos/dll/win32/ws2_32/include/upcall.h b/reactos/dll/win32/ws2_32/include/upcall.h
index 3fe222de0e9..16ec65ad58b 100644
--- a/reactos/dll/win32/ws2_32/include/upcall.h
+++ b/reactos/dll/win32/ws2_32/include/upcall.h
@@ -37,7 +37,7 @@ WPUCreateSocketHandle(
IN DWORD dwContext,
OUT LPINT lpErrno);
-SOCKET
+int
WSPAPI
WPUFDIsSet(
IN SOCKET s,
diff --git a/reactos/dll/win32/ws2_32/misc/dllmain.c b/reactos/dll/win32/ws2_32/misc/dllmain.c
index 1a3213f18af..6eb1f9f4431 100644
--- a/reactos/dll/win32/ws2_32/misc/dllmain.c
+++ b/reactos/dll/win32/ws2_32/misc/dllmain.c
@@ -885,11 +885,6 @@ DllMain(HANDLE hInstDll,
case DLL_PROCESS_DETACH:
{
- p = NtCurrentTeb()->WinSockData;
-
- if (p)
- HeapFree(GlobalHeap, 0, p);
-
DestroyCatalog();
FreeProviderHandleTable();
diff --git a/reactos/dll/win32/ws2_32/misc/stubs.c b/reactos/dll/win32/ws2_32/misc/stubs.c
index 2402ae557d9..c8c3b08c14d 100644
--- a/reactos/dll/win32/ws2_32/misc/stubs.c
+++ b/reactos/dll/win32/ws2_32/misc/stubs.c
@@ -510,10 +510,33 @@ WSAHtons(IN SOCKET s,
IN USHORT hostshort,
OUT USHORT FAR* lpnetshort)
{
- UNIMPLEMENTED
+ if (!WSAINITIALIZED)
+ {
+ WSASetLastError(WSANOTINITIALISED);
+ return SOCKET_ERROR;
+ }
- WSASetLastError(WSASYSCALLFAILURE);
- return SOCKET_ERROR;
+ PCATALOG_ENTRY provider;
+ if (!ReferenceProviderByHandle((HANDLE)s, &provider))
+ {
+ WSASetLastError(WSAENOTSOCK);
+ return SOCKET_ERROR;
+ }
+
+ switch (provider->ProtocolInfo.iNetworkByteOrder)
+ {
+ case BIGENDIAN:
+ *lpnetshort = htons(hostshort);
+ break;
+ case LITTLEENDIAN:
+#ifdef LE
+ *lpnetshort = hostshort;
+#else
+ *lpnetshort = (((hostshort & 0xFF00) >> 8) | ((hostshort & 0x00FF) << 8));
+#endif
+ break;
+ }
+ return 0;
}
@@ -576,10 +599,33 @@ WSANtohs(IN SOCKET s,
IN USHORT netshort,
OUT USHORT FAR* lphostshort)
{
- UNIMPLEMENTED
+ if (!WSAINITIALIZED)
+ {
+ WSASetLastError(WSANOTINITIALISED);
+ return SOCKET_ERROR;
+ }
- WSASetLastError(WSASYSCALLFAILURE);
- return SOCKET_ERROR;
+ PCATALOG_ENTRY provider;
+ if (!ReferenceProviderByHandle((HANDLE)s, &provider))
+ {
+ WSASetLastError(WSAENOTSOCK);
+ return SOCKET_ERROR;
+ }
+
+ switch (provider->ProtocolInfo.iNetworkByteOrder)
+ {
+ case BIGENDIAN:
+ *lphostshort = ntohs(netshort);
+ break;
+ case LITTLEENDIAN:
+#ifdef LE
+ *lphostshort = netshort;
+#else
+ *lphostshort = (((netshort & 0xFF00) >> 8) | ((netshort & 0x00FF) << 8));
+#endif
+ break;
+ }
+ return 0;
}
@@ -729,8 +775,8 @@ WSCGetProviderPath(IN LPGUID lpProviderId,
*/
INT
EXPORT
-WSCInstallProvider(IN CONST LPGUID lpProviderId,
- IN CONST LPWSTR lpszProviderDllPath,
+WSCInstallProvider(IN LPGUID lpProviderId,
+ IN CONST WCHAR* lpszProviderDllPath,
IN CONST LPWSAPROTOCOL_INFOW lpProtocolInfoList,
IN DWORD dwNumberOfEntries,
OUT LPINT lpErrno)
diff --git a/reactos/dll/win32/ws2_32/misc/upcall.c b/reactos/dll/win32/ws2_32/misc/upcall.c
index dc358cae5b8..3ba3b410431 100644
--- a/reactos/dll/win32/ws2_32/misc/upcall.c
+++ b/reactos/dll/win32/ws2_32/misc/upcall.c
@@ -84,7 +84,7 @@ WPUCreateSocketHandle(IN DWORD dwCatalogEntryId,
/*
* @unimplemented
*/
-SOCKET
+int
WSPAPI
WPUFDIsSet(IN SOCKET s,
IN LPFD_SET set)
diff --git a/reactos/dll/win32/ws2_32_new/inc/ws2_32.h b/reactos/dll/win32/ws2_32_new/inc/ws2_32.h
index ca7b53ac278..4dd0944dc99 100644
--- a/reactos/dll/win32/ws2_32_new/inc/ws2_32.h
+++ b/reactos/dll/win32/ws2_32_new/inc/ws2_32.h
@@ -21,8 +21,8 @@
/* PSDK and NDK Headers */
#include
-#include
-#include
+#include
+#include
#include
#include
diff --git a/reactos/dll/win32/ws2_32_new/src/dthread.c b/reactos/dll/win32/ws2_32_new/src/dthread.c
index 1534f8d4026..8349552abf7 100644
--- a/reactos/dll/win32/ws2_32_new/src/dthread.c
+++ b/reactos/dll/win32/ws2_32_new/src/dthread.c
@@ -66,7 +66,7 @@ WsThreadSetBlockingHook(IN PWSTHREAD Thread,
FARPROC OldHook = Thread->BlockingHook;
/* Check if we're resetting to our default hook */
- if (BlockingHook == WsThreadDefaultBlockingHook)
+ if (BlockingHook == (FARPROC)WsThreadDefaultBlockingHook)
{
/* Clear out the blocking callback */
Thread->BlockingCallback = NULL;
@@ -87,7 +87,7 @@ WSAAPI
WsThreadUnhookBlockingHook(IN PWSTHREAD Thread)
{
/* Reset the hook to the default, and remove the callback */
- Thread->BlockingHook = WsThreadDefaultBlockingHook;
+ Thread->BlockingHook = (FARPROC)WsThreadDefaultBlockingHook;
Thread->BlockingCallback = NULL;
/* Return success */
@@ -143,7 +143,7 @@ WsThreadAllocate(VOID)
Thread = HeapAlloc(WsSockHeap, HEAP_ZERO_MEMORY, sizeof(*Thread));
/* Set non-zero data */
- Thread->BlockingHook = WsThreadDefaultBlockingHook;
+ Thread->BlockingHook = (FARPROC)WsThreadDefaultBlockingHook;
/* Return it */
return Thread;
diff --git a/reactos/dll/win32/ws2_32_new/src/getproto.c b/reactos/dll/win32/ws2_32_new/src/getproto.c
index e4a06cca1a4..3fe8f6b5525 100644
--- a/reactos/dll/win32/ws2_32_new/src/getproto.c
+++ b/reactos/dll/win32/ws2_32_new/src/getproto.c
@@ -40,7 +40,7 @@ GetProtoOpenNetworkDatabase(PCHAR Name)
"DatabasePath",
NULL,
&RegType,
- DatabasePath,
+ (LPBYTE)DatabasePath,
&RegSize);
/* Close the key */
diff --git a/reactos/dll/win32/ws2_32_new/src/nscatent.c b/reactos/dll/win32/ws2_32_new/src/nscatent.c
index 190f7747e70..13794a7440a 100644
--- a/reactos/dll/win32/ws2_32_new/src/nscatent.c
+++ b/reactos/dll/win32/ws2_32_new/src/nscatent.c
@@ -72,7 +72,7 @@ WsNcEntryInitializeFromRegistry(IN PNSCATALOG_ENTRY CatalogEntry,
ULONG RegSize = MAX_PATH;
/* Convert to a 00000xxx string */
- sprintf(CatalogEntryName, "%0""12""i", UniqueId);
+ sprintf(CatalogEntryName, "%0""12""i", (int)UniqueId);
/* Open the Entry */
Return = RegOpenKeyEx(ParentKey,
diff --git a/reactos/dll/win32/ws2_32_new/src/select.c b/reactos/dll/win32/ws2_32_new/src/select.c
index 22b9a726203..79680b715d9 100644
--- a/reactos/dll/win32/ws2_32_new/src/select.c
+++ b/reactos/dll/win32/ws2_32_new/src/select.c
@@ -83,7 +83,7 @@ select(IN INT s,
readfds,
writefds,
exceptfds,
- timeout,
+ (struct timeval *)timeout,
&ErrorCode);
/* Deference the Socket Context */
WsSockDereference(Socket);
diff --git a/reactos/dll/win32/ws2_32_new/src/wsautil.c b/reactos/dll/win32/ws2_32_new/src/wsautil.c
index 9881d97a9b4..9372c8306d0 100644
--- a/reactos/dll/win32/ws2_32_new/src/wsautil.c
+++ b/reactos/dll/win32/ws2_32_new/src/wsautil.c
@@ -182,7 +182,7 @@ WsSetupCatalogProtection(IN HKEY CatalogKey,
}
/* Try to open it for writing */
- sprintf(KeyBuffer, "%08.8lX", NewUniqueId);
+ sprintf(KeyBuffer, "%8.8lX", NewUniqueId);
ErrorCode = RegOpenKeyEx(CatalogKey,
KeyBuffer,
0,
diff --git a/reactos/dll/win32/ws2_32_new/ws2_32.def b/reactos/dll/win32/ws2_32_new/ws2_32.def
deleted file mode 100644
index b04ec26f37f..00000000000
--- a/reactos/dll/win32/ws2_32_new/ws2_32.def
+++ /dev/null
@@ -1,124 +0,0 @@
-; WS2_32.DLL - Windows Sockets 2 DLL
-
-LIBRARY ws2_32.dll
-
-EXPORTS
-WEP@0 @500
-WPUCompleteOverlappedRequest@20 @28
-WSAAccept@20 @29
-WSAAddressToStringA@20 @30
-WSAAddressToStringW@20 @31
-WSAAsyncGetHostByAddr@28 @102
-WSAAsyncGetHostByNam@20e @103
-WSAAsyncGetProtoByName@20 @105
-WSAAsyncGetProtoByNumber@20 @104
-WSAAsyncGetServByName@24 @107
-WSAAsyncGetServByPort@24 @106
-WSAAsyncSelect@16 @101
-WSACancelAsyncRequest@4 @108
-WSACancelBlockingCall@0 @113
-WSACleanup@0 @116
-WSACloseEvent@4 @32
-WSAConnect@28 @33
-WSACreateEvent@0 @34
-WSADuplicateSocketA@12 @35
-WSADuplicateSocketW@12 @36
-WSAEnumNameSpaceProvidersA@8 @37
-WSAEnumNameSpaceProvidersW@8 @38
-WSAEnumNetworkEvents@12 @39
-WSAEnumProtocolsA@12 @40
-WSAEnumProtocolsW@12 @41
-WSAEventSelect @42
-WSAGetLastError @111
-WSAGetOverlappedResult @43
-WSAGetQOSByName @44
-WSAGetServiceClassInfoA @45
-WSAGetServiceClassInfoW @46
-WSAGetServiceClassNameByClassIdA @47
-WSAGetServiceClassNameByClassIdW @48
-WSAHtonl @49
-WSAHtons @50
-WSAInstallServiceClassA @58
-WSAInstallServiceClassW @59
-WSAIoctl @60
-WSAIsBlocking @114
-WSAJoinLeaf @61
-WSALookupServiceBeginA @62
-WSALookupServiceBeginW @63
-WSALookupServiceEnd @64
-WSALookupServiceNextA @65
-WSALookupServiceNextW @66
-WSANSPIoctl @67
-WSANtohl @68
-WSANtohs @69
-WSAProviderConfigChange @70
-WSARecv @71
-WSARecvDisconnect @72
-WSARecvFrom @73
-WSARemoveServiceClass @74
-WSAResetEvent @75
-WSASend @76
-WSASendDisconnect @77
-WSASendTo @78
-WSASetBlockingHook @109
-WSASetEvent @79
-WSASetLastError @112
-WSASetServiceA @80
-WSASetServiceW @81
-WSASocketA @82
-WSASocketW @83
-WSAStartup @115
-WSAStringToAddressA @84
-WSAStringToAddressW @85
-WSAUnhookBlockingHook @110
-WSAWaitForMultipleEvents @86
-WSApSetPostRoutine @26
-FreeAddrInfoW=freeaddrinfo @27
-WSCDeinstallProvider @87
-WSCEnableNSProvider @88
-WSCEnumProtocols @89
-WSCGetProviderPath @90
-WSCInstallNameSpace @91
-WSCInstallProvider @92
-WSCUnInstallNameSpace @93
-WSCUpdateProvider @94
-WSCWriteNameSpaceOrder @95
-WSCWriteProviderOrder @96
-__WSAFDIsSet @151
-accept @1
-bind @2
-closesocket @3
-connect @4
-freeaddrinfo @97
-getaddrinfo @98
-gethostbyaddr @51
-gethostbyname @52
-gethostname @57
-getnameinfo @99
-getpeername @5
-getprotobyname @53
-getprotobynumber @54
-getservbyname @55
-getservbyport @56
-getsockname @6
-getsockopt @7
-htonl @8
-htons @9
-inet_addr @11
-inet_ntoa @12
-ioctlsocket @10
-listen @13
-ntohl @14
-ntohs @15
-recv @16
-recvfrom @17
-select @18
-send @19
-sendto @20
-setsockopt @21
-shutdown @22
-socket @23
-GetAddrInfoW @24
-GetNameInfoW @25
-
-; EOF
diff --git a/reactos/dll/win32/ws2_32_new/ws2_32.rbuild b/reactos/dll/win32/ws2_32_new/ws2_32.rbuild
index 23713177b5f..644114de826 100644
--- a/reactos/dll/win32/ws2_32_new/ws2_32.rbuild
+++ b/reactos/dll/win32/ws2_32_new/ws2_32.rbuild
@@ -1,7 +1,6 @@
-
+
- include
- include/reactos/wine
+ inc
wine
ntdll
@@ -9,6 +8,7 @@
user32
advapi32
dnsapi
+ ws2help
addrconv.c
addrinfo.c
diff --git a/reactos/dll/win32/ws2_32_new/ws2_32.spec b/reactos/dll/win32/ws2_32_new/ws2_32.spec
new file mode 100644
index 00000000000..e0e14b7e68e
--- /dev/null
+++ b/reactos/dll/win32/ws2_32_new/ws2_32.spec
@@ -0,0 +1,117 @@
+500 stdcall WEP()
+@ stdcall WPUCompleteOverlappedRequest(long ptr long long ptr)
+@ stdcall WSAAccept(long ptr ptr ptr long)
+@ stdcall WSAAddressToStringA(ptr long ptr ptr ptr)
+@ stdcall WSAAddressToStringW(ptr long ptr ptr ptr)
+102 stdcall WSAAsyncGetHostByAddr(long long ptr long long ptr long)
+103 stdcall WSAAsyncGetHostByName(long long str ptr long)
+105 stdcall WSAAsyncGetProtoByName(long long str ptr long)
+104 stdcall WSAAsyncGetProtoByNumber(long long long ptr long)
+107 stdcall WSAAsyncGetServByName(long long str str ptr long)
+106 stdcall WSAAsyncGetServByPort(long long long str ptr long)
+101 stdcall WSAAsyncSelect(long long long long)
+108 stdcall WSACancelAsyncRequest(long)
+113 stdcall WSACancelBlockingCall()
+116 stdcall WSACleanup()
+@ stdcall WSACloseEvent(long)
+@ stdcall WSAConnect(long ptr long ptr ptr ptr ptr)
+@ stdcall WSACreateEvent ()
+@ stdcall WSADuplicateSocketA(long long ptr)
+@ stdcall WSADuplicateSocketW(long long ptr)
+@ stdcall WSAEnumNameSpaceProvidersA(ptr ptr)
+@ stdcall WSAEnumNameSpaceProvidersW(ptr ptr)
+@ stdcall WSAEnumNetworkEvents(long long ptr)
+@ stdcall WSAEnumProtocolsA(ptr ptr ptr)
+@ stdcall WSAEnumProtocolsW(ptr ptr ptr)
+@ stdcall WSAEventSelect(long long long)
+111 stdcall WSAGetLastError()
+@ stdcall WSAGetOverlappedResult(long ptr ptr long ptr)
+@ stdcall WSAGetQOSByName(long ptr ptr)
+@ stdcall WSAGetServiceClassInfoA(ptr ptr ptr ptr)
+@ stdcall WSAGetServiceClassInfoW(ptr ptr ptr ptr)
+@ stdcall WSAGetServiceClassNameByClassIdA(ptr ptr ptr)
+@ stdcall WSAGetServiceClassNameByClassIdW(ptr ptr ptr)
+@ stdcall WSAHtonl(long long ptr)
+@ stdcall WSAHtons(long long ptr)
+@ stdcall WSAInstallServiceClassA(ptr)
+@ stdcall WSAInstallServiceClassW(ptr)
+@ stdcall WSAIoctl(long long ptr long ptr long ptr ptr ptr)
+114 stdcall WSAIsBlocking()
+@ stdcall WSAJoinLeaf(long ptr long ptr ptr ptr ptr long)
+@ stdcall WSALookupServiceBeginA(ptr long ptr)
+@ stdcall WSALookupServiceBeginW(ptr long ptr)
+@ stdcall WSALookupServiceEnd(long)
+@ stdcall WSALookupServiceNextA(long long ptr ptr)
+@ stdcall WSALookupServiceNextW(long long ptr ptr)
+@ stdcall WSANSPIoctl(long long ptr long ptr long ptr ptr)
+@ stdcall WSANtohl(long long ptr)
+@ stdcall WSANtohs(long long ptr)
+@ stdcall WSAProviderConfigChange(ptr ptr ptr)
+@ stdcall WSARecv(long ptr long ptr ptr ptr ptr)
+@ stdcall WSARecvDisconnect(long ptr)
+@ stdcall WSARecvFrom(long ptr long ptr ptr ptr ptr ptr ptr)
+@ stdcall WSARemoveServiceClass(ptr)
+@ stdcall WSAResetEvent(long)
+@ stdcall WSASend(long ptr long ptr long ptr ptr)
+@ stdcall WSASendDisconnect(long ptr)
+@ stdcall WSASendTo(long ptr long ptr long ptr long ptr ptr)
+109 stdcall WSASetBlockingHook(ptr)
+@ stdcall WSASetEvent(long)
+112 stdcall WSASetLastError(long)
+@ stdcall WSASetServiceA(ptr long long)
+@ stdcall WSASetServiceW(ptr long long)
+@ stdcall WSASocketA(long long long ptr long long)
+@ stdcall WSASocketW(long long long ptr long long)
+115 stdcall WSAStartup(long ptr)
+@ stdcall WSAStringToAddressA(str long ptr ptr ptr)
+@ stdcall WSAStringToAddressW(wstr long ptr ptr ptr)
+110 stdcall WSAUnhookBlockingHook()
+@ stdcall WSAWaitForMultipleEvents(long ptr long long long)
+@ stdcall WSApSetPostRoutine(ptr)
+@ stdcall FreeAddrInfoW(ptr) freeaddrinfo
+@ stdcall WSCDeinstallProvider(ptr ptr)
+@ stdcall WSCEnableNSProvider(ptr long)
+@ stdcall WSCEnumProtocols(ptr ptr ptr ptr)
+@ stdcall WSCGetProviderPath(ptr ptr ptr ptr)
+@ stdcall WSCInstallNameSpace(wstr wstr long long ptr)
+@ stdcall WSCInstallProvider(ptr wstr ptr long ptr)
+@ stdcall WSCUnInstallNameSpace(ptr)
+@ stdcall WSCUpdateProvider(ptr ptr ptr long ptr)
+@ stdcall WSCWriteNameSpaceOrder(ptr long)
+@ stdcall WSCWriteProviderOrder(ptr long)
+151 stdcall __WSAFDIsSet(long ptr)
+1 stdcall accept(long ptr ptr)
+2 stdcall bind(long ptr long)
+3 stdcall closesocket(long)
+4 stdcall connect(long ptr long)
+@ stdcall freeaddrinfo(ptr)
+@ stdcall getaddrinfo(str str ptr ptr)
+51 stdcall gethostbyaddr(ptr long long)
+52 stdcall gethostbyname(str)
+57 stdcall gethostname(ptr long)
+@ stdcall getnameinfo(ptr long ptr long ptr long long)
+5 stdcall getpeername(long ptr ptr)
+53 stdcall getprotobyname(str)
+54 stdcall getprotobynumber(long)
+55 stdcall getservbyname(str str)
+56 stdcall getservbyport(long str)
+6 stdcall getsockname(long ptr ptr)
+7 stdcall getsockopt(long long long ptr ptr)
+8 stdcall htonl(long)
+9 stdcall htons(long)
+11 stdcall inet_addr(str)
+12 stdcall inet_ntoa(ptr)
+10 stdcall ioctlsocket(long long ptr)
+13 stdcall listen(long long)
+14 stdcall ntohl(long)
+15 stdcall ntohs(long)
+16 stdcall recv(long ptr long long)
+17 stdcall recvfrom(long ptr long long ptr ptr)
+18 stdcall select(long ptr ptr ptr ptr)
+19 stdcall send(long ptr long long)
+20 stdcall sendto(long ptr long long ptr long)
+21 stdcall setsockopt(long long long ptr long)
+22 stdcall shutdown(long long)
+23 stdcall socket(long long long)
+@ stdcall GetAddrInfoW(wstr wstr ptr ptr)
+@ stdcall GetNameInfoW(ptr long wstr long wstr long long)
diff --git a/reactos/dll/win32/ws2help/apc.c b/reactos/dll/win32/ws2help/apc.c
new file mode 100644
index 00000000000..0a05a775ec6
--- /dev/null
+++ b/reactos/dll/win32/ws2help/apc.c
@@ -0,0 +1,152 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS WinSock 2 DLL
+ * FILE: include/ws2_32.h
+ * PURPOSE: WinSock 2 DLL header
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "precomp.h"
+
+/* DATA **********************************************************************/
+
+#define APCH (HANDLE)'SOR '
+
+/* FUNCTIONS *****************************************************************/
+
+DWORD
+WINAPI
+WahOpenApcHelper(OUT PHANDLE ApcHelperHandle)
+{
+ DWORD ErrorCode;
+
+ /* Enter the prolog, make sure we're initialized */
+ ErrorCode = WS2HELP_PROLOG();
+ if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+ /* Validate handle */
+ if (!ApcHelperHandle) return ERROR_INVALID_PARAMETER;
+
+ /*
+ * Return a bogus handle ("ROS")
+ * Historical note:(MS sends "CKM", which probably stands for "Keith Moore"
+ * (KM), one of the core architects of Winsock 2.2 from Microsoft.
+ */
+ *ApcHelperHandle = APCH;
+ return ERROR_SUCCESS;
+}
+
+DWORD
+WINAPI
+WahCloseApcHelper(IN HANDLE ApcHelperHandle)
+{
+ DWORD ErrorCode;
+
+ /* Enter the prolog, make sure we're initialized */
+ ErrorCode = WS2HELP_PROLOG();
+ if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+ /* Validate handle */
+ if (ApcHelperHandle != APCH) return ERROR_INVALID_PARAMETER;
+
+ /* return */
+ return ERROR_SUCCESS;
+}
+
+DWORD
+WINAPI
+WahCloseThread(IN HANDLE ApcHelperHandle,
+ IN LPWSATHREADID ThreadId)
+{
+ DWORD ErrorCode;
+
+ /* Enter the prolog, make sure we're initialized */
+ ErrorCode = WS2HELP_PROLOG();
+ if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+ /* Validate handles */
+ if ((ApcHelperHandle != APCH) || (!ThreadId) || (!ThreadId->ThreadHandle))
+ {
+ /* Invalid helper/thread handles */
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ /* Close the thread handle */
+ if (CloseHandle(ThreadId->ThreadHandle))
+ {
+ /* Clear the sturcture */
+ ThreadId->ThreadHandle = NULL;
+ ThreadId->Reserved = 0;
+ return NO_ERROR;
+ }
+
+ /* return */
+ return GetLastError();
+}
+
+INT
+WINAPI
+WahQueueUserApc(IN HANDLE ApcHelperHandle,
+ IN LPWSATHREADID ThreadId,
+ IN LPWSAUSERAPC ApcRoutine,
+ IN PVOID ApcContext OPTIONAL)
+{
+ /* Validate params */
+ if ((ApcHelperHandle != APCH) ||
+ (!ThreadId) ||
+ (!ThreadId->ThreadHandle) ||
+ (!ApcRoutine))
+ {
+ /* Invalid parameters */
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ /* Queue the APC */
+ if (QueueUserAPC(ApcRoutine, ThreadId->ThreadHandle, (ULONG_PTR)ApcContext))
+ {
+ /* Return success */
+ return ERROR_SUCCESS;
+ }
+
+ /* Fail */
+ return GetLastError();
+}
+
+DWORD
+WINAPI
+WahOpenCurrentThread(IN HANDLE ApcHelperHandle,
+ OUT LPWSATHREADID ThreadId)
+{
+ HANDLE ProcessHandle, ThreadHandle;
+
+ /* Validate params */
+ if ((ApcHelperHandle != APCH) || (!ThreadId))
+ {
+ /* Invalid parameters */
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ /* Get the process/thread handles */
+ ProcessHandle = GetCurrentProcess();
+ ThreadHandle = GetCurrentThread();
+
+ /* Duplicate the handle */
+ if (DuplicateHandle(ProcessHandle,
+ ThreadHandle,
+ ProcessHandle,
+ &ThreadId->ThreadHandle,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS))
+ {
+ /* Save the thread handle and return */
+ ThreadId->Reserved = (DWORD_PTR)ThreadHandle;
+ return ERROR_SUCCESS;
+ }
+
+ /* Fail */
+ return GetLastError();
+}
+
+/* EOF */
diff --git a/reactos/dll/win32/ws2help/context.c b/reactos/dll/win32/ws2help/context.c
new file mode 100644
index 00000000000..7e4037fc0e9
--- /dev/null
+++ b/reactos/dll/win32/ws2help/context.c
@@ -0,0 +1,601 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS WinSock 2 DLL
+ * FILE: include/ws2_32.h
+ * PURPOSE: WinSock 2 DLL header
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "precomp.h"
+
+/* DATA **********************************************************************/
+
+CRITICAL_SECTION WshHandleTableLock;
+HANDLE ghWriterEvent;
+DWORD gdwSpinCount = 0;
+DWORD gHandleToIndexMask;
+
+CONST DWORD SockPrimes[] =
+{
+ 31, 61, 127, 257, 521, 1031, 2053,
+ 4099, 8191, 16381, 32749, 65537, 131071, 261983,
+ -1
+};
+
+typedef volatile LONG VLONG;
+typedef VLONG *PVLONG;
+
+/* DEFINES *******************************************************************/
+
+/* Yes, we "abuse" the lower bits */
+#define WSH_SEARCH_TABLE_FROM_HANDLE(h, t) \
+ (&t->SearchTables[(((ULONG_PTR)h >> 2) & t->Mask)])
+
+#define WSH_HASH_FROM_HANDLE(h, hs) \
+ (hs->Handles[((ULONG_PTR)h % hs->Size)])
+
+#define AcquireWriteLock(t) \
+ EnterCriticalSection(&t->Lock);
+
+#define ReleaseWriteLock(t) \
+ LeaveCriticalSection(&t->Lock);
+
+/* FUNCTIONS *****************************************************************/
+
+VOID
+static __inline
+AcquireReadLock(IN PWAH_SEARCH_TABLE Table,
+ IN PVLONG *Count)
+{
+ LONG OldCount;
+
+ /* Start acquire loop */
+ do
+ {
+ /* Write and save count value */
+ *Count = Table->CurrentCount;
+ OldCount = **Count;
+
+ /* Check if it's valid and try to increment it */
+ if ((OldCount > 0) && (InterlockedCompareExchange(*Count,
+ OldCount + 1,
+ OldCount) == OldCount))
+ {
+ /* Everything went OK */
+ break;
+ }
+ } while (TRUE);
+}
+
+VOID
+static __inline
+ReleaseReadLock(IN PWAH_SEARCH_TABLE Table,
+ IN PVLONG Count)
+{
+ /* Decrement the count. If we went below 0, someone is waiting... */
+ if (InterlockedDecrement(Count) < 0)
+ {
+ /* We use pulse since this is a shared event */
+ PulseEvent(ghWriterEvent);
+ }
+}
+
+VOID
+WINAPI
+DoWaitForReaders(IN PWAH_SEARCH_TABLE Table,
+ IN PVLONG Counter)
+{
+ HANDLE EventHandle;
+
+ /* Do a context switch */
+ SwitchToThread();
+
+ /* Check if the counter is above one */
+ if (*Counter > 0)
+ {
+ /*
+ * This shouldn't happen unless priorities are messed up. Do a wait so
+ * that the threads with lower priority will get their chance now.
+ */
+ if (!ghWriterEvent)
+ {
+ /* We don't even have an event! Allocate one manually... */
+ EventHandle = CreateEvent(NULL, TRUE, FALSE, NULL);
+ if (EventHandle)
+ {
+ /* Save the event handle atomically */
+ if ((InterlockedCompareExchangePointer((PVOID*)&ghWriterEvent,
+ EventHandle,
+ NULL)))
+ {
+ /* Someone beat us to it, close ours */
+ CloseHandle(EventHandle);
+ }
+ }
+ else
+ {
+ /* Things couldn't get worse for us. Do a last-resort hack */
+ while (*Counter > 0) Sleep(10);
+ }
+ }
+
+ /*
+ * Our event is ready. Tell the others to signal us by making sure
+ * that the last counter will be -1, notifying the last thread of our
+ * request.
+ */
+ if (InterlockedDecrement(Counter) >= 0)
+ {
+ /* Keep looping */
+ do
+ {
+ /* Wait in tiny bursts, so we can catch the PulseEvent */
+ WaitForSingleObject(ghWriterEvent, 10);
+ } while (*Counter >= 0);
+ }
+ }
+}
+
+VOID
+static __inline
+TryWaitForReaders(IN PWAH_SEARCH_TABLE Table)
+{
+ PVLONG OldCount = Table->CurrentCount;
+ LONG SpinCount;
+
+ /* See which counter is being used */
+ if (OldCount == &Table->Count1)
+ {
+ /* Use counter 2 now */
+ Table->Count2 = 1;
+ Table->CurrentCount = &Table->Count2;
+ }
+ else
+ {
+ /* Use counter 1 now */
+ Table->Count1 = 1;
+ Table->CurrentCount = &Table->Count1;
+ }
+
+ /* Decrease the old count to block new readers */
+ if (InterlockedDecrement(OldCount) > 0)
+ {
+ /* On an MP machine, spin a bit first */
+ if (Table->SpinCount)
+ {
+ /* Get the spincount and loop it */
+ SpinCount = Table->SpinCount;
+ while (*OldCount > 0)
+ {
+ /* Check if the spin failed */
+ if (--SpinCount <= 0) break;
+ }
+ }
+
+ /* Check one last time if someone is still active */
+ if (*OldCount > 0)
+ {
+ /* Yep, we'll have to do a blocking (slow) wait */
+ DoWaitForReaders(Table, OldCount);
+ }
+ }
+}
+
+DWORD
+WINAPI
+WahCreateHandleContextTable(OUT PWAH_HANDLE_TABLE *Table)
+{
+ DWORD ErrorCode;
+ PWAH_HANDLE_TABLE LocalTable;
+ DWORD i;
+
+ /* Enter the prolog, make sure we're initialized */
+ ErrorCode = WS2HELP_PROLOG();
+ if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+ /* Assume NULL */
+ *Table = NULL;
+
+ /* Allocate enough tables */
+ LocalTable = HeapAlloc(GlobalHeap,
+ 0,
+ FIELD_OFFSET(WSH_HANDLE_TABLE,
+ SearchTables[gHandleToIndexMask + 1]));
+
+ /* Make sure it was allocated */
+ if (!LocalTable) return WSA_NOT_ENOUGH_MEMORY;
+
+ /* Set the mask for the table */
+ LocalTable->Mask = gHandleToIndexMask;
+
+ /* Now initialize every table */
+ for (i = 0; i <= gHandleToIndexMask; i++)
+ {
+ /* No hash table yet */
+ LocalTable->SearchTables[i].HashTable = NULL;
+
+ /* Set the current count */
+ LocalTable->SearchTables[i].CurrentCount = &LocalTable->SearchTables[i].Count1;
+
+ /* Initialize the counts */
+ LocalTable->SearchTables[i].Count1 = 1;
+ LocalTable->SearchTables[i].Count2 = 0;
+
+ /* Set expanding state and spin count */
+ LocalTable->SearchTables[i].Expanding = FALSE;
+ LocalTable->SearchTables[i].SpinCount = gdwSpinCount;
+
+ /* Initialize the lock */
+ (VOID)InitializeCriticalSectionAndSpinCount(&LocalTable->
+ SearchTables[i].Lock,
+ gdwSpinCount);
+ }
+
+ /* Return pointer */
+ *Table = LocalTable;
+
+ /* Return success */
+ return ERROR_SUCCESS;
+}
+
+DWORD
+WINAPI
+WahDestroyHandleContextTable(IN PWAH_HANDLE_TABLE Table)
+{
+ DWORD i;
+
+ /* Make sure the table is valid */
+ if (!Table)
+ {
+ /* No valid table */
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ /* Loop each search table */
+ for (i = 0; i <= Table->Mask; i++)
+ {
+ /* Check if there's a table here */
+ if (Table->SearchTables[i].HashTable)
+ {
+ /* Free it */
+ HeapFree(GlobalHeap, 0, Table->SearchTables[i].HashTable);
+ }
+
+ /* Delete the lock */
+ DeleteCriticalSection(&Table->SearchTables[i].Lock);
+ }
+
+ /* Delete the table */
+ HeapFree(GlobalHeap, 0, Table);
+
+ /* Return success */
+ return ERROR_SUCCESS;
+}
+
+BOOL
+WINAPI
+WahEnumerateHandleContexts(IN PWAH_HANDLE_TABLE Table,
+ IN PWAH_HANDLE_ENUMERATE_PROC Callback,
+ IN PVOID Context)
+{
+ DWORD i, j;
+ PWAH_SEARCH_TABLE SearchTable;
+ PWAH_HASH_TABLE HashTable;
+ PWAH_HANDLE Handle;
+ BOOL GoOn = TRUE;
+
+ /* Loop the table */
+ for (i = 0; i <= Table->Mask; i++)
+ {
+ /* Get the Search table */
+ SearchTable = &Table->SearchTables[i];
+
+ /* Lock it */
+ AcquireWriteLock(SearchTable);
+
+ /* Mark us as expanding and wait for everyone */
+ SearchTable->Expanding = TRUE;
+ TryWaitForReaders(SearchTable);
+
+ /* Get the hash table */
+ HashTable = SearchTable->HashTable;
+
+ /* Make sure it exists */
+ if (HashTable)
+ {
+ /* Loop every handle in it */
+ for (j = 0; j < HashTable->Size; j++)
+ {
+ /* Get this handle */
+ Handle = HashTable->Handles[j];
+ if (!Handle) continue;
+
+ /* Call the callback proc */
+ GoOn = Callback(Context, Handle);
+ if (!GoOn) break;
+ }
+ }
+
+ /* Disable the expansion bit and release the lock */
+ SearchTable->Expanding = FALSE;
+ ReleaseWriteLock(SearchTable);
+
+ /* Check again if we should leave */
+ if (!GoOn) break;
+ }
+
+ /* return */
+ return GoOn;
+}
+
+PWAH_HANDLE
+WINAPI
+WahInsertHandleContext(IN PWAH_HANDLE_TABLE Table,
+ IN PWAH_HANDLE Handle)
+{
+ PWAH_HANDLE *HashHandle, OldHandle;
+ PVLONG Count;
+ PWAH_HASH_TABLE HashTable, NewHashTable;
+ DWORD HandleCount, i;
+ PWAH_SEARCH_TABLE SearchTable;
+
+ /* Get the current Search Table */
+ SearchTable = WSH_SEARCH_TABLE_FROM_HANDLE(Handle->Handle, Table);
+
+ /* Start loop */
+ do
+ {
+ /* Get reader lock */
+ AcquireReadLock(SearchTable, &Count);
+
+ /* Get the hash table */
+ HashTable = SearchTable->HashTable;
+
+ /* Make sure we are not expanding, and that the table is there */
+ if (!(SearchTable->Expanding) && (HashTable))
+ {
+ /* Get the hash handle */
+ HashHandle = &WSH_HASH_FROM_HANDLE(Handle->Handle, HashTable);
+
+ /* Do the insert */
+ if (InterlockedCompareExchangePointer((PVOID*)HashHandle,
+ Handle,
+ NULL) == NULL)
+ {
+ /* Success, release the reader lock */
+ ReleaseReadLock(SearchTable, Count);
+
+ /* Save old handle */
+ OldHandle = Handle;
+ break;
+ }
+ }
+
+ /* Release the read lock since we're done with it now */
+ ReleaseReadLock(SearchTable, Count);
+
+ /* We need the writer lock to expand/create the table */
+ AcquireWriteLock(SearchTable);
+
+ /* Mark the table in use */
+ SearchTable->Expanding = TRUE;
+
+ /* Wait for all the readers to finish */
+ TryWaitForReaders(SearchTable);
+
+ /* Start loop */
+ do
+ {
+ /* Get the hash table again */
+ HashTable = SearchTable->HashTable;
+
+ /* Check if exists now */
+ if (HashTable)
+ {
+ /* It does! Do what we wanted to do earlier. Get the hash... */
+ HashHandle = &WSH_HASH_FROM_HANDLE(Handle->Handle, HashTable);
+
+ /* Check if it doesn't exist */
+ if (!(*HashHandle))
+ {
+ /* Write it (no need for interlock, we have the RW lock) */
+ OldHandle = Handle;
+ *HashHandle = Handle;
+ break;
+ }
+ else if ((*HashHandle)->Handle == Handle->Handle)
+ {
+ /* Handle matches, write it (see comment above) */
+ OldHandle = *HashHandle;
+ *HashHandle = Handle;
+ break;
+ }
+
+ /* No go, we need to expand the table. Remember the size now */
+ HandleCount = HashTable->Size;
+ }
+ else
+ {
+ /* Table is empty, we have to create it */
+ HandleCount = 0;
+ }
+
+ExpandTable:
+ /* Find a free prime */
+ for (i = 0; HandleCount >= SockPrimes[i]; i++);
+
+ /* Check if we found one */
+ if (SockPrimes[i] != 0xFFFFFFFF)
+ {
+ /* Use the prime */
+ HandleCount = SockPrimes[i];
+ }
+ else
+ {
+ /* No primes left. Table is quite large, so simply double it */
+ HandleCount *= 2;
+ }
+
+ /* Allocate the table */
+ NewHashTable = HeapAlloc(GlobalHeap,
+ 0,
+ FIELD_OFFSET(WSH_HASH_TABLE,
+ Handles[HandleCount]));
+
+ /* Hopefully we have one now */
+ if (NewHashTable)
+ {
+ /* Set its size */
+ NewHashTable->Size = HandleCount;
+
+ /* Initialize it */
+ RtlZeroMemory(NewHashTable->Handles, HandleCount * sizeof(PVOID));
+
+ /* Insert us first */
+ WSH_HASH_FROM_HANDLE(Handle->Handle, NewHashTable) = Handle;
+
+ /* Now check if our old table had entries in it */
+ if (HashTable)
+ {
+ /* We need to move them */
+ for (i = 0; i < HashTable->Size; i++)
+ {
+ /* Make sure the hash handle exists */
+ if (HashTable->Handles[i])
+ {
+ /* Get it */
+ HashHandle = &WSH_HASH_FROM_HANDLE(HashTable->
+ Handles[i]->Handle,
+ NewHashTable);
+
+ /* Check if it has a value */
+ if (!(*HashHandle))
+ {
+ /* It's empty, so just write the handle */
+ *HashHandle = HashTable->Handles[i];
+ }
+ else
+ {
+ /* Not empty :/... that implies a collision */
+ HeapFree(GlobalHeap, 0, NewHashTable);
+ goto ExpandTable;
+ }
+ }
+ }
+
+ /* Write the new hash table */
+ SearchTable->HashTable = NewHashTable;
+
+ /* Wait for everyone to be done with it, then free it */
+ TryWaitForReaders(SearchTable);
+ HeapFree(GlobalHeap, 0, HashTable);
+ }
+ else
+ {
+ /* It was empty, nothing to worry about */
+ SearchTable->HashTable = NewHashTable;
+ }
+
+ /* Save the old handle */
+ OldHandle = Handle;
+ }
+ else
+ {
+ /* There was no old handle */
+ OldHandle = Handle;
+ }
+ } while (0);
+
+ /* Mark us as free, and release the write lock */
+ SearchTable->Expanding = FALSE;
+ ReleaseWriteLock(SearchTable);
+ break;
+ } while (1);
+
+ /* Return the old handle */
+ return OldHandle;
+}
+
+PWAH_HANDLE
+WINAPI
+WahReferenceContextByHandle(IN PWAH_HANDLE_TABLE Table,
+ IN HANDLE Handle)
+{
+ PWAH_HANDLE HashHandle;
+ PWAH_SEARCH_TABLE SearchTable;
+ PWAH_HASH_TABLE HashTable;
+ PVLONG Count;
+
+ /* Get the current Search Table */
+ SearchTable = WSH_SEARCH_TABLE_FROM_HANDLE(Handle, Table);
+
+ /* Lock it */
+ AcquireReadLock(SearchTable, &Count);
+
+ /* Get the hash table and handle */
+ HashTable = SearchTable->HashTable;
+
+ /* Check if it's valid, and if it's the one we want */
+ if ((HashTable) &&
+ (HashHandle = WSH_HASH_FROM_HANDLE(Handle, HashTable)) &&
+ (HashHandle->Handle == Handle))
+ {
+ /* Reference the handle */
+ InterlockedIncrement(&HashHandle->RefCount);
+ }
+ else
+ {
+ /* Invalid handle */
+ HashHandle = NULL;
+ }
+
+ /* Release the lock */
+ ReleaseReadLock(SearchTable, Count);
+
+ /* Return */
+ return HashHandle;
+}
+
+DWORD
+WINAPI
+WahRemoveHandleContext(IN PWAH_HANDLE_TABLE Table,
+ IN PWAH_HANDLE Handle)
+{
+ PWAH_HANDLE *HashHandle;
+ PWAH_SEARCH_TABLE SearchTable;
+ PWAH_HASH_TABLE HashTable;
+ DWORD ErrorCode = ERROR_SUCCESS;
+
+ /* Get the current Search Table */
+ SearchTable = WSH_SEARCH_TABLE_FROM_HANDLE(Handle->Handle, Table);
+
+ /* Lock it */
+ AcquireWriteLock(SearchTable);
+
+ /* Get the hash table and handle */
+ HashTable = SearchTable->HashTable;
+ HashHandle = &WSH_HASH_FROM_HANDLE(Handle->Handle, HashTable);
+
+ /* Make sure we have a handle, and write the new pointer */
+ if (HashHandle && (InterlockedCompareExchangePointer((PVOID*)HashHandle,
+ NULL,
+ Handle) == Handle))
+ {
+ /* Wait for everyone to be done with it */
+ TryWaitForReaders(SearchTable);
+ }
+ else
+ {
+ /* Invalid handle */
+ ErrorCode = ERROR_INVALID_PARAMETER;
+ }
+
+ /* Release the lock */
+ ReleaseWriteLock(SearchTable);
+
+ /* Return */
+ return ErrorCode;
+}
+
+/* EOF */
diff --git a/reactos/dll/win32/ws2help/debug.h b/reactos/dll/win32/ws2help/debug.h
deleted file mode 100644
index b25f7cc96d4..00000000000
--- a/reactos/dll/win32/ws2help/debug.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS WinSock 2 Helper DLL for TCP/IP
- * FILE: include/debug.h
- * PURPOSE: Debugging support macros
- * DEFINES: DBG - Enable debug output
- * NASSERT - Disable assertions
- */
-#ifndef __DEBUG_H
-#define __DEBUG_H
-
-#define NORMAL_MASK 0x000000FF
-#define SPECIAL_MASK 0xFFFFFF00
-#define MIN_TRACE 0x00000001
-#define MID_TRACE 0x00000002
-#define MAX_TRACE 0x00000003
-
-#define DEBUG_ULTRA 0xFFFFFFFF
-
-#ifdef ASSERT
-#undef ASSERT
-#endif
-
-#if DBG
-
-extern DWORD DebugTraceLevel;
-
-#define WSH_DbgPrint(_t_, _x_) \
- if (((DebugTraceLevel & NORMAL_MASK) >= _t_) || \
- ((DebugTraceLevel & _t_) > NORMAL_MASK)) { \
- DbgPrint("(%hS:%d)(%hS) ", __FILE__, __LINE__, __FUNCTION__); \
- DbgPrint _x_; \
- }
-
-#ifdef NASSERT
-#define ASSERT(x)
-#else /* NASSERT */
-#define ASSERT(x) if (!(x)) { WSH_DbgPrint(MIN_TRACE, ("Assertion "#x" failed at %s:%d\n", __FILE__, __LINE__)); ExitProcess(0); }
-#endif /* NASSERT */
-
-#else /* DBG */
-
-#define WSH_DbgPrint(_t_, _x_)
-
-#define ASSERT(x)
-
-#endif /* DBG */
-
-#undef assert
-#define assert(x) ASSERT(x)
-#define assert_irql(x) ASSERT_IRQL(x)
-
-
-#define UNIMPLEMENTED \
- WSH_DbgPrint(MIN_TRACE, ("(%s:%d)(%s) is unimplemented, \
- please try again later.\n", __FILE__, __LINE__, __FUNCTION__));
-
-#define CHECKPOINT \
- WSH_DbgPrint(MIN_TRACE, ("\n"));
-
-#define CP CHECKPOINT
-
-#endif /* __DEBUG_H */
-
-/* EOF */
diff --git a/reactos/dll/win32/ws2help/dllmain.c b/reactos/dll/win32/ws2help/dllmain.c
new file mode 100644
index 00000000000..d2a3a7a1dd0
--- /dev/null
+++ b/reactos/dll/win32/ws2help/dllmain.c
@@ -0,0 +1,170 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS WinSock 2 DLL
+ * FILE: include/ws2_32.h
+ * PURPOSE: WinSock 2 DLL header
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "precomp.h"
+
+/* DATA **********************************************************************/
+
+HANDLE GlobalHeap;
+BOOL Ws2helpInitialized = FALSE;
+CRITICAL_SECTION StartupSyncronization;
+HINSTANCE LibraryHdl;
+
+/* FUNCTIONS *****************************************************************/
+
+VOID
+WINAPI
+NewCtxInit(VOID)
+{
+ NT_PRODUCT_TYPE ProductType = NtProductWinNt;
+ SYSTEM_INFO SystemInfo;
+ DWORD NumHandleBuckets;
+ HKEY KeyHandle;
+ DWORD RegSize = sizeof(DWORD);
+ DWORD RegType;
+ DWORD Mask;
+
+ /* Try to figure out if this is a workstation or server install */
+ RtlGetNtProductType(&ProductType);
+
+ /* Get the system info */
+ GetSystemInfo(&SystemInfo);
+
+ /* If this is an MP machine, set the default spinlock */
+ if (SystemInfo.dwNumberOfProcessors > 1) gdwSpinCount = 2000;
+
+ /* Figure how many "Handle Buckets" we'll use. Start with the default */
+ NumHandleBuckets = ProductType == NtProductWinNt ? 8 : 32;
+
+ /* Open the registry settings */
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+ "System\\CurrentControlSet\\Services\\Winsock2\\Parameters",
+ 0,
+ KEY_QUERY_VALUE,
+ &KeyHandle) == ERROR_SUCCESS)
+ {
+ /* Query the key */
+ RegQueryValueEx(KeyHandle,
+ "Ws2_32NumHandleBuckets",
+ 0,
+ &RegType,
+ (LPBYTE)&NumHandleBuckets,
+ &RegSize);
+
+ /* Are we on MP? */
+ if (SystemInfo.dwNumberOfProcessors > 1)
+ {
+ /* Also check for a custom spinlock setting */
+ RegQueryValueEx(KeyHandle,
+ "Ws2_32SpinCount",
+ 0,
+ &RegType,
+ (LPBYTE)&gdwSpinCount,
+ &RegSize);
+ }
+
+ /* Close the key, we're done */
+ RegCloseKey(KeyHandle);
+ }
+
+ /* Now get the bucket count and normalize it to be log2 and within 256 */
+ for (Mask = 256; !(Mask & NumHandleBuckets); Mask >>= 1);
+ NumHandleBuckets = Mask;
+
+ /* Normalize it again, to be within OS parameters */
+ if (ProductType == NtProductWinNt)
+ {
+ /* Is it within norms for non-server editions? */
+ if (NumHandleBuckets > 32) NumHandleBuckets = 32;
+ else if (NumHandleBuckets < 8) NumHandleBuckets = 8;
+ }
+ else
+ {
+ /* Is it within norms for server editions? */
+ if (NumHandleBuckets > 256) NumHandleBuckets = 256;
+ else if (NumHandleBuckets < 32) NumHandleBuckets = 32;
+ }
+
+ /* Normalize the spincount */
+ if (gdwSpinCount > 8000) gdwSpinCount = 8000;
+
+ /* Set the final mask */
+ gHandleToIndexMask = NumHandleBuckets -1;
+}
+
+DWORD
+WINAPI
+Ws2helpInitialize(VOID)
+{
+ /* Enter the startup CS */
+ EnterCriticalSection(&StartupSyncronization);
+
+ /* Check again for init */
+ if (!Ws2helpInitialized)
+ {
+ /* Initialize us */
+ NewCtxInit();
+ Ws2helpInitialized = TRUE;
+ }
+
+ /* Leave the CS and return */
+ LeaveCriticalSection(&StartupSyncronization);
+ return ERROR_SUCCESS;
+}
+
+BOOL
+APIENTRY
+DllMain(HANDLE hModule,
+ DWORD dwReason,
+ LPVOID lpReserved)
+{
+ switch (dwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+
+ /* Save our handle */
+ LibraryHdl = hModule;
+
+ /* Improve Performance */
+ DisableThreadLibraryCalls(hModule);
+
+ /* Initialize startup CS */
+ InitializeCriticalSection(&StartupSyncronization);
+
+ /* Get Global Heap */
+ GlobalHeap = GetProcessHeap();
+ break;
+
+ case DLL_THREAD_ATTACH:
+ case DLL_THREAD_DETACH:
+ break;
+
+ case DLL_PROCESS_DETACH:
+
+ /* Make sure we loaded */
+ if (!LibraryHdl) break;
+
+ /* Check if we are cleaning up */
+ if (lpReserved)
+ {
+ /* Free the security descriptor */
+ if (pSDPipe) HeapFree(GlobalHeap, 0, pSDPipe);
+
+ /* Close the event */
+ if (ghWriterEvent) CloseHandle(ghWriterEvent);
+
+ /* Delete the startup CS */
+ DeleteCriticalSection(&StartupSyncronization);
+ Ws2helpInitialized = FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
diff --git a/reactos/dll/win32/ws2help/handle.c b/reactos/dll/win32/ws2help/handle.c
new file mode 100644
index 00000000000..cc76e734cfc
--- /dev/null
+++ b/reactos/dll/win32/ws2help/handle.c
@@ -0,0 +1,447 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS WinSock 2 DLL
+ * FILE: include/ws2_32.h
+ * PURPOSE: WinSock 2 DLL header
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "precomp.h"
+
+/* DATA **********************************************************************/
+
+typedef struct _WSH_HELPER_CONTEXT
+{
+ HANDLE FileHandle;
+ HANDLE ThreadHandle;
+ HANDLE DllHandle;
+} WSH_HELPER_CONTEXT, *PWAH_HELPER_CONTEXT;
+
+LPFN_WSASEND pWSASend;
+LPFN_WSARECV pWSARecv;
+LPFN_WSASENDTO pWSASendTo;
+LPFN_WSARECVFROM pWSARecvFrom;
+LPFN_WSAGETLASTERROR pWSAGetLastError;
+LPFN_WSACANCELBLOCKINGCALL pWSACancelBlockingCall;
+LPFN_WSASETBLOCKINGHOOK pWSASetBlockingHook;
+LPFN_SELECT pSelect;
+LPFN_WSASTARTUP pWSAStartup;
+LPFN_WSACLEANUP pWSACleanup;
+LPFN_GETSOCKOPT pGetSockOpt;
+LPFN_WSAIOCTL pWSAIoctl;
+
+#define APCH (HANDLE)'SOR '
+
+/* FUNCTIONS *****************************************************************/
+
+VOID
+CALLBACK
+ApcThread(ULONG_PTR Context)
+{
+
+}
+
+NTSTATUS
+WINAPI
+DoSocketCancel(PVOID Context1,
+ PVOID Context2,
+ PVOID Context3)
+{
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+WINAPI
+DoSocketRequest(PVOID Context1,
+ PVOID Context2,
+ PVOID Context3)
+{
+ return STATUS_SUCCESS;
+}
+
+VOID
+CALLBACK
+ExitThreadApc(ULONG_PTR Context)
+{
+ PWAH_HELPER_CONTEXT HelperContext = (PWAH_HELPER_CONTEXT)Context;
+
+ /* Close the file handle */
+ CloseHandle(HelperContext->FileHandle);
+
+ /* Free the context */
+ HeapFree(GlobalHeap, 0, HelperContext);
+
+ /* Exit the thread and library */
+ FreeLibraryAndExitThread(HelperContext->DllHandle, ERROR_SUCCESS);
+}
+
+DWORD
+WINAPI
+WahCloseHandleHelper(IN HANDLE HelperHandle)
+{
+ DWORD ErrorCode;
+ PWAH_HELPER_CONTEXT Context = HelperHandle;
+
+ /* Enter the prolog, make sure we're initialized */
+ ErrorCode = WS2HELP_PROLOG();
+ if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+ /* Validate the handle */
+ if (!Context) return ERROR_INVALID_PARAMETER;
+
+ /* Queue an APC to exit the thread */
+ if (QueueUserAPC(ExitThreadApc, Context->ThreadHandle, (ULONG_PTR)Context))
+ {
+ /* Done */
+ return ERROR_SUCCESS;
+ }
+ else
+ {
+ /* We failed somewhere */
+ return ERROR_GEN_FAILURE;
+ }
+}
+
+DWORD
+WINAPI
+WahCloseSocketHandle(IN HANDLE HelperHandle,
+ IN SOCKET Socket)
+{
+ DWORD ErrorCode;
+ PWAH_HELPER_CONTEXT Context = HelperHandle;
+
+ /* Enter the prolog, make sure we're initialized */
+ ErrorCode = WS2HELP_PROLOG();
+ if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+ /* Validate the handle */
+ if (!(Context) || (Socket == INVALID_SOCKET) || !(Socket))
+ {
+ /* Invalid handle and/or socket */
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ /* Just close the handle and return */
+ CloseHandle((HANDLE)Socket);
+ return ERROR_SUCCESS;
+}
+
+DWORD
+WINAPI
+WahCreateSocketHandle(IN HANDLE HelperHandle,
+ OUT SOCKET *Socket)
+{
+ DWORD ErrorCode;
+ INT OpenType;
+ DWORD Size = sizeof(OpenType);
+ DWORD CreateOptions = 0;
+ UNICODE_STRING Name;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ PFILE_FULL_EA_INFORMATION Ea;
+ PWAH_EA_DATA EaData;
+ CHAR EaBuffer[sizeof(*Ea) + sizeof(*EaData)];
+ NTSTATUS Status;
+ IO_STATUS_BLOCK IoStatusBlock;
+ PWAH_HELPER_CONTEXT Context = (PWAH_HELPER_CONTEXT)HelperHandle;
+
+ /* Enter the prolog, make sure we're initialized */
+ ErrorCode = WS2HELP_PROLOG();
+ if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+ /* Validate the handle and pointer */
+ if (!(Context) || !(Socket))
+ {
+ /* Invalid handle and/or socket */
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ /* Set pointer to EA */
+ Ea = (PFILE_FULL_EA_INFORMATION)EaBuffer;
+
+ /* Get the open type to determine the create options */
+ if ((pGetSockOpt(INVALID_SOCKET,
+ SOL_SOCKET,
+ SO_OPENTYPE,
+ (PCHAR)&OpenType,
+ (INT FAR*)&Size) == ERROR_SUCCESS) && (OpenType))
+ {
+ /* This is a sync open */
+ CreateOptions = FILE_SYNCHRONOUS_IO_NONALERT;
+ }
+
+ /* Initialize the attributes for the driver */
+ RtlInitUnicodeString(&Name, L"\\Device\\WS2IFSL\\NifsSct");
+ InitializeObjectAttributes(&ObjectAttributes,
+ &Name,
+ 0,
+ NULL,
+ NULL);
+
+ /* Set up the EA */
+ Ea->NextEntryOffset = 0;
+ Ea->Flags = 0;
+ Ea->EaNameLength = sizeof("NifsSct");
+ Ea->EaValueLength = sizeof(*EaData);
+ RtlCopyMemory(Ea->EaName, "NifsSct", Ea->EaNameLength);
+
+ /* Get our EA data */
+ EaData = (PWAH_EA_DATA)(Ea + 1);
+
+ /* Write the EA Data */
+ EaData->FileHandle = Context->FileHandle;
+ EaData->Context = NULL;
+
+ /* Call the driver */
+ Status = NtCreateFile((PHANDLE)Socket,
+ FILE_ALL_ACCESS,
+ &ObjectAttributes,
+ &IoStatusBlock,
+ NULL,
+ FILE_ATTRIBUTE_NORMAL,
+ 0,
+ FILE_OPEN_IF,
+ CreateOptions,
+ Ea,
+ sizeof(*Ea) + sizeof(*EaData));
+
+ /* Check for success */
+ if (NT_SUCCESS(Status))
+ {
+ /* Write the socket handle */
+ EaData->Context =(HANDLE)*Socket;
+
+ /* Tell the driver about it */
+ if (DeviceIoControl((HANDLE)*Socket,
+ IOCTL_WS2IFSL_SET_HANDLE,
+ &EaData,
+ sizeof(WSH_EA_DATA),
+ NULL,
+ 0,
+ &Size,
+ NULL))
+ {
+ /* Set success */
+ ErrorCode = NO_ERROR;
+ }
+ else
+ {
+ /* We failed. Get the error and close the socket */
+ ErrorCode = GetLastError();
+ CloseHandle((HANDLE)*Socket);
+ *Socket = 0;
+ }
+ }
+ else
+ {
+ /* Create file failed, conver error code */
+ ErrorCode = RtlNtStatusToDosError(Status);
+ }
+
+ /* Return to caller */
+ return ErrorCode;
+}
+
+INT
+WINAPI
+WahDisableNonIFSHandleSupport(VOID)
+{
+ DWORD ErrorCode;
+ SC_HANDLE ServiceMgrHandle, Ws2IfsHandle;
+
+ /* Enter the prolog, make sure we're initialized */
+ ErrorCode = WS2HELP_PROLOG();
+ if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+ /* Open the service DB */
+ ServiceMgrHandle = OpenSCManager(NULL,
+ SERVICES_ACTIVE_DATABASE,
+ SC_MANAGER_CREATE_SERVICE);
+ if (!ServiceMgrHandle) return GetLastError();
+
+ /* Open the service */
+ Ws2IfsHandle = OpenService(ServiceMgrHandle, "WS2IFSL", SERVICE_ALL_ACCESS);
+
+ /* Disable the servce */
+ ChangeServiceConfig(Ws2IfsHandle,
+ SERVICE_NO_CHANGE,
+ SERVICE_DISABLED,
+ SERVICE_NO_CHANGE,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
+
+ /* Close the handles and return */
+ CloseServiceHandle(ServiceMgrHandle);
+ CloseServiceHandle(Ws2IfsHandle);
+ return ERROR_SUCCESS;
+}
+
+INT
+WINAPI
+WahEnableNonIFSHandleSupport(VOID)
+{
+ return 0;
+}
+
+DWORD
+WINAPI
+WahOpenHandleHelper(OUT PHANDLE HelperHandle)
+{
+ DWORD ErrorCode;
+ HINSTANCE hWs2_32;
+ UNICODE_STRING Name;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ PFILE_FULL_EA_INFORMATION Ea;
+ PWAH_EA_DATA2 EaData;
+ CHAR EaBuffer[sizeof(*Ea) + sizeof(*EaData)];
+ NTSTATUS Status;
+ IO_STATUS_BLOCK IoStatusBlock;
+ DWORD Tid;
+ PWAH_HELPER_CONTEXT Context;
+
+ /* Enter the prolog, make sure we're initialized */
+ ErrorCode = WS2HELP_PROLOG();
+ if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+ /* Validate the pointer */
+ if (!HelperHandle)
+ {
+ /* Invalid handle and/or socket */
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ /* Get ws2_32.dll's handle. We don't load it: it MUST be here */
+ hWs2_32 = GetModuleHandle ("WS2_32.DLL");
+ if (!hWs2_32) return WSASYSCALLFAILURE;
+
+ /* Dynamically load all its APIs */
+ if (!((pGetSockOpt = (LPFN_GETSOCKOPT)GetProcAddress(hWs2_32, "getsockopt"))) ||
+ !((pSelect = (LPFN_SELECT)GetProcAddress(hWs2_32, "select"))) ||
+ !((pWSACancelBlockingCall = (LPFN_WSACANCELBLOCKINGCALL)GetProcAddress(hWs2_32, "WSACancelBlockingCall"))) ||
+ !((pWSACleanup = (LPFN_WSACLEANUP)GetProcAddress(hWs2_32, "WSACleanup"))) ||
+ !((pWSAGetLastError = (LPFN_WSAGETLASTERROR)GetProcAddress(hWs2_32, "WSAGetLastError"))) ||
+ !((pWSASetBlockingHook = (LPFN_WSASETBLOCKINGHOOK)GetProcAddress(hWs2_32, "WSASetBlockingHook"))) ||
+ !((pWSARecv = (LPFN_WSARECV)GetProcAddress(hWs2_32, "WSARecv"))) ||
+ !((pWSASend = (LPFN_WSASEND)GetProcAddress(hWs2_32, "WSASend"))) ||
+ !((pWSASendTo = (LPFN_WSASENDTO)GetProcAddress(hWs2_32, "WSASendTo"))) ||
+ !((pWSAStartup = (LPFN_WSASTARTUP)GetProcAddress(hWs2_32, "WSAStartup"))) ||
+ !((pWSARecvFrom = (LPFN_WSARECVFROM)GetProcAddress(hWs2_32, "WSARecvFrom"))) ||
+ !((pWSAIoctl = (LPFN_WSAIOCTL)GetProcAddress(hWs2_32, "WSAIoctl"))))
+ {
+ /* Uh, guess we failed somewhere */
+ return WSASYSCALLFAILURE;
+ }
+
+ /* Set pointer EA structure */
+ Ea = (PFILE_FULL_EA_INFORMATION)EaBuffer;
+
+ /* Create the helper context */
+ Context = HeapAlloc(GlobalHeap, 0, sizeof(WSH_HELPER_CONTEXT));
+ if (Context)
+ {
+ /* Create the special request thread */
+ Context->ThreadHandle = CreateThread(NULL,
+ 0,
+ (PVOID)ApcThread,
+ Context,
+ CREATE_SUSPENDED,
+ &Tid);
+ if (Context->ThreadHandle)
+ {
+ /* Create the attributes for the driver open */
+ RtlInitUnicodeString(&Name, L"\\Device\\WS2IFSL\\NifsPvd");
+ InitializeObjectAttributes(&ObjectAttributes,
+ &Name,
+ 0,
+ NULL,
+ NULL);
+
+ /* Setup the EA */
+ Ea->NextEntryOffset = 0;
+ Ea->Flags = 0;
+ Ea->EaNameLength = sizeof("NifsPvd");
+ Ea->EaValueLength = sizeof(*EaData);
+ RtlCopyMemory(Ea->EaName, "NifsPvd", Ea->EaNameLength);
+
+ /* Get our EA data */
+ EaData = (PWAH_EA_DATA2)(Ea + 1);
+
+ /* Fill out the EA Data */
+ EaData->ThreadHandle = Context->ThreadHandle;
+ EaData->RequestRoutine = DoSocketRequest;
+ EaData->CancelRoutine = DoSocketCancel;
+ EaData->ApcContext = Context;
+ EaData->Reserved = 0;
+
+ /* Call the driver */
+ Status = NtCreateFile(&Context->FileHandle,
+ FILE_ALL_ACCESS,
+ &ObjectAttributes,
+ &IoStatusBlock,
+ NULL,
+ FILE_ATTRIBUTE_NORMAL,
+ 0,
+ FILE_OPEN_IF,
+ 0,
+ Ea,
+ sizeof(*Ea) + sizeof(*EaData));
+
+ /* Check for success */
+ if (NT_SUCCESS(Status))
+ {
+ /* Resume the thread and return a handle to the context */
+ ResumeThread(Context->ThreadHandle);
+ *HelperHandle = (HANDLE)Context;
+ return ERROR_SUCCESS;
+ }
+ else
+ {
+ /* Get the error code */
+ ErrorCode = RtlNtStatusToDosError(Status);
+ }
+
+ /* We failed, mark us as such */
+ Context->FileHandle = NULL;
+ ResumeThread(Context->ThreadHandle);
+ }
+ else
+ {
+ /* Get the error code */
+ ErrorCode = GetLastError();
+ }
+
+ /* If we got here, we failed, so free the context */
+ HeapFree(GlobalHeap, 0, Context);
+ }
+ else
+ {
+ /* Get the errror code */
+ ErrorCode = GetLastError();
+ }
+
+ /* Return to caller */
+ return ErrorCode;
+}
+
+DWORD
+WINAPI
+WahCompleteRequest(IN HANDLE HelperHandle,
+ IN SOCKET Socket,
+ IN LPWSAOVERLAPPED lpOverlapped,
+ IN DWORD ErrorCode,
+ IN DWORD BytesTransferred)
+{
+ UNREFERENCED_PARAMETER(HelperHandle);
+ UNREFERENCED_PARAMETER(Socket);
+ UNREFERENCED_PARAMETER(lpOverlapped);
+ UNREFERENCED_PARAMETER(ErrorCode);
+ UNREFERENCED_PARAMETER(BytesTransferred);
+ return ERROR_SUCCESS;
+}
+
+/* EOF */
diff --git a/reactos/dll/win32/ws2help/notify.c b/reactos/dll/win32/ws2help/notify.c
new file mode 100644
index 00000000000..ddec693693d
--- /dev/null
+++ b/reactos/dll/win32/ws2help/notify.c
@@ -0,0 +1,87 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS WinSock 2 DLL
+ * FILE: include/ws2_32.h
+ * PURPOSE: WinSock 2 DLL header
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "precomp.h"
+
+/* DATA **********************************************************************/
+
+#define HANH (HANDLE)'2SOR'
+
+PSECURITY_DESCRIPTOR pSDPipe = NULL;
+
+/* FUNCTIONS *****************************************************************/
+
+DWORD
+WINAPI
+WahCloseNotificationHandleHelper(IN HANDLE HelperHandle)
+{
+ DWORD ErrorCode;
+
+ /* Enter the prolog, make sure we're initialized */
+ ErrorCode = WS2HELP_PROLOG();
+ if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+ /* Validate handle */
+ if (HelperHandle != HANH) return ERROR_INVALID_PARAMETER;
+
+ /* return */
+ return ERROR_SUCCESS;
+}
+
+DWORD
+WINAPI
+WahCreateNotificationHandle(IN HANDLE HelperHandle,
+ OUT PHANDLE NotificationHelperHandle)
+{
+ UNREFERENCED_PARAMETER(HelperHandle);
+ UNREFERENCED_PARAMETER(NotificationHelperHandle);
+ return 0;
+}
+
+DWORD
+WINAPI
+WahOpenNotificationHandleHelper(OUT PHANDLE HelperHandle)
+{
+ DWORD ErrorCode;
+
+ /* Enter the prolog, make sure we're initialized */
+ ErrorCode = WS2HELP_PROLOG();
+ if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+ /* Validate handle */
+ if (!HelperHandle) return ERROR_INVALID_PARAMETER;
+
+ /* Return a bogus handle ("ROS2") */
+ *HelperHandle = HANH;
+ return ERROR_SUCCESS;
+}
+
+INT
+WINAPI
+WahNotifyAllProcesses(IN HANDLE NotificationHelperHandle)
+{
+ UNREFERENCED_PARAMETER(NotificationHelperHandle);
+ return 0;
+}
+
+INT
+WINAPI
+WahWaitForNotification(IN HANDLE NotificationHelperHandle,
+ IN HANDLE lpNotificationHandle,
+ IN LPWSAOVERLAPPED lpOverlapped,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
+{
+ UNREFERENCED_PARAMETER(NotificationHelperHandle);
+ UNREFERENCED_PARAMETER(lpNotificationHandle);
+ UNREFERENCED_PARAMETER(lpOverlapped);
+ UNREFERENCED_PARAMETER(lpCompletionRoutine);
+ return 0;
+}
+
+/* EOF */
diff --git a/reactos/dll/win32/ws2help/precomp.h b/reactos/dll/win32/ws2help/precomp.h
new file mode 100644
index 00000000000..ce5f0f83b23
--- /dev/null
+++ b/reactos/dll/win32/ws2help/precomp.h
@@ -0,0 +1,47 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS WinSock 2 Helper DLL
+ * FILE: lib/ws2help/precomp.h
+ * PURPOSE: WinSock 2 Helper DLL
+ */
+#ifndef __PRECOMP_H
+#define __PRECOMP_H
+
+/* Winsock Provider Headers */
+#define WIN32_NO_STATUS
+#define _WIN32_WINNT 0x502
+#define NTOS_MODE_USER
+#define INCL_WINSOCK_API_TYPEDEFS 1
+#include
+
+/* NDK Headers */
+#include
+#include
+
+/* Shared Winsock Helper headers */
+#include
+#include
+
+/* Missing definition */
+#define SO_OPENTYPE 0x20
+
+/* Global data */
+extern HANDLE GlobalHeap;
+extern PSECURITY_DESCRIPTOR pSDPipe;
+extern HANDLE ghWriterEvent;
+extern BOOL Ws2helpInitialized;
+extern DWORD gdwSpinCount;
+extern DWORD gHandleToIndexMask;
+
+/* Functions */
+DWORD
+WINAPI
+Ws2helpInitialize(VOID);
+
+/* Initialization macro */
+#define WS2HELP_PROLOG() \
+ (Ws2helpInitialized? ERROR_SUCCESS : Ws2helpInitialize())
+
+#endif /* __WS2HELP_H */
+
+/* EOF */
diff --git a/reactos/dll/win32/ws2help/ws2help.c b/reactos/dll/win32/ws2help/ws2help.c
deleted file mode 100644
index d2fd024b464..00000000000
--- a/reactos/dll/win32/ws2help/ws2help.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS WinSock 2 Helper DLL for TCP/IP
- * FILE: ws2help.c
- * PURPOSE: DLL entry
- * PROGRAMMERS: Robert D. Dickenson (robertdickenson@users.sourceforge.net)
- * REVISIONS:
- * RDD 18/06-2002 Created
- */
-#include "ws2help.h"
-
-#include
-#if DBG
-
-/* See debug.h for debug/trace constants */
-DWORD DebugTraceLevel = MAX_TRACE;
-
-#endif /* DBG */
-
-/* To make the linker happy */
-VOID WINAPI KeBugCheck (ULONG BugCheckCode) {}
-
-
-BOOL
-EXPORT
-DllMain(HANDLE hInstDll,
- ULONG dwReason,
- PVOID Reserved)
-{
- WSH_DbgPrint(MIN_TRACE, ("DllMain of ws2help.dll\n"));
-
- switch (dwReason) {
- case DLL_PROCESS_ATTACH:
- /* Don't need thread attach notifications
- so disable them to improve performance */
- DisableThreadLibraryCalls(hInstDll);
- break;
-
- case DLL_THREAD_ATTACH:
- break;
-
- case DLL_THREAD_DETACH:
- break;
-
- case DLL_PROCESS_DETACH:
- break;
- }
- return TRUE;
-}
-
-
-INT
-EXPORT
-WahCloseApcHelper(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahCloseHandleHelper(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahCloseNotificationHandleHelper(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahCloseSocketHandle(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahCloseThread(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahCompleteRequest(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahCreateHandleContextTable(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahCreateNotificationHandle(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahCreateSocketHandle(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahDestroyHandleContextTable(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahDisableNonIFSHandleSupport(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahEnableNonIFSHandleSupport(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahEnumerateHandleContexts(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahInsertHandleContext(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahNotifyAllProcesses(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahOpenApcHelper(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahOpenCurrentThread(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahOpenHandleHelper(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahOpenNotificationHandleHelper(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahQueueUserApc(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahReferenceContextByHandle(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahRemoveHandleContext(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-INT
-EXPORT
-WahWaitForNotification(
- IN PVOID HelperDllSocketContext,
- IN SOCKET SocketHandle
- )
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
-/* EOF */
diff --git a/reactos/dll/win32/ws2help/ws2help.def b/reactos/dll/win32/ws2help/ws2help.def
deleted file mode 100644
index fbffcc8046c..00000000000
--- a/reactos/dll/win32/ws2help/ws2help.def
+++ /dev/null
@@ -1,30 +0,0 @@
-; WS2HELP.DLL - Windows Sockets 2 Helper DLL for TCP/IP
-
-LIBRARY ws2help.dll
-
-EXPORTS
-WahCloseApcHelper@8
-WahCloseHandleHelper@8
-WahCloseNotificationHandleHelper@8
-WahCloseSocketHandle@8
-WahCloseThread@8
-WahCompleteRequest@8
-WahCreateHandleContextTable@8
-WahCreateNotificationHandle@8
-WahCreateSocketHandle@8
-WahDestroyHandleContextTable@8
-WahDisableNonIFSHandleSupport@8
-WahEnableNonIFSHandleSupport@8
-WahEnumerateHandleContexts@8
-WahInsertHandleContext@8
-WahNotifyAllProcesses@8
-WahOpenApcHelper@8
-WahOpenCurrentThread@8
-WahOpenHandleHelper@8
-WahOpenNotificationHandleHelper@8
-WahQueueUserApc@8
-WahReferenceContextByHandle@8
-WahRemoveHandleContext@8
-WahWaitForNotification@8
-
-; EOF
diff --git a/reactos/dll/win32/ws2help/ws2help.h b/reactos/dll/win32/ws2help/ws2help.h
index ee7f1b5a078..c24eaa60851 100644
--- a/reactos/dll/win32/ws2help/ws2help.h
+++ b/reactos/dll/win32/ws2help/ws2help.h
@@ -1,21 +1,163 @@
/*
* COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS WinSock 2 Helper DLL for TCP/IP
- * FILE: include/ws2help.h
- * PURPOSE: WinSock 2 Helper DLL for TCP/IP header
+ * PROJECT: ReactOS WinSock 2 Helper DLL
+ * FILE: include/libs/winsock/ws2help.h
+ * PURPOSE: WinSock 2 Helper DLL header
*/
+
#ifndef __WS2HELP_H
#define __WS2HELP_H
-#define WIN32_NO_STATUS
-#include
-#define NTOS_MODE_USER
-#include
+/* Types */
+typedef struct _WSH_HANDLE
+{
+ LONG RefCount;
+ HANDLE Handle;
+} WSH_HANDLE, *PWAH_HANDLE;
-#include
+typedef struct _WSH_HASH_TABLE
+{
+ DWORD Size;
+ PWAH_HANDLE Handles[1];
+} WSH_HASH_TABLE, *PWAH_HASH_TABLE;
-#define EXPORT WINAPI
+typedef struct _WSH_SEARCH_TABLE
+{
+ volatile PWAH_HASH_TABLE HashTable;
+ volatile PLONG CurrentCount;
+ LONG Count1;
+ LONG Count2;
+ LONG SpinCount;
+ BOOL Expanding;
+ CRITICAL_SECTION Lock;
+} WSH_SEARCH_TABLE, *PWAH_SEARCH_TABLE;
-#endif /* __WS2HELP_H */
+typedef struct _WSH_HANDLE_TABLE
+{
+ DWORD Mask;
+ WSH_SEARCH_TABLE SearchTables[1];
+} WSH_HANDLE_TABLE, *PWAH_HANDLE_TABLE;
-/* EOF */
+//typedef struct _WSH_HANDLE_TABLE *PWAH_HANDLE_TABLE;
+
+typedef BOOL
+(WINAPI *PWAH_HANDLE_ENUMERATE_PROC)(
+ IN PVOID Context,
+ IN PWAH_HANDLE Handle
+);
+
+PWAH_HANDLE
+WINAPI
+WahReferenceContextByHandle(
+ IN PWAH_HANDLE_TABLE Table,
+ IN HANDLE Handle
+);
+
+DWORD
+WINAPI
+WahRemoveHandleContext(
+ IN PWAH_HANDLE_TABLE Table,
+ IN PWAH_HANDLE Handle
+);
+
+DWORD
+WINAPI
+WahCloseSocketHandle(
+ IN HANDLE HelperHandle,
+ IN SOCKET Socket
+);
+
+DWORD
+WINAPI
+WahOpenCurrentThread(
+ IN HANDLE HelperHandle,
+ OUT LPWSATHREADID ThreadId
+);
+
+DWORD
+WINAPI
+WahCloseApcHelper(
+ IN HANDLE HelperHandle
+);
+
+DWORD
+WINAPI
+WahCloseThread(
+ IN HANDLE HelperHandle,
+ IN LPWSATHREADID ThreadId
+);
+
+DWORD
+WINAPI
+WahCloseHandleHelper(
+ IN HANDLE HelperHandle
+);
+
+DWORD
+WINAPI
+WahCloseNotificationHandleHelper(
+ IN HANDLE HelperHandle
+);
+
+DWORD
+WINAPI
+WahOpenNotificationHandleHelper(
+ OUT PHANDLE HelperHandle
+);
+
+DWORD
+WINAPI
+WahCreateNotificationHandle(
+ IN HANDLE HelperHandle,
+ OUT PHANDLE NotificationHelperHandle
+);
+
+INT
+WINAPI
+WahWaitForNotification(
+ IN HANDLE NotificationHelperHandle,
+ IN HANDLE lpNotificationHandle,
+ IN LPWSAOVERLAPPED lpOverlapped,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
+);
+
+INT
+WINAPI
+WahNotifyAllProcesses(
+ IN HANDLE NotificationHelperHandle
+);
+
+BOOL
+WINAPI
+WahEnumerateHandleContexts(
+ IN PWAH_HANDLE_TABLE Table,
+ IN PWAH_HANDLE_ENUMERATE_PROC Callback,
+ IN PVOID Context
+);
+
+DWORD
+WINAPI
+WahCreateHandleContextTable(
+ OUT PWAH_HANDLE_TABLE *Table
+);
+
+DWORD
+WINAPI
+WahDestroyHandleContextTable(
+ IN PWAH_HANDLE_TABLE Table
+);
+
+PWAH_HANDLE
+WINAPI
+WahInsertHandleContext(
+ IN PWAH_HANDLE_TABLE Table,
+ IN PWAH_HANDLE Handle
+);
+
+DWORD
+WINAPI
+WahOpenApcHelper(
+ OUT PHANDLE ApcHelperHandle
+);
+
+#endif
diff --git a/reactos/dll/win32/ws2help/ws2help.rbuild b/reactos/dll/win32/ws2help/ws2help.rbuild
index 79378b09522..7468db923a1 100644
--- a/reactos/dll/win32/ws2help/ws2help.rbuild
+++ b/reactos/dll/win32/ws2help/ws2help.rbuild
@@ -1,9 +1,14 @@
-
-
+
+
.
+ advapi32
ntdll
kernel32
ws2_32
- ws2help.c
+ apc.c
+ context.c
+ dllmain.c
+ handle.c
+ notify.c
ws2help.rc
diff --git a/reactos/dll/win32/ws2help/ws2help.rc b/reactos/dll/win32/ws2help/ws2help.rc
index 83527bf486b..0ee73c0880f 100644
--- a/reactos/dll/win32/ws2help/ws2help.rc
+++ b/reactos/dll/win32/ws2help/ws2help.rc
@@ -1,4 +1,4 @@
-/* $Id$ */
+/* $Id: ws2help.rc 12852 2005-01-06 13:58:04Z mf $ */
#define REACTOS_VERSION_DLL
#define REACTOS_STR_FILE_DESCRIPTION "Windows Sockets 2 Helper API\0"
diff --git a/reactos/dll/win32/ws2help/ws2help.spec b/reactos/dll/win32/ws2help/ws2help.spec
new file mode 100644
index 00000000000..6786484f375
--- /dev/null
+++ b/reactos/dll/win32/ws2help/ws2help.spec
@@ -0,0 +1,23 @@
+@ stdcall WahCloseApcHelper(long)
+@ stdcall WahCloseHandleHelper(long)
+@ stdcall WahCloseNotificationHandleHelper(long)
+@ stdcall WahCloseSocketHandle(long ptr)
+@ stdcall WahCloseThread(long ptr)
+@ stdcall WahCompleteRequest(long ptr ptr long long)
+@ stdcall WahCreateHandleContextTable(ptr)
+@ stdcall WahCreateNotificationHandle(long ptr)
+@ stdcall WahCreateSocketHandle(long ptr)
+@ stdcall WahDestroyHandleContextTable(ptr)
+@ stdcall WahDisableNonIFSHandleSupport()
+@ stdcall WahEnableNonIFSHandleSupport()
+@ stdcall WahEnumerateHandleContexts(ptr ptr ptr)
+@ stdcall WahInsertHandleContext(ptr ptr)
+@ stdcall WahNotifyAllProcesses(long)
+@ stdcall WahOpenApcHelper(ptr)
+@ stdcall WahOpenCurrentThread(long ptr)
+@ stdcall WahOpenHandleHelper(ptr)
+@ stdcall WahOpenNotificationHandleHelper(ptr)
+@ stdcall WahQueueUserApc(long ptr ptr ptr)
+@ stdcall WahReferenceContextByHandle(ptr long)
+@ stdcall WahRemoveHandleContext(ptr ptr)
+@ stdcall WahWaitForNotification(long long ptr ptr)
diff --git a/reactos/dll/win32/ws2help/wshdrv.h b/reactos/dll/win32/ws2help/wshdrv.h
new file mode 100644
index 00000000000..ad983fc3410
--- /dev/null
+++ b/reactos/dll/win32/ws2help/wshdrv.h
@@ -0,0 +1,28 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS WinSock 2 DLL
+ * FILE: include/drivers/ws2ifsl/wshdrv.h
+ * PURPOSE: WinSock 2 Helper Driver header
+ */
+
+#ifndef __WSHDRV_H
+#define __WSHDRV_H
+
+typedef struct _WSH_EA_DATA
+{
+ HANDLE FileHandle;
+ PVOID Context;
+} WSH_EA_DATA, *PWAH_EA_DATA;
+
+typedef struct _WAH_EA_DATA2
+{
+ HANDLE ThreadHandle;
+ PVOID RequestRoutine;
+ PVOID CancelRoutine;
+ PVOID ApcContext;
+ ULONG Reserved;
+} WAH_EA_DATA2, *PWAH_EA_DATA2;
+
+#define IOCTL_WS2IFSL_SET_HANDLE 0x12B00
+
+#endif
diff --git a/reactos/drivers/filesystems/fastfat/fsctl.c b/reactos/drivers/filesystems/fastfat/fsctl.c
index 05e26293863..973c122c721 100644
--- a/reactos/drivers/filesystems/fastfat/fsctl.c
+++ b/reactos/drivers/filesystems/fastfat/fsctl.c
@@ -773,30 +773,6 @@ VfatMoveFile(PVFAT_IRP_CONTEXT IrpContext)
return STATUS_INVALID_DEVICE_REQUEST;
}
-#ifdef USE_ROS_CC_AND_FS
-static NTSTATUS
-VfatRosQueryLcnMapping(PVFAT_IRP_CONTEXT IrpContext)
-{
- PDEVICE_EXTENSION DeviceExt;
- PROS_QUERY_LCN_MAPPING LcnQuery;
- PIO_STACK_LOCATION Stack;
-
- DPRINT("VfatRosQueryLcnMapping(IrpContext %p)\n", IrpContext);
-
- DeviceExt = IrpContext->DeviceExt;
- Stack = IrpContext->Stack;
- if (IrpContext->Irp->AssociatedIrp.SystemBuffer == NULL ||
- Stack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ROS_QUERY_LCN_MAPPING))
- {
- return STATUS_BUFFER_TOO_SMALL;
- }
- LcnQuery = (PROS_QUERY_LCN_MAPPING)(IrpContext->Irp->AssociatedIrp.SystemBuffer);
- LcnQuery->LcnDiskOffset.QuadPart = DeviceExt->FatInfo.dataStart * DeviceExt->FatInfo.BytesPerSector;
- IrpContext->Irp->IoStatus.Information = sizeof(ROS_QUERY_LCN_MAPPING);
- return(STATUS_SUCCESS);
-}
-#endif
-
static NTSTATUS
VfatIsVolumeDirty(PVFAT_IRP_CONTEXT IrpContext)
{
@@ -877,11 +853,6 @@ NTSTATUS VfatFileSystemControl(PVFAT_IRP_CONTEXT IrpContext)
case FSCTL_MOVE_FILE:
Status = VfatMoveFile(IrpContext);
break;
-#ifdef USE_ROS_CC_AND_FS
- case FSCTL_ROS_QUERY_LCN_MAPPING:
- Status = VfatRosQueryLcnMapping(IrpContext);
- break;
-#endif
case FSCTL_IS_VOLUME_DIRTY:
Status = VfatIsVolumeDirty(IrpContext);
break;
diff --git a/reactos/drivers/filesystems/fastfat/misc.c b/reactos/drivers/filesystems/fastfat/misc.c
index 977da8aeda2..688086acec2 100644
--- a/reactos/drivers/filesystems/fastfat/misc.c
+++ b/reactos/drivers/filesystems/fastfat/misc.c
@@ -86,7 +86,7 @@ static NTSTATUS VfatLockControl(
Fail:;
IrpContext->Irp->IoStatus.Status = Status;
- IofCompleteRequest(IrpContext->Irp, (CCHAR)(NT_SUCCESS(Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT));
+ IoCompleteRequest(IrpContext->Irp, (CCHAR)(NT_SUCCESS(Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT));
VfatFreeIrpContext(IrpContext);
return Status;
}
diff --git a/reactos/drivers/filesystems/fastfat/vfat.h b/reactos/drivers/filesystems/fastfat/vfat.h
index 0a5deb5a275..ac02d2682d2 100644
--- a/reactos/drivers/filesystems/fastfat/vfat.h
+++ b/reactos/drivers/filesystems/fastfat/vfat.h
@@ -2,8 +2,6 @@
#include
#include
-#include
-
#define USE_ROS_CC_AND_FS
#define ROUND_DOWN(n, align) \
diff --git a/reactos/drivers/filesystems/fs_rec/fs_rec.h b/reactos/drivers/filesystems/fs_rec/fs_rec.h
index 643aca538be..b2ef6b7e12c 100644
--- a/reactos/drivers/filesystems/fs_rec/fs_rec.h
+++ b/reactos/drivers/filesystems/fs_rec/fs_rec.h
@@ -14,6 +14,8 @@
#include
#include
+#include "udfs.h"
+
//
// Tag for memory allocations
//
diff --git a/reactos/drivers/filesystems/fs_rec/udfs.c b/reactos/drivers/filesystems/fs_rec/udfs.c
index 8eee25a1891..dc9ddc9fb53 100644
--- a/reactos/drivers/filesystems/fs_rec/udfs.c
+++ b/reactos/drivers/filesystems/fs_rec/udfs.c
@@ -20,9 +20,10 @@ NTAPI
FsRecIsUdfsVolume(IN PDEVICE_OBJECT DeviceObject,
IN ULONG SectorSize)
{
- PUCHAR Buffer = NULL;
+ PVOLSTRUCTDESC VolumeStructDesc = NULL;
LARGE_INTEGER Offset;
ULONG State = 0;
+ PAGED_CODE();
Offset.QuadPart = UDFS_VRS_START_OFFSET;
while (TRUE)
@@ -31,7 +32,7 @@ FsRecIsUdfsVolume(IN PDEVICE_OBJECT DeviceObject,
&Offset,
SectorSize,
SectorSize,
- (PVOID)&Buffer,
+ (PVOID)&VolumeStructDesc,
NULL))
{
break;
@@ -41,28 +42,27 @@ FsRecIsUdfsVolume(IN PDEVICE_OBJECT DeviceObject,
{
case 0:
- if ((Buffer[1] == 'B') &&
- (Buffer[2] == 'E') &&
- (Buffer[3] == 'A') &&
- (Buffer[4] == '0') &&
- (Buffer[5] == '1'))
+ if (!strncmp((const char*)VolumeStructDesc->Ident,
+ VSD_STD_ID_BEA01,
+ VSD_STD_ID_LEN))
{
State = 1;
}
else
{
- ExFreePool(Buffer);
+ ExFreePool(VolumeStructDesc);
return FALSE;
}
break;
case 1:
- if ((Buffer[1] == 'N') &&
- (Buffer[2] == 'S') &&
- (Buffer[3] == 'R') &&
- (Buffer[4] == '0') &&
- ((Buffer[5] == '2') || (Buffer[5] == '3')))
+ if (!strncmp((const char*)VolumeStructDesc->Ident,
+ VSD_STD_ID_NSR03,
+ VSD_STD_ID_LEN) ||
+ !strncmp((const char*)VolumeStructDesc->Ident,
+ VSD_STD_ID_NSR02,
+ VSD_STD_ID_LEN))
{
State = 2;
}
@@ -70,13 +70,11 @@ FsRecIsUdfsVolume(IN PDEVICE_OBJECT DeviceObject,
case 2:
- if ((Buffer[1] == 'T') &&
- (Buffer[2] == 'E') &&
- (Buffer[3] == 'A') &&
- (Buffer[4] == '0') &&
- (Buffer[5] == '1'))
+ if (!strncmp((const char*)VolumeStructDesc->Ident,
+ VSD_STD_ID_TEA01,
+ VSD_STD_ID_LEN))
{
- ExFreePool(Buffer);
+ ExFreePool(VolumeStructDesc);
return TRUE;
}
break;
@@ -85,12 +83,12 @@ FsRecIsUdfsVolume(IN PDEVICE_OBJECT DeviceObject,
Offset.QuadPart += SectorSize;
if (Offset.QuadPart == UDFS_AVDP_SECTOR)
{
- ExFreePool(Buffer);
+ ExFreePool(VolumeStructDesc);
return FALSE;
}
}
- ExFreePool(Buffer);
+ ExFreePool(VolumeStructDesc);
return TRUE;
}
diff --git a/reactos/drivers/filesystems/fs_rec/udfs.h b/reactos/drivers/filesystems/fs_rec/udfs.h
new file mode 100644
index 00000000000..3eb30971d37
--- /dev/null
+++ b/reactos/drivers/filesystems/fs_rec/udfs.h
@@ -0,0 +1,29 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS File System Recognizer
+ * FILE: drivers/filesystems/fs_rec/udfs.h
+ * PURPOSE: UDFS Header File
+ * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+/* Standard Identifier (EMCA 167r2 2/9.1.2) */
+#define VSD_STD_ID_NSR02 "NSR02" /* (3/9.1) */
+
+/* Standard Identifier (ECMA 167r3 2/9.1.2) */
+#define VSD_STD_ID_BEA01 "BEA01" /* (2/9.2) */
+#define VSD_STD_ID_BOOT2 "BOOT2" /* (2/9.4) */
+#define VSD_STD_ID_CD001 "CD001" /* (ECMA-119) */
+#define VSD_STD_ID_CDW02 "CDW02" /* (ECMA-168) */
+#define VSD_STD_ID_NSR03 "NSR03" /* (3/9.1) */
+#define VSD_STD_ID_TEA01 "TEA01" /* (2/9.3) */
+
+/* Volume Structure Descriptor (ECMA 167r3 2/9.1) */
+#define VSD_STD_ID_LEN 5
+typedef struct _VOLSTRUCTDESC
+{
+ UCHAR Type;
+ UCHAR Ident[VSD_STD_ID_LEN];
+ UCHAR Version;
+ UCHAR Data[2041];
+} VOLSTRUCTDESC, *PVOLSTRUCTDESC;
+
diff --git a/reactos/drivers/filesystems/msfs/msfs.h b/reactos/drivers/filesystems/msfs/msfs.h
index ad11bd56b30..9b0b3fa1b82 100644
--- a/reactos/drivers/filesystems/msfs/msfs.h
+++ b/reactos/drivers/filesystems/msfs/msfs.h
@@ -12,21 +12,7 @@
#include
#include
-/*
- * FIXME: GCC doesn't have a working option for defaulting to a calling
- * convention. It will always default to cdecl. The MS DDK was designed
- * for compilers which support this option, and thus some of their headers
- * do not specify STDCALL or NTAPI everywhere. As such, callbacks will be
- * interpreted as cdecl on gcc, while they should be stdcall. Defining
- * NTAPI manually won't work either, since msvc will realize that the
- * two definitions are different. So we have to use something to close
- * the compatibility gap, until someone fixes gcc.
- */
-#ifdef _MSC_VER
-#define DEFAULTAPI
-#else
-#define DEFAULTAPI __stdcall
-#endif
+#define DEFAULTAPI NTAPI
typedef struct _MSFS_DEVICE_EXTENSION
{
diff --git a/reactos/drivers/input/i8042prt/mouse.c b/reactos/drivers/input/i8042prt/mouse.c
index b0effe8051a..11838134667 100644
--- a/reactos/drivers/input/i8042prt/mouse.c
+++ b/reactos/drivers/input/i8042prt/mouse.c
@@ -638,7 +638,7 @@ i8042MouResetIsr(
DeviceExtension->MouseTimeoutState = TimeoutStart;
PortDeviceExtension = DeviceExtension->Common.PortDeviceExtension;
- switch (DeviceExtension->MouseResetState)
+ switch ((ULONG)DeviceExtension->MouseResetState)
{
case 1100: /* the first ack, drop it. */
DeviceExtension->MouseResetState = ExpectingReset;
diff --git a/reactos/drivers/ksfilter/ks/allocators.c b/reactos/drivers/ksfilter/ks/allocators.c
index 21637ae87cf..9880dea7ce8 100644
--- a/reactos/drivers/ksfilter/ks/allocators.c
+++ b/reactos/drivers/ksfilter/ks/allocators.c
@@ -1,8 +1,365 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/allocators.c
+ * PURPOSE: KS Allocator functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
#include "priv.h"
+typedef enum
+{
+ ALLOCATOR_NPAGED_LOOKASIDE,
+ ALLOCATOR_PAGED_LOOKASIDE,
+ ALLOCATOR_CUSTOM
+}ALLOCATOR_TYPE;
+
+typedef enum
+{
+ ALLOCATOR_DEVICE_CONTROL,
+ ALLOCATOR_DEVICE_CLOSE,
+ ALLOCATOR_ALLOCATE,
+ ALLOCATOR_FREE
+
+}ALLOC_REQUEST;
+
+typedef PVOID (*PFNKSPAGEDPOOLALLOCATE)(IN PPAGED_LOOKASIDE_LIST Lookaside);
+typedef PVOID (*PFNKSNPAGEDPOOLALLOCATE)(IN PNPAGED_LOOKASIDE_LIST Lookaside);
+
+typedef VOID (*PFNKSPAGEDPOOLFREE)(IN PPAGED_LOOKASIDE_LIST Lookaside, IN PVOID Entry);
+typedef VOID (*PFNKSNPAGEDPOOLFREE)(IN PNPAGED_LOOKASIDE_LIST Lookaside, IN PVOID Entry);
+
+typedef VOID (NTAPI *PFNKSNPAGEDPOOLDELETE)(IN PNPAGED_LOOKASIDE_LIST Lookaside);
+typedef VOID (NTAPI *PFNKSPAGEDPOOLDELETE)(IN PPAGED_LOOKASIDE_LIST Lookaside);
+
+typedef struct
+{
+ IKsAllocatorVtbl *lpVtbl;
+ LONG ref;
+ PKSIOBJECT_HEADER Header;
+ ALLOCATOR_TYPE Type;
+
+ KSSTREAMALLOCATOR_STATUS Status;
+
+ union
+ {
+ NPAGED_LOOKASIDE_LIST NPagedList;
+ PAGED_LOOKASIDE_LIST PagedList;
+ PVOID CustomList;
+ }u;
+
+ union
+ {
+ PFNKSDEFAULTALLOCATE DefaultAllocate;
+ PFNKSPAGEDPOOLALLOCATE PagedPool;
+ PFNKSNPAGEDPOOLALLOCATE NPagedPool;
+ }Allocate;
+
+ union
+ {
+ PFNKSDEFAULTFREE DefaultFree;
+ PFNKSPAGEDPOOLFREE PagedPool;
+ PFNKSNPAGEDPOOLFREE NPagedPool;
+ }Free;
+
+ union
+ {
+ PFNKSDELETEALLOCATOR DefaultDelete;
+ PFNKSNPAGEDPOOLDELETE NPagedPool;
+ PFNKSPAGEDPOOLDELETE PagedPool;
+ }Delete;
+
+}ALLOCATOR, *PALLOCATOR;
+
+/* use KSNAME_Allocator for IID_IKsAllocator */
+const GUID IID_IKsAllocator = {0x642F5D00L, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
+const GUID KSPROPSETID_StreamAllocator = {0x0cf6e4342, 0xec87, 0x11cf, {0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}};
+
+
+NTSTATUS
+NTAPI
+IKsAllocator_Allocate(
+ IN PFILE_OBJECT FileObject,
+ PVOID *Frame);
+
+VOID
+NTAPI
+IKsAllocator_FreeFrame(
+ IN PFILE_OBJECT FileObject,
+ PVOID Frame);
+
+
+NTSTATUS
+NTAPI
+IKsAllocator_fnQueryInterface(
+ IKsAllocator * iface,
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ PALLOCATOR This = (PALLOCATOR)CONTAINING_RECORD(iface, ALLOCATOR, lpVtbl);
+
+ if (IsEqualGUIDAligned(refiid, &IID_IUnknown) ||
+ IsEqualGUIDAligned(refiid, &IID_IKsAllocator))
+ {
+ *Output = &This->lpVtbl;
+ _InterlockedIncrement(&This->ref);
+ return STATUS_SUCCESS;
+ }
+ return STATUS_UNSUCCESSFUL;
+}
+
+ULONG
+NTAPI
+IKsAllocator_fnAddRef(
+ IKsAllocator * iface)
+{
+ PALLOCATOR This = (PALLOCATOR)CONTAINING_RECORD(iface, ALLOCATOR, lpVtbl);
+
+ return InterlockedIncrement(&This->ref);
+}
+
+ULONG
+NTAPI
+IKsAllocator_fnRelease(
+ IKsAllocator * iface)
+{
+ PALLOCATOR This = (PALLOCATOR)CONTAINING_RECORD(iface, ALLOCATOR, lpVtbl);
+
+ InterlockedDecrement(&This->ref);
+
+ if (This->ref == 0)
+ {
+ FreeItem(This);
+ return 0;
+ }
+ /* Return new reference count */
+ return This->ref;
+}
+
+NTSTATUS
+NTAPI
+IKsAllocator_fnDeviceIoControl(
+ IKsAllocator *iface,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PALLOCATOR This = (PALLOCATOR)CONTAINING_RECORD(iface, ALLOCATOR, lpVtbl);
+ PIO_STACK_LOCATION IoStack;
+ PKSSTREAMALLOCATOR_FUNCTIONTABLE FunctionTable;
+ PKSSTREAMALLOCATOR_STATUS State;
+ PKSPROPERTY Property;
+
+ /* FIXME locks */
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY)
+ {
+ /* only KSPROPERTY requests are supported */
+ UNIMPLEMENTED
+
+ /* complete and forget irps */
+ Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSPROPERTY))
+ {
+ /* invalid request */
+ Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return STATUS_INVALID_DEVICE_REQUEST;
+ }
+
+ /* check the request */
+ Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
+
+ if (IsEqualGUIDAligned(&Property->Set, &KSPROPSETID_StreamAllocator))
+ {
+ if (Property->Id == KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE)
+ {
+ if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE))
+ {
+ /* buffer too small */
+ Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
+ Irp->IoStatus.Information = sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE);
+ /* complete and forget irp */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+ if (!(Property->Flags & KSPROPERTY_TYPE_GET))
+ {
+ /* only support retrieving the property */
+ Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+ /* complete and forget irp */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* get output buffer */
+ FunctionTable = (PKSSTREAMALLOCATOR_FUNCTIONTABLE)Irp->UserBuffer;
+
+ FunctionTable->AllocateFrame = IKsAllocator_Allocate;
+ FunctionTable->FreeFrame = IKsAllocator_FreeFrame;
+
+ /* save result */
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE);
+ /* complete request */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+ }
+ else if (Property->Id == KSPROPERTY_STREAMALLOCATOR_STATUS)
+ {
+ if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KSPROPERTY_STREAMALLOCATOR_STATUS))
+ {
+ /* buffer too small */
+ Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
+ Irp->IoStatus.Information = sizeof(KSPROPERTY_STREAMALLOCATOR_STATUS);
+ /* complete and forget irp */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+ if (!(Property->Flags & KSPROPERTY_TYPE_GET))
+ {
+ /* only support retrieving the property */
+ Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+ /* complete and forget irp */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* get output buffer */
+ State = (PKSSTREAMALLOCATOR_STATUS)Irp->UserBuffer;
+
+ /* copy allocator status */
+ RtlMoveMemory(State, &This->Status, sizeof(KSSTREAMALLOCATOR_STATUS));
+
+ /* save result */
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = sizeof(KSSTREAMALLOCATOR_STATUS);
+
+ /* complete request */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+ }
+ }
+
+ /* unhandeled request */
+ Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return STATUS_NOT_SUPPORTED;
+}
+
+NTSTATUS
+NTAPI
+IKsAllocator_fnClose(
+ IKsAllocator *iface)
+{
+ PALLOCATOR This = (PALLOCATOR)CONTAINING_RECORD(iface, ALLOCATOR, lpVtbl);
+
+ /* FIXME locks */
+
+ /* now close allocator */
+ if (This->Type == ALLOCATOR_CUSTOM)
+ {
+ This->Delete.DefaultDelete(This->u.CustomList);
+ }
+ else if (This->Type == ALLOCATOR_NPAGED_LOOKASIDE)
+ {
+ This->Delete.NPagedPool(&This->u.NPagedList);
+ }
+ else if (This->Type == ALLOCATOR_PAGED_LOOKASIDE)
+ {
+ This->Delete.PagedPool(&This->u.PagedList);
+ }
+
+ /* free object header */
+ KsFreeObjectHeader(&This->Header);
+
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+IKsAllocator_fnAllocateFrame(
+ IKsAllocator *iface,
+ IN PVOID * OutFrame)
+{
+ PVOID Frame = NULL;
+ PALLOCATOR This = (PALLOCATOR)CONTAINING_RECORD(iface, ALLOCATOR, lpVtbl);
+
+ /* FIXME locks */
+
+ /* now allocate frame */
+ if (This->Type == ALLOCATOR_CUSTOM)
+ {
+ Frame = This->Allocate.DefaultAllocate(This->u.CustomList);
+ }
+ else if (This->Type == ALLOCATOR_NPAGED_LOOKASIDE)
+ {
+ Frame = This->Allocate.NPagedPool(&This->u.NPagedList);
+ }
+ else if (This->Type == ALLOCATOR_PAGED_LOOKASIDE)
+ {
+ Frame = This->Allocate.PagedPool(&This->u.PagedList);
+ }
+
+ if (Frame)
+ {
+ *OutFrame = Frame;
+ InterlockedIncrement((PLONG)This->Status.AllocatedFrames);
+ return STATUS_SUCCESS;
+ }
+
+ return STATUS_UNSUCCESSFUL;
+}
+
+VOID
+NTAPI
+IKsAllocator_fnFreeFrame(
+ IKsAllocator *iface,
+ IN PVOID Frame)
+{
+ PALLOCATOR This = (PALLOCATOR)CONTAINING_RECORD(iface, ALLOCATOR, lpVtbl);
+
+ /* now allocate frame */
+ if (This->Type == ALLOCATOR_CUSTOM)
+ {
+ This->Free.DefaultFree(This->u.CustomList, Frame);
+ }
+ else if (This->Type == ALLOCATOR_NPAGED_LOOKASIDE)
+ {
+ This->Free.NPagedPool(&This->u.NPagedList, Frame);
+ }
+ else if (This->Type == ALLOCATOR_PAGED_LOOKASIDE)
+ {
+ This->Free.PagedPool(&This->u.PagedList, Frame);
+ }
+}
+
+
+static IKsAllocatorVtbl vt_IKsAllocator =
+{
+ IKsAllocator_fnQueryInterface,
+ IKsAllocator_fnAddRef,
+ IKsAllocator_fnRelease,
+ IKsAllocator_fnDeviceIoControl,
+ IKsAllocator_fnClose,
+ IKsAllocator_fnAllocateFrame,
+ IKsAllocator_fnFreeFrame
+};
+
/*
- @unimplemented
+ @implemented
*/
KSDDKAPI NTSTATUS NTAPI
KsCreateAllocator(
@@ -10,8 +367,12 @@ KsCreateAllocator(
IN PKSALLOCATOR_FRAMING AllocatorFraming,
OUT PHANDLE AllocatorHandle)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ return KspCreateObjectType(ConnectionHandle,
+ KSSTRING_Allocator,
+ (PVOID)AllocatorFraming,
+ sizeof(KSALLOCATOR_FRAMING),
+ GENERIC_READ,
+ AllocatorHandle);
}
/*
@@ -25,19 +386,189 @@ KsCreateDefaultAllocator(
}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsValidateAllocatorCreateRequest(
IN PIRP Irp,
- OUT PKSALLOCATOR_FRAMING* AllocatorFraming)
+ OUT PKSALLOCATOR_FRAMING* OutAllocatorFraming)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ PKSALLOCATOR_FRAMING AllocatorFraming;
+ ULONG Size;
+ NTSTATUS Status;
+ ULONG SupportedFlags;
+
+ /* set minimum request size */
+ Size = sizeof(KSALLOCATOR_FRAMING);
+
+ Status = KspCopyCreateRequest(Irp,
+ KSSTRING_Allocator,
+ &Size,
+ (PVOID*)&AllocatorFraming);
+
+ if (!NT_SUCCESS(Status))
+ return Status;
+
+ /* allowed supported flags */
+ SupportedFlags = (KSALLOCATOR_OPTIONF_COMPATIBLE | KSALLOCATOR_OPTIONF_SYSTEM_MEMORY |
+ KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER | KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY | KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY |
+ KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE);
+
+
+ if (!AllocatorFraming->FrameSize || (AllocatorFraming->OptionsFlags & (~SupportedFlags)))
+ {
+ FreeItem(AllocatorFraming);
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* store result */
+ *OutAllocatorFraming = AllocatorFraming;
+
+ return Status;
}
+NTSTATUS
+IKsAllocator_DispatchRequest(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PFILE_OBJECT FileObject,
+ IN PIRP Irp,
+ IN PVOID Frame,
+ IN ALLOC_REQUEST Request)
+{
+ PKSIOBJECT_HEADER Header;
+ NTSTATUS Status;
+ IKsAllocator * Allocator;
+
+ /* sanity check */
+ ASSERT(FileObject);
+
+ /* get object header */
+ Header = (PKSIOBJECT_HEADER)FileObject->FsContext;
+
+ /* get real allocator */
+ Status = Header->Unknown->lpVtbl->QueryInterface(Header->Unknown, &IID_IKsAllocator, (PVOID*)&Allocator);
+
+ if (!NT_SUCCESS(Status))
+ {
+ /* misbehaving object */
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ if (Request == ALLOCATOR_DEVICE_CONTROL)
+ {
+ /* dispatch request allocator */
+ Status = Allocator->lpVtbl->DispatchDeviceIoControl(Allocator, DeviceObject, Irp);
+ }
+ else if (Request == ALLOCATOR_DEVICE_CLOSE)
+ {
+ /* delete allocator */
+ Status = Allocator->lpVtbl->Close(Allocator);
+ }
+ else if (Request == ALLOCATOR_ALLOCATE)
+ {
+ /* allocate frame */
+ Status = Allocator->lpVtbl->AllocateFrame(Allocator, (PVOID*)Frame);
+
+ }else if (Request == ALLOCATOR_FREE)
+ {
+ /* allocate frame */
+ Allocator->lpVtbl->FreeFrame(Allocator, Frame);
+ Status = STATUS_SUCCESS;
+ }
+
+ /* release interface */
+ Allocator->lpVtbl->Release(Allocator);
+
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+IKsAllocator_DispatchDeviceIoControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ NTSTATUS Status;
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* dispatch request */
+ Status = IKsAllocator_DispatchRequest(DeviceObject, IoStack->FileObject, Irp, NULL, ALLOCATOR_DEVICE_CONTROL);
+
+ /* complete request */
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+IKsAllocator_DispatchClose(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ NTSTATUS Status;
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* dispatch request */
+ Status = IKsAllocator_DispatchRequest(DeviceObject, IoStack->FileObject, Irp, NULL, ALLOCATOR_DEVICE_CLOSE);
+
+ /* complete request */
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+IKsAllocator_Allocate(
+ IN PFILE_OBJECT FileObject,
+ PVOID *Frame)
+{
+ NTSTATUS Status;
+
+ /* dispatch request */
+ Status = IKsAllocator_DispatchRequest(NULL, FileObject, NULL, (PVOID)Frame, ALLOCATOR_ALLOCATE);
+
+ return Status;
+}
+
+VOID
+NTAPI
+IKsAllocator_FreeFrame(
+ IN PFILE_OBJECT FileObject,
+ PVOID Frame)
+{
+ /* dispatch request */
+ IKsAllocator_DispatchRequest(NULL, FileObject, NULL, Frame, ALLOCATOR_FREE);
+}
+
+
+static KSDISPATCH_TABLE DispatchTable =
+{
+ IKsAllocator_DispatchDeviceIoControl,
+ KsDispatchInvalidDeviceRequest,
+ KsDispatchInvalidDeviceRequest,
+ KsDispatchInvalidDeviceRequest,
+ IKsAllocator_DispatchClose,
+ KsDispatchQuerySecurity,
+ KsDispatchSetSecurity,
+ KsDispatchFastIoDeviceControlFailure,
+ KsDispatchFastReadFailure,
+ KsDispatchFastReadFailure,
+};
+
/*
- @unimplemented
+ @implemented
*/
KSDDKAPI NTSTATUS NTAPI
KsCreateDefaultAllocatorEx(
@@ -50,17 +581,81 @@ KsCreateDefaultAllocatorEx(
{
NTSTATUS Status;
PKSALLOCATOR_FRAMING AllocatorFraming;
+ PALLOCATOR Allocator;
+ PVOID Ctx;
- Status = KsValidateAllocatorCreateRequest(Irp, &AllocatorFraming);
- if (!NT_SUCCESS(Status))
- return STATUS_INVALID_PARAMETER;
+ /* first validate connect request */
+ Status = KsValidateAllocatorCreateRequest(Irp, &AllocatorFraming);
+ if (!NT_SUCCESS(Status))
+ return STATUS_INVALID_PARAMETER;
+ /* check the valid file alignment */
+ if (AllocatorFraming->FileAlignment > (PAGE_SIZE-1))
+ return STATUS_INVALID_PARAMETER;
- return STATUS_UNSUCCESSFUL;
+ /* allocate allocator struct */
+ Allocator = AllocateItem(NonPagedPool, sizeof(ALLOCATOR));
+ if (!Allocator)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* allocate object header */
+
+ Status = KsAllocateObjectHeader((KSOBJECT_HEADER*)&Allocator->Header, 0, NULL, Irp, &DispatchTable);
+ if (!NT_SUCCESS(Status))
+ {
+ FreeItem(Allocator);
+ return Status;
+ }
+
+ /* set allocator type in object header */
+ Allocator->lpVtbl = &vt_IKsAllocator;
+ Allocator->Header->Unknown = (PUNKNOWN)&Allocator->lpVtbl;
+ Allocator->ref = 1;
+
+ if (DefaultAllocate)
+ {
+ /* use external allocator */
+ Allocator->Type = ALLOCATOR_CUSTOM;
+ Allocator->Allocate.DefaultAllocate = DefaultAllocate;
+ Allocator->Free.DefaultFree = DefaultFree;
+ Allocator->Delete.DefaultDelete = DeleteAllocator;
+ Ctx = InitializeAllocator(InitializeContext, AllocatorFraming, &Allocator->u.CustomList);
+ /* check for success */
+ if (!Ctx)
+ {
+ KsFreeObjectHeader(Allocator->Header);
+ FreeItem(Allocator);
+ return Status;
+ }
+ }
+ else if (AllocatorFraming->PoolType == NonPagedPool)
+ {
+ /* use non-paged pool allocator */
+ Allocator->Type = ALLOCATOR_NPAGED_LOOKASIDE;
+ Allocator->Allocate.NPagedPool = ExAllocateFromNPagedLookasideList;
+ Allocator->Free.NPagedPool = ExFreeToNPagedLookasideList;
+ Allocator->Delete.NPagedPool = ExDeleteNPagedLookasideList;
+ ExInitializeNPagedLookasideList(&Allocator->u.NPagedList, NULL, NULL, 0, AllocatorFraming->FrameSize, 0, 0);
+ }
+ else if (AllocatorFraming->PoolType == PagedPool)
+ {
+ /* use paged pool allocator */
+ Allocator->Allocate.PagedPool = ExAllocateFromPagedLookasideList;
+ Allocator->Free.PagedPool = ExFreeToPagedLookasideList;
+ Allocator->Delete.PagedPool = ExDeletePagedLookasideList;
+ Allocator->Type = ALLOCATOR_PAGED_LOOKASIDE;
+ ExInitializePagedLookasideList(&Allocator->u.PagedList, NULL, NULL, 0, AllocatorFraming->FrameSize, 0, 0);
+
+ }
+
+ /* backup allocator framing */
+ RtlMoveMemory(&Allocator->Status.Framing, AllocatorFraming, sizeof(KSALLOCATOR_FRAMING));
+
+ return Status;
}
/*
- @unimplemented
+ @implemented
*/
KSDDKAPI NTSTATUS NTAPI
KsValidateAllocatorFramingEx(
@@ -68,6 +663,18 @@ KsValidateAllocatorFramingEx(
IN ULONG BufferSize,
IN const KSALLOCATOR_FRAMING_EX* PinFraming)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ if (BufferSize < sizeof(KSALLOCATOR_FRAMING_EX))
+ return STATUS_INVALID_DEVICE_REQUEST;
+
+ /* verify framing */
+ if ((Framing->FramingItem[0].Flags & KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT) &&
+ Framing->OutputCompression.RatioNumerator != (ULONG)-1 &&
+ Framing->OutputCompression.RatioDenominator != 0 &&
+ Framing->OutputCompression.RatioDenominator < Framing->OutputCompression.RatioNumerator)
+ {
+ /* framing request is ok */
+ return STATUS_SUCCESS;
+ }
+
+ return STATUS_INVALID_DEVICE_REQUEST;
}
diff --git a/reactos/drivers/ksfilter/ks/api.c b/reactos/drivers/ksfilter/ks/api.c
new file mode 100644
index 00000000000..0e50f313f70
--- /dev/null
+++ b/reactos/drivers/ksfilter/ks/api.c
@@ -0,0 +1,1581 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/api.c
+ * PURPOSE: KS API functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
+#include "priv.h"
+
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsAcquireResetValue(
+ IN PIRP Irp,
+ OUT KSRESET* ResetValue)
+{
+ UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsAcquireDeviceSecurityLock(
+ IN KSDEVICE_HEADER DevHeader,
+ IN BOOLEAN Exclusive)
+{
+ NTSTATUS Status;
+ PKSIDEVICE_HEADER Header = (PKSIDEVICE_HEADER)DevHeader;
+
+ KeEnterCriticalRegion();
+
+ if (Exclusive)
+ {
+ Status = ExAcquireResourceExclusiveLite(&Header->SecurityLock, TRUE);
+ }
+ else
+ {
+ Status = ExAcquireResourceSharedLite(&Header->SecurityLock, TRUE);
+ }
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsReleaseDeviceSecurityLock(
+ IN KSDEVICE_HEADER DevHeader)
+{
+ PKSIDEVICE_HEADER Header = (PKSIDEVICE_HEADER)DevHeader;
+
+ ExReleaseResourceLite(&Header->SecurityLock);
+ KeLeaveCriticalRegion();
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsDefaultDispatchPnp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PIO_STACK_LOCATION IoStack;
+ PDEVICE_OBJECT PnpDeviceObject;
+ NTSTATUS Status;
+ ULONG MinorFunction;
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* caller wants to add the target device */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* get device header */
+ DeviceHeader = (PKSIDEVICE_HEADER)DeviceExtension->DeviceHeader;
+
+ /* backup PnpBaseObject */
+ PnpDeviceObject = DeviceHeader->PnpDeviceObject;
+
+
+ /* backup minor function code */
+ MinorFunction = IoStack->MinorFunction;
+
+ if(MinorFunction == IRP_MN_REMOVE_DEVICE)
+ {
+ /* remove the device */
+ KsFreeDeviceHeader((KSDEVICE_HEADER)DeviceHeader);
+ }
+
+ /* skip current irp stack */
+ IoSkipCurrentIrpStackLocation(Irp);
+
+ /* call attached pnp device object */
+ Status = IoCallDriver(PnpDeviceObject, Irp);
+
+ if (MinorFunction == IRP_MN_REMOVE_DEVICE)
+ {
+ /* time is over */
+ IoDetachDevice(PnpDeviceObject);
+ /* delete device */
+ IoDeleteDevice(DeviceObject);
+ }
+ /* done */
+ return Status;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsDefaultDispatchPower(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PKSIOBJECT_HEADER ObjectHeader;
+ PIO_STACK_LOCATION IoStack;
+ PLIST_ENTRY ListEntry;
+ NTSTATUS Status;
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* caller wants to add the target device */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* get device header */
+ DeviceHeader = (PKSIDEVICE_HEADER)DeviceExtension->DeviceHeader;
+
+ /* FIXME locks */
+
+ /* loop our power dispatch list and call registered notification functions */
+ ListEntry = DeviceHeader->PowerDispatchList.Flink;
+ /* let's go */
+ while(ListEntry != &DeviceHeader->PowerDispatchList)
+ {
+ /* get object header */
+ ObjectHeader = (PKSIOBJECT_HEADER)CONTAINING_RECORD(ListEntry, KSIOBJECT_HEADER, PowerDispatchEntry);
+
+ /* does it have still a cb */
+ if (ObjectHeader->PowerDispatch)
+ {
+ /* call the power cb */
+ Status = ObjectHeader->PowerDispatch(ObjectHeader->PowerContext, Irp);
+ ASSERT(NT_SUCCESS(Status));
+ }
+
+ /* iterate to next entry */
+ ListEntry = ListEntry->Flink;
+ }
+
+ /* start next power irp */
+ PoStartNextPowerIrp(Irp);
+
+ /* skip current irp stack location */
+ IoSkipCurrentIrpStackLocation(Irp);
+
+ /* let's roll */
+ Status = PoCallDriver(DeviceHeader->PnpDeviceObject, Irp);
+
+ /* done */
+ return Status;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsDefaultForwardIrp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PIO_STACK_LOCATION IoStack;
+ NTSTATUS Status;
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* caller wants to add the target device */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* get device header */
+ DeviceHeader = (PKSIDEVICE_HEADER)DeviceExtension->DeviceHeader;
+
+ /* forward the request to the PDO */
+ Status = IoCallDriver(DeviceHeader->PnpDeviceObject, Irp);
+
+ return Status;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsSetDevicePnpAndBaseObject(
+ IN KSDEVICE_HEADER Header,
+ IN PDEVICE_OBJECT PnpDeviceObject,
+ IN PDEVICE_OBJECT BaseDevice)
+{
+ PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header;
+
+ DeviceHeader->PnpDeviceObject = PnpDeviceObject;
+ DeviceHeader->BaseDevice = BaseDevice;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+PDEVICE_OBJECT
+NTAPI
+KsQueryDevicePnpObject(
+ IN KSDEVICE_HEADER Header)
+{
+ PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header;
+
+ /* return PnpDeviceObject */
+ return DeviceHeader->PnpDeviceObject;
+
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+ACCESS_MASK
+NTAPI
+KsQueryObjectAccessMask(
+ IN KSOBJECT_HEADER Header)
+{
+ PKSIOBJECT_HEADER ObjectHeader = (PKSIOBJECT_HEADER)Header;
+
+ /* return access mask */
+ return ObjectHeader->AccessMask;
+
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsRecalculateStackDepth(
+ IN KSDEVICE_HEADER Header,
+ IN BOOLEAN ReuseStackLocation)
+{
+ UNIMPLEMENTED;
+}
+
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsSetTargetState(
+ IN KSOBJECT_HEADER Header,
+ IN KSTARGET_STATE TargetState)
+{
+ PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header;
+
+ /* set target state */
+ DeviceHeader->TargetState = TargetState;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsSetTargetDeviceObject(
+ IN KSOBJECT_HEADER Header,
+ IN PDEVICE_OBJECT TargetDevice OPTIONAL)
+{
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PKSIOBJECT_HEADER ObjectHeader = (PKSIOBJECT_HEADER)Header;
+
+ if(ObjectHeader->TargetDevice)
+ {
+ /* there is already a target device set */
+ if (!TargetDevice)
+ {
+ /* caller wants to remove the target device */
+ DeviceExtension = (PDEVICE_EXTENSION)ObjectHeader->TargetDevice->DeviceExtension;
+
+ /* get device header */
+ DeviceHeader = (PKSIDEVICE_HEADER)DeviceExtension->DeviceHeader;
+
+ /* acquire lock */
+ KsAcquireDeviceSecurityLock((KSDEVICE_HEADER)DeviceHeader, FALSE);
+
+ /* remove entry */
+ RemoveEntryList(&ObjectHeader->TargetDeviceListEntry);
+
+ /* remove device pointer */
+ ObjectHeader->TargetDevice = NULL;
+
+ /* release lock */
+ KsReleaseDeviceSecurityLock((KSDEVICE_HEADER)DeviceHeader);
+ }
+ }
+ else
+ {
+ /* no target device yet set */
+ if (TargetDevice)
+ {
+ /* caller wants to add the target device */
+ DeviceExtension = (PDEVICE_EXTENSION)TargetDevice->DeviceExtension;
+
+ /* get device header */
+ DeviceHeader = (PKSIDEVICE_HEADER)DeviceExtension->DeviceHeader;
+
+ /* acquire lock */
+ KsAcquireDeviceSecurityLock((KSDEVICE_HEADER)DeviceHeader, FALSE);
+
+ /* insert list entry */
+ InsertTailList(&DeviceHeader->TargetDeviceList, &ObjectHeader->TargetDeviceListEntry);
+
+ /* store target device */
+ ObjectHeader->TargetDevice = TargetDevice;
+
+ /* release lock */
+ KsReleaseDeviceSecurityLock((KSDEVICE_HEADER)DeviceHeader);
+ }
+ }
+
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsSetPowerDispatch(
+ IN KSOBJECT_HEADER Header,
+ IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL,
+ IN PVOID PowerContext OPTIONAL)
+{
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PKSIOBJECT_HEADER ObjectHeader = (PKSIOBJECT_HEADER)Header;
+
+ /* caller wants to add the target device */
+ DeviceExtension = (PDEVICE_EXTENSION)ObjectHeader->ParentDeviceObject->DeviceExtension;
+
+ /* get device header */
+ DeviceHeader = (PKSIDEVICE_HEADER)DeviceExtension->DeviceHeader;
+
+ /* acquire lock */
+ KsAcquireDeviceSecurityLock((KSDEVICE_HEADER)DeviceHeader, FALSE);
+
+ if (PowerDispatch)
+ {
+ /* add power dispatch entry */
+ InsertTailList(&DeviceHeader->PowerDispatchList, &ObjectHeader->PowerDispatchEntry);
+
+ /* store function and context */
+ ObjectHeader->PowerDispatch = PowerDispatch;
+ ObjectHeader->PowerContext = PowerContext;
+ }
+ else
+ {
+ /* remove power dispatch entry */
+ RemoveEntryList(&ObjectHeader->PowerDispatchEntry);
+
+ /* store function and context */
+ ObjectHeader->PowerDispatch = NULL;
+ ObjectHeader->PowerContext = NULL;
+
+ }
+
+ /* release lock */
+ KsReleaseDeviceSecurityLock((KSDEVICE_HEADER)DeviceHeader);
+}
+
+
+/*
+ @implemented
+*/
+KSDDKAPI
+PKSOBJECT_CREATE_ITEM
+NTAPI
+KsQueryObjectCreateItem(
+ IN KSOBJECT_HEADER Header)
+{
+ PKSIOBJECT_HEADER ObjectHeader = (PKSIOBJECT_HEADER)Header;
+ return ObjectHeader->OriginalCreateItem;
+}
+
+NTSTATUS
+KspAddCreateItemToList(
+ OUT PLIST_ENTRY ListHead,
+ IN ULONG ItemsCount,
+ IN PKSOBJECT_CREATE_ITEM ItemsList)
+{
+ ULONG Index;
+ PCREATE_ITEM_ENTRY Entry;
+
+ /* add the items */
+ for(Index = 0; Index < ItemsCount; Index++)
+ {
+ /* allocate item */
+ Entry = AllocateItem(NonPagedPool, sizeof(CREATE_ITEM_ENTRY));
+ if (!Entry)
+ {
+ /* no memory */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* initialize entry */
+ InitializeListHead(&Entry->ObjectItemList);
+ Entry->CreateItem = &ItemsList[Index];
+ Entry->ReferenceCount = 0;
+ Entry->ItemFreeCallback = NULL;
+
+ InsertTailList(ListHead, &Entry->Entry);
+ }
+ return STATUS_SUCCESS;
+}
+
+VOID
+KspFreeCreateItems(
+ PLIST_ENTRY ListHead)
+{
+ PCREATE_ITEM_ENTRY Entry;
+
+ while(!IsListEmpty(ListHead))
+ {
+ /* remove create item from list */
+ Entry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(RemoveHeadList(ListHead), CREATE_ITEM_ENTRY, Entry);
+
+ /* caller shouldnt have any references */
+ ASSERT(Entry->ReferenceCount == 0);
+ ASSERT(IsListEmpty(&Entry->ObjectItemList));
+
+ /* does the creator wish notification */
+ if (Entry->ItemFreeCallback)
+ {
+ /* notify creator */
+ Entry->ItemFreeCallback(Entry->CreateItem);
+ }
+
+ /* free create item entry */
+ FreeItem(Entry);
+ }
+
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsAllocateDeviceHeader(
+ OUT KSDEVICE_HEADER* OutHeader,
+ IN ULONG ItemsCount,
+ IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ PKSIDEVICE_HEADER Header;
+
+ if (!OutHeader)
+ return STATUS_INVALID_PARAMETER;
+
+ /* allocate a device header */
+ Header = ExAllocatePoolWithTag(PagedPool, sizeof(KSIDEVICE_HEADER), TAG_DEVICE_HEADER);
+
+ /* check for success */
+ if (!Header)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* clear all memory */
+ RtlZeroMemory(Header, sizeof(KSIDEVICE_HEADER));
+
+ /* initialize device mutex */
+ KeInitializeMutex(&Header->DeviceMutex, 0);
+
+ /* initialize target device list */
+ InitializeListHead(&Header->TargetDeviceList);
+ /* initialize power dispatch list */
+ InitializeListHead(&Header->PowerDispatchList);
+
+ /* initialize create item list */
+ InitializeListHead(&Header->ItemList);
+
+ /* are there any create items provided */
+ if (ItemsCount && ItemsList)
+ {
+ Status = KspAddCreateItemToList(&Header->ItemList, ItemsCount, ItemsList);
+
+ if (NT_SUCCESS(Status))
+ {
+ /* store item count */
+ Header->ItemListCount = ItemsCount;
+ }
+ else
+ {
+ /* release create items */
+ KspFreeCreateItems(&Header->ItemList);
+ }
+ }
+
+ /* store result */
+ *OutHeader = Header;
+
+ return Status;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsFreeDeviceHeader(
+ IN KSDEVICE_HEADER DevHeader)
+{
+ PKSIDEVICE_HEADER Header;
+
+ Header = (PKSIDEVICE_HEADER)DevHeader;
+
+ if (!DevHeader)
+ return;
+
+ KspFreeCreateItems(&Header->ItemList);
+ ExFreePoolWithTag(Header, TAG_DEVICE_HEADER);
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsAllocateObjectHeader(
+ OUT KSOBJECT_HEADER *Header,
+ IN ULONG ItemsCount,
+ IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL,
+ IN PIRP Irp,
+ IN KSDISPATCH_TABLE* Table)
+{
+ PIO_STACK_LOCATION IoStack;
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PKSIOBJECT_HEADER ObjectHeader;
+ PKSOBJECT_CREATE_ITEM CreateItem;
+ NTSTATUS Status;
+
+ if (!Header)
+ return STATUS_INVALID_PARAMETER_1;
+
+ if (!Irp)
+ return STATUS_INVALID_PARAMETER_4;
+
+ if (!Table)
+ return STATUS_INVALID_PARAMETER_5;
+
+ /* get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension;
+ /* get device header */
+ DeviceHeader = DeviceExtension->DeviceHeader;
+
+ /* sanity check */
+ ASSERT(IoStack->FileObject);
+ /* check for an file object */
+
+ /* allocate the object header */
+ ObjectHeader = ExAllocatePoolWithTag(NonPagedPool, sizeof(KSIOBJECT_HEADER), TAG_DEVICE_HEADER);
+ if (!ObjectHeader)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* initialize object header */
+ RtlZeroMemory(ObjectHeader, sizeof(KSIOBJECT_HEADER));
+
+ /* initialize create item list */
+ InitializeListHead(&ObjectHeader->ItemList);
+
+ /* get create item */
+ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+
+ /* do we have a name */
+ if (IoStack->FileObject->FileName.Buffer)
+ {
+ /* copy object class */
+ ObjectHeader->ObjectClass.MaximumLength = IoStack->FileObject->FileName.MaximumLength;
+ ObjectHeader->ObjectClass.Buffer = ExAllocatePoolWithTag(NonPagedPool, ObjectHeader->ObjectClass.MaximumLength, TAG_DEVICE_HEADER);
+ if (!ObjectHeader->ObjectClass.Buffer)
+ {
+ ExFreePoolWithTag(ObjectHeader, TAG_DEVICE_HEADER);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+ RtlCopyUnicodeString(&ObjectHeader->ObjectClass, &IoStack->FileObject->FileName);
+ }
+
+ /* copy dispatch table */
+ RtlCopyMemory(&ObjectHeader->DispatchTable, Table, sizeof(KSDISPATCH_TABLE));
+
+ /* store create items */
+ if (ItemsCount && ItemsList)
+ {
+ Status = KspAddCreateItemToList(&ObjectHeader->ItemList, ItemsCount, ItemsList);
+
+ if (NT_SUCCESS(Status))
+ {
+ /* store item count */
+ ObjectHeader->ItemListCount = ItemsCount;
+ }
+ else
+ {
+ /* destroy header*/
+ KsFreeObjectHeader(ObjectHeader);
+ return Status;
+ }
+ }
+ /* store the object in the file object */
+ ASSERT(IoStack->FileObject->FsContext == NULL);
+ IoStack->FileObject->FsContext = ObjectHeader;
+
+ /* store parent device */
+ ObjectHeader->ParentDeviceObject = IoGetRelatedDeviceObject(IoStack->FileObject);
+
+ /* store originating create item */
+ ObjectHeader->OriginalCreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+
+ /* FIXME store access mask see KsQueryObjectAccessMask */
+ ObjectHeader->AccessMask = IoStack->Parameters.Create.SecurityContext->DesiredAccess;
+
+
+ /* store result */
+ *Header = ObjectHeader;
+
+ DPRINT("KsAllocateObjectHeader ObjectClass %S FileObject %p, ObjectHeader %p\n", ObjectHeader->ObjectClass.Buffer, IoStack->FileObject, ObjectHeader);
+
+ return STATUS_SUCCESS;
+
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsFreeObjectHeader(
+ IN PVOID Header)
+{
+ PKSIOBJECT_HEADER ObjectHeader = (PKSIOBJECT_HEADER) Header;
+
+ if (ObjectHeader->ObjectClass.Buffer)
+ {
+ /* release object class buffer */
+ ExFreePoolWithTag(ObjectHeader->ObjectClass.Buffer, TAG_DEVICE_HEADER);
+ }
+
+ if (ObjectHeader->Unknown)
+ {
+ /* release associated object */
+ ObjectHeader->Unknown->lpVtbl->Release(ObjectHeader->Unknown);
+ }
+
+ /* free create items */
+ KspFreeCreateItems(&ObjectHeader->ItemList);
+
+ /* free object header */
+ ExFreePoolWithTag(ObjectHeader, TAG_DEVICE_HEADER);
+
+}
+
+NTSTATUS
+KspAddObjectCreateItemToList(
+ PLIST_ENTRY ListHead,
+ IN PDRIVER_DISPATCH Create,
+ IN PVOID Context,
+ IN PWCHAR ObjectClass,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor)
+{
+ PLIST_ENTRY Entry;
+ PCREATE_ITEM_ENTRY CreateEntry;
+
+ /* point to first entry */
+ Entry = ListHead->Flink;
+
+ while(Entry != ListHead)
+ {
+ /* get create entry */
+ CreateEntry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(Entry, CREATE_ITEM_ENTRY, Entry);
+ /* if the create item has no create routine, then it is free to use */
+ if (CreateEntry->CreateItem->Create == NULL)
+ {
+ /* sanity check */
+ ASSERT(IsListEmpty(&CreateEntry->ObjectItemList));
+ ASSERT(CreateEntry->ReferenceCount == 0);
+ /* use free entry */
+ CreateEntry->CreateItem->Context = Context;
+ CreateEntry->CreateItem->Create = Create;
+ RtlInitUnicodeString(&CreateEntry->CreateItem->ObjectClass, ObjectClass);
+ CreateEntry->CreateItem->SecurityDescriptor = SecurityDescriptor;
+
+ return STATUS_SUCCESS;
+ }
+
+ if (!wcsicmp(ObjectClass, CreateEntry->CreateItem->ObjectClass.Buffer))
+ {
+ /* the same object class already exists */
+ return STATUS_OBJECT_NAME_COLLISION;
+ }
+
+ /* iterate to next entry */
+ Entry = Entry->Flink;
+ }
+ return STATUS_ALLOTTED_SPACE_EXCEEDED;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsAddObjectCreateItemToDeviceHeader(
+ IN KSDEVICE_HEADER DevHeader,
+ IN PDRIVER_DISPATCH Create,
+ IN PVOID Context,
+ IN PWCHAR ObjectClass,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor)
+{
+ PKSIDEVICE_HEADER Header;
+ NTSTATUS Status;
+
+ Header = (PKSIDEVICE_HEADER)DevHeader;
+
+ DPRINT1("KsAddObjectCreateItemToDeviceHeader entered\n");
+
+ /* check if a device header has been provided */
+ if (!DevHeader)
+ return STATUS_INVALID_PARAMETER_1;
+
+ /* check if a create item has been provided */
+ if (!Create)
+ return STATUS_INVALID_PARAMETER_2;
+
+ /* check if a object class has been provided */
+ if (!ObjectClass)
+ return STATUS_INVALID_PARAMETER_4;
+
+ /* let others do the work */
+ Status = KspAddObjectCreateItemToList(&Header->ItemList, Create, Context, ObjectClass, SecurityDescriptor);
+
+ if (NT_SUCCESS(Status))
+ {
+ /* increment create item count */
+ InterlockedIncrement(&Header->ItemListCount);
+ }
+
+ return Status;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsAddObjectCreateItemToObjectHeader(
+ IN KSOBJECT_HEADER ObjectHeader,
+ IN PDRIVER_DISPATCH Create,
+ IN PVOID Context,
+ IN PWCHAR ObjectClass,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor)
+{
+ PKSIOBJECT_HEADER Header;
+ NTSTATUS Status;
+
+ Header = (PKSIOBJECT_HEADER)ObjectHeader;
+
+ DPRINT1("KsAddObjectCreateItemToDeviceHeader entered\n");
+
+ /* check if a device header has been provided */
+ if (!Header)
+ return STATUS_INVALID_PARAMETER_1;
+
+ /* check if a create item has been provided */
+ if (!Create)
+ return STATUS_INVALID_PARAMETER_2;
+
+ /* check if a object class has been provided */
+ if (!ObjectClass)
+ return STATUS_INVALID_PARAMETER_4;
+
+ /* let's work */
+ Status = KspAddObjectCreateItemToList(&Header->ItemList, Create, Context, ObjectClass, SecurityDescriptor);
+
+ if (NT_SUCCESS(Status))
+ {
+ /* increment create item count */
+ InterlockedIncrement(&Header->ItemListCount);
+ }
+
+ return Status;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsAllocateObjectCreateItem(
+ IN KSDEVICE_HEADER DevHeader,
+ IN PKSOBJECT_CREATE_ITEM CreateItem,
+ IN BOOLEAN AllocateEntry,
+ IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL)
+{
+ PCREATE_ITEM_ENTRY CreateEntry;
+ PKSIDEVICE_HEADER Header;
+ PKSOBJECT_CREATE_ITEM Item;
+
+ Header = (PKSIDEVICE_HEADER)DevHeader;
+
+ if (!DevHeader)
+ return STATUS_INVALID_PARAMETER_1;
+
+ if (!CreateItem)
+ return STATUS_INVALID_PARAMETER_2;
+
+ /* first allocate a create entry */
+ CreateEntry = AllocateItem(NonPagedPool, sizeof(PCREATE_ITEM_ENTRY));
+
+ /* check for allocation success */
+ if (!CreateEntry)
+ {
+ /* not enough resources */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+
+ if (AllocateEntry)
+ {
+ /* allocate create item */
+ Item = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
+ if (!Item)
+ {
+ /* no memory */
+ ExFreePool(CreateEntry);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* initialize descriptor */
+ Item->Context = CreateItem->Context;
+ Item->Create = CreateItem->Create;
+ Item->Flags = CreateItem->Flags;
+ Item->SecurityDescriptor = CreateItem->SecurityDescriptor;
+ Item->ObjectClass.Length = 0;
+ Item->ObjectClass.MaximumLength = CreateItem->ObjectClass.MaximumLength;
+
+ /* copy object class */
+ Item->ObjectClass.Buffer = ExAllocatePool(NonPagedPool, Item->ObjectClass.MaximumLength);
+ if (!Item->ObjectClass.Buffer)
+ {
+ /* release resources */
+ FreeItem(Item);
+ FreeItem(CreateEntry);
+
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+ RtlCopyUnicodeString(&Item->ObjectClass, &CreateItem->ObjectClass);
+ }
+ else
+ {
+ if (ItemFreeCallback)
+ {
+ /* callback is only accepted when the create item is copied */
+ ItemFreeCallback = NULL;
+ }
+ /* use passed create item */
+ Item = CreateItem;
+ }
+
+ /* initialize create item entry */
+ InitializeListHead(&CreateEntry->ObjectItemList);
+ CreateEntry->ItemFreeCallback = ItemFreeCallback;
+ CreateEntry->CreateItem = Item;
+ CreateEntry->ReferenceCount = 0;
+
+ /* now insert the create item entry */
+ InsertTailList(&Header->ItemList, &CreateEntry->Entry);
+
+ /* increment item count */
+ InterlockedIncrement(&Header->ItemListCount);
+
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+KspObjectFreeCreateItems(
+ IN KSDEVICE_HEADER Header,
+ IN PKSOBJECT_CREATE_ITEM CreateItem)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsFreeObjectCreateItem(
+ IN KSDEVICE_HEADER Header,
+ IN PUNICODE_STRING CreateItem)
+{
+ KSOBJECT_CREATE_ITEM Item;
+
+ RtlZeroMemory(&Item, sizeof(KSOBJECT_CREATE_ITEM));
+ RtlInitUnicodeString(&Item.ObjectClass, CreateItem->Buffer);
+
+ return KspObjectFreeCreateItems(Header, &Item);
+}
+
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsFreeObjectCreateItemsByContext(
+ IN KSDEVICE_HEADER Header,
+ IN PVOID Context)
+{
+ KSOBJECT_CREATE_ITEM Item;
+
+ RtlZeroMemory(&Item, sizeof(KSOBJECT_CREATE_ITEM));
+
+ Item.Context = Context;
+
+ return KspObjectFreeCreateItems(Header, &Item);
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsCreateDefaultSecurity(
+ IN PSECURITY_DESCRIPTOR ParentSecurity OPTIONAL,
+ OUT PSECURITY_DESCRIPTOR* DefaultSecurity)
+{
+ PGENERIC_MAPPING Mapping;
+ SECURITY_SUBJECT_CONTEXT SubjectContext;
+ NTSTATUS Status;
+
+ /* start capturing security context of calling thread */
+ SeCaptureSubjectContext(&SubjectContext);
+ /* get generic mapping */
+ Mapping = IoGetFileObjectGenericMapping();
+ /* build new descriptor */
+ Status = SeAssignSecurity(ParentSecurity, NULL, DefaultSecurity, FALSE, &SubjectContext, Mapping, NonPagedPool);
+ /* release security descriptor */
+ SeReleaseSubjectContext(&SubjectContext);
+ /* done */
+ return Status;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsForwardIrp(
+ IN PIRP Irp,
+ IN PFILE_OBJECT FileObject,
+ IN BOOLEAN ReuseStackLocation)
+{
+ UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
+}
+
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsForwardAndCatchIrp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PFILE_OBJECT FileObject,
+ IN KSSTACK_USE StackUse)
+{
+ UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
+}
+
+
+NTSTATUS
+NTAPI
+KspSynchronousIoControlDeviceCompletion(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PVOID Context)
+{
+ PIO_STATUS_BLOCK IoStatusBlock = (PIO_STATUS_BLOCK)Context;
+
+ IoStatusBlock->Information = Irp->IoStatus.Information;
+ IoStatusBlock->Status = Irp->IoStatus.Status;
+
+ return STATUS_SUCCESS;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsSynchronousIoControlDevice(
+ IN PFILE_OBJECT FileObject,
+ IN KPROCESSOR_MODE RequestorMode,
+ IN ULONG IoControl,
+ IN PVOID InBuffer,
+ IN ULONG InSize,
+ OUT PVOID OutBuffer,
+ IN ULONG OutSize,
+ OUT PULONG BytesReturned)
+{
+ PKSIOBJECT_HEADER ObjectHeader;
+ PDEVICE_OBJECT DeviceObject;
+ KEVENT Event;
+ PIRP Irp;
+ IO_STATUS_BLOCK IoStatusBlock;
+ PIO_STACK_LOCATION IoStack;
+ NTSTATUS Status;
+
+ /* check for valid file object */
+ if (!FileObject)
+ return STATUS_INVALID_PARAMETER;
+
+ /* get device object to send the request to */
+ DeviceObject = IoGetRelatedDeviceObject(FileObject);
+ if (!DeviceObject)
+ return STATUS_UNSUCCESSFUL;
+
+
+ /* get object header */
+ ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext;
+
+ /* check if there is fast device io function */
+ if (ObjectHeader && ObjectHeader->DispatchTable.FastDeviceIoControl)
+ {
+ IoStatusBlock.Status = STATUS_UNSUCCESSFUL;
+ IoStatusBlock.Information = 0;
+
+ /* it is send the request */
+ Status = ObjectHeader->DispatchTable.FastDeviceIoControl(FileObject, TRUE, InBuffer, InSize, OutBuffer, OutSize, IoControl, &IoStatusBlock, DeviceObject);
+ /* check if the request was handled */
+ //DPRINT("Handled %u Status %x Length %u\n", Status, IoStatusBlock.Status, IoStatusBlock.Information);
+ if (Status)
+ {
+ /* store bytes returned */
+ *BytesReturned = IoStatusBlock.Information;
+ /* return status */
+ return IoStatusBlock.Status;
+ }
+ }
+
+ /* initialize the event */
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+ /* create the irp */
+ Irp = IoBuildDeviceIoControlRequest(IoControl, DeviceObject, InBuffer, InSize, OutBuffer, OutSize, FALSE, &Event, &IoStatusBlock);
+
+ /* HACK */
+ IoStack = IoGetNextIrpStackLocation(Irp);
+ IoStack->FileObject = FileObject;
+
+ IoSetCompletionRoutine(Irp, KspSynchronousIoControlDeviceCompletion, (PVOID)&IoStatusBlock, TRUE, TRUE, TRUE);
+
+ Status = IoCallDriver(DeviceObject, Irp);
+ if (Status == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&Event, Executive, RequestorMode, FALSE, NULL);
+ Status = IoStatusBlock.Status;
+ }
+
+ *BytesReturned = IoStatusBlock.Information;
+ return Status;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsUnserializeObjectPropertiesFromRegistry(
+ IN PFILE_OBJECT FileObject,
+ IN HANDLE ParentKey OPTIONAL,
+ IN PUNICODE_STRING RegistryPath OPTIONAL)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsCacheMedium(
+ IN PUNICODE_STRING SymbolicLink,
+ IN PKSPIN_MEDIUM Medium,
+ IN ULONG PinDirection)
+{
+ UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @implemented
+*/
+NTSTATUS
+NTAPI
+DllInitialize(
+ PUNICODE_STRING RegistryPath)
+{
+ return STATUS_SUCCESS;
+}
+
+
+/*
+ @unimplemented
+*/
+COMDDKAPI
+NTSTATUS
+NTAPI
+KoDeviceInitialize(
+ IN PDEVICE_OBJECT DeviceObject)
+{
+ UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+COMDDKAPI
+NTSTATUS
+NTAPI
+KoDriverInitialize(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PUNICODE_STRING RegistryPathName,
+ IN KoCreateObjectHandler CreateObjectHandler)
+{
+ UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+COMDDKAPI
+VOID
+NTAPI
+KoRelease(
+ IN REFCLSID ClassId)
+{
+
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsAcquireControl(
+ IN PVOID Object)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsAcquireDevice(
+ IN PKSDEVICE Device)
+{
+ IKsDevice *KsDevice;
+ PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)CONTAINING_RECORD(Device, KSIDEVICE_HEADER, KsDevice);
+
+ /* get device interface*/
+ KsDevice = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice;
+
+ /* acquire device mutex */
+ KsDevice->lpVtbl->AcquireDevice(KsDevice);
+}
+
+/*
+ @implemented
+*/
+VOID
+NTAPI
+KsReleaseDevice(
+ IN PKSDEVICE Device)
+{
+ IKsDevice *KsDevice;
+ PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)CONTAINING_RECORD(Device, KSIDEVICE_HEADER, KsDevice);
+
+ /* get device interface*/
+ KsDevice = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice;
+
+ /* release device mutex */
+ KsDevice->lpVtbl->ReleaseDevice(KsDevice);
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsTerminateDevice(
+ IN PDEVICE_OBJECT DeviceObject)
+{
+ IKsDevice *KsDevice;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PDEVICE_EXTENSION DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* get device header */
+ DeviceHeader = DeviceExtension->DeviceHeader;
+
+ /* get device interface*/
+ KsDevice = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice;
+
+ /* now free device header */
+ KsFreeDeviceHeader((KSDEVICE_HEADER)DeviceHeader);
+
+ /* release interface when available */
+ if (KsDevice)
+ {
+ /* delete IKsDevice interface */
+ KsDevice->lpVtbl->Release(KsDevice);
+ }
+}
+
+
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsCompletePendingRequest(
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsCreateBusEnumObject(
+ IN PWCHAR BusIdentifier,
+ IN PDEVICE_OBJECT BusDeviceObject,
+ IN PDEVICE_OBJECT PhysicalDeviceObject,
+ IN PDEVICE_OBJECT PnpDeviceObject OPTIONAL,
+ IN REFGUID InterfaceGuid OPTIONAL,
+ IN PWCHAR ServiceRelativePath OPTIONAL)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+ULONG
+NTAPI
+KsDeviceSetBusData(
+ IN PKSDEVICE Device,
+ IN ULONG DataType,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length)
+{
+ UNIMPLEMENTED
+ return 0;
+}
+
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+ULONG
+NTAPI
+KsDeviceGetBusData(
+ IN PKSDEVICE Device,
+ IN ULONG DataType,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length)
+{
+ UNIMPLEMENTED
+ return 0;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+void
+NTAPI
+KsDeviceRegisterAdapterObject(
+ IN PKSDEVICE Device,
+ IN PADAPTER_OBJECT AdapterObject,
+ IN ULONG MaxMappingsByteCount,
+ IN ULONG MappingTableStride)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+_KsEdit(
+ IN KSOBJECT_BAG ObjectBag,
+ IN OUT PVOID* PointerToPointerToItem,
+ IN ULONG NewSize,
+ IN ULONG OldSize,
+ IN ULONG Tag)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsGetBusEnumIdentifier(
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsGetBusEnumParentFDOFromChildPDO(
+ IN PDEVICE_OBJECT DeviceObject,
+ OUT PDEVICE_OBJECT *FunctionalDeviceObject)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsGetBusEnumPnpDeviceObject(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PDEVICE_OBJECT *PnpDeviceObject)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+PVOID
+NTAPI
+KsGetFirstChild(
+ IN PVOID Object)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+PVOID
+NTAPI
+KsGetNextSibling(
+ IN PVOID Object)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsInstallBusEnumInterface(
+ PIRP Irp)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsIsBusEnumChildDevice(
+ IN PDEVICE_OBJECT DeviceObject,
+ OUT PBOOLEAN ChildDevice)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+NTSTATUS
+NTAPI
+KsMergeAutomationTables(
+ OUT PKSAUTOMATION_TABLE *AutomationTableAB,
+ IN PKSAUTOMATION_TABLE AutomationTableA OPTIONAL,
+ IN PKSAUTOMATION_TABLE AutomationTableB OPTIONAL,
+ IN KSOBJECT_BAG Bag OPTIONAL)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsServiceBusEnumCreateRequest(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN OUT PIRP Irp)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsServiceBusEnumPnpRequest(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN OUT PIRP Irp)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsRemoveBusEnumInterface(
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+PUNKNOWN
+NTAPI
+KsRegisterAggregatedClientUnknown(
+ IN PVOID Object,
+ IN PUNKNOWN ClientUnknown)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+VOID
+NTAPI
+KsReleaseControl(
+ IN PVOID Object)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+NTSTATUS
+NTAPI
+KsRegisterFilterWithNoKSPins(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN const GUID* InterfaceClassGUID,
+ IN ULONG PinCount,
+ IN BOOL* PinDirection,
+ IN KSPIN_MEDIUM* MediumList,
+ IN GUID* CategoryList OPTIONAL)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
diff --git a/reactos/drivers/ksfilter/ks/bag.c b/reactos/drivers/ksfilter/ks/bag.c
index c6f288dc764..e9fafbb9401 100644
--- a/reactos/drivers/ksfilter/ks/bag.c
+++ b/reactos/drivers/ksfilter/ks/bag.c
@@ -1,46 +1,45 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/bag.c
+ * PURPOSE: KS Object Bag functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
#include "priv.h"
-
-#if 0
-typedef struct
-{
- LIST_ENTRY Entry;
- PVOID Item;
- PFNKSFREE Free;
- LONG ReferenceCount;
-}KSOBJECT_BAG_ENTRY;
-
-typedef struct
-{
- LIST_ENTRY ListHead;
- KMUTEX Lock;
-}KSOBJECT_BAG_IMPL;
-
/*
- @implemented
+ @unimplemented
*/
KSDDKAPI
NTSTATUS
NTAPI
-KsAddItemToObjectBag(
- IN KSOBJECT_BAG ObjectBag,
- IN PVOID Item,
- IN PFNKSFREE Free OPTIONAL)
+KsAllocateObjectBag(
+ IN PKSDEVICE Device,
+ OUT KSOBJECT_BAG* ObjectBag)
{
- KSOBJECT_BAG_ENTRY * Entry;
- KSOBJECT_BAG_IMPL * Bag = (KSOBJECT_BAG_IMPL)ObjectBag;
-
- Entry = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_BAG_ENTRY));
- if (!Entry)
- return STATUS_INSUFFICIENT_RESOURCES;
-
- Entry->Free = Free;
- Entry->Item = Item;
-
- InsertTailList(&Bag->ListHead, &Entry->Entry);
- return STATUS_SUCCESS;
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
}
+/*
+ @unimplemented
+*/
+NTSTATUS
+NTAPI
+KsAddItemToObjectBag(
+ IN KSOBJECT_BAG ObjectBag,
+ IN PVOID Item,
+ IN PFNKSFREE Free OPTIONAL)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ @unimplemented
+*/
KSDDKAPI
ULONG
NTAPI
@@ -49,10 +48,32 @@ KsRemoveItemFromObjectBag(
IN PVOID Item,
IN BOOLEAN Free)
{
- KSOBJECT_BAG_IMPL * Bag = (KSOBJECT_BAG_IMPL)ObjectBag;
-
-
-
-
+ UNIMPLEMENTED
+ return 0;
}
-#endif
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsCopyObjectBagItems(
+ IN KSOBJECT_BAG ObjectBagDestination,
+ IN KSOBJECT_BAG ObjectBagSource)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+KSDDKAPI
+VOID
+NTAPI
+KsFreeObjectBag(
+ IN KSOBJECT_BAG ObjectBag)
+{
+ UNIMPLEMENTED
+}
+
+
+
diff --git a/reactos/drivers/ksfilter/ks/clocks.c b/reactos/drivers/ksfilter/ks/clocks.c
index bc34145568b..39611935076 100644
--- a/reactos/drivers/ksfilter/ks/clocks.c
+++ b/reactos/drivers/ksfilter/ks/clocks.c
@@ -1,12 +1,43 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/clocks.c
+ * PURPOSE: KS Clocks functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
#include "priv.h"
typedef struct
{
+ LONGLONG Time;
+ KSPIN_LOCK TimeLock;
+ KSSTATE State;
+ KTIMER Timer;
+ LONG ReferenceCount;
+
+ PVOID Context;
+ PFNKSSETTIMER SetTimer;
+ PFNKSCANCELTIMER CancelTimer;
+ PFNKSCORRELATEDTIME CorrelatedTime;
+ KSRESOLUTION* Resolution;
+ ULONG Flags;
+
+}KSIDEFAULTCLOCK, *PKSIDEFAULTCLOCK;
+
+typedef struct
+{
+ IKsClock *lpVtbl;
+ LONG ref;
+ PKSCLOCK_CREATE ClockCreate;
+ PKSIDEFAULTCLOCK DefaultClock;
+ PKSIOBJECT_HEADER ObjectHeader;
+}KSICLOCK, *PKSICLOCK;
-}KS_DEFAULT_CLOCK;
/*
- @unimplemented
+ @implemented
*/
KSDDKAPI NTSTATUS NTAPI
KsCreateClock(
@@ -14,36 +45,152 @@ KsCreateClock(
IN PKSCLOCK_CREATE ClockCreate,
OUT PHANDLE ClockHandle)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ return KspCreateObjectType(ConnectionHandle,
+ KSSTRING_Clock,
+ ClockCreate,
+ sizeof(KSCLOCK_CREATE),
+ GENERIC_READ,
+ ClockHandle);
}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsValidateClockCreateRequest(
+ IN PIRP Irp,
+ OUT PKSCLOCK_CREATE* OutClockCreate)
+{
+ PKSCLOCK_CREATE ClockCreate;
+ NTSTATUS Status;
+ ULONG Size;
+
+ /* minimum request size */
+ Size = sizeof(KSCLOCK_CREATE);
+
+ /* copy create request */
+ Status = KspCopyCreateRequest(Irp,
+ KSSTRING_Clock,
+ &Size,
+ (PVOID*)&ClockCreate);
+
+ if (!NT_SUCCESS(Status))
+ return Status;
+
+ if (ClockCreate->CreateFlags != 0)
+ {
+ /* flags must be zero */
+ FreeItem(ClockCreate);
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ *OutClockCreate = ClockCreate;
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+IKsClock_DispatchDeviceIoControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED
+
+ Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+IKsClock_DispatchClose(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED
+
+ Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+
+static KSDISPATCH_TABLE DispatchTable =
+{
+ IKsClock_DispatchDeviceIoControl,
+ KsDispatchInvalidDeviceRequest,
+ KsDispatchInvalidDeviceRequest,
+ KsDispatchInvalidDeviceRequest,
+ IKsClock_DispatchClose,
+ KsDispatchQuerySecurity,
+ KsDispatchSetSecurity,
+ KsDispatchFastIoDeviceControlFailure,
+ KsDispatchFastReadFailure,
+ KsDispatchFastReadFailure,
+};
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
KsCreateDefaultClock(
IN PIRP Irp,
IN PKSDEFAULTCLOCK DefaultClock)
{
NTSTATUS Status;
PKSCLOCK_CREATE ClockCreate;
+ PKSICLOCK Clock;
+ PKSOBJECT_CREATE_ITEM CreateItem;
Status = KsValidateClockCreateRequest(Irp, &ClockCreate);
if (!NT_SUCCESS(Status))
return Status;
-// ExAllocatePoolWithTag(NonPagedPool, sizeof(KS_DEFAULT_CLOCK), 0);
+ /* let's allocate the clock struct */
+ Clock = AllocateItem(NonPagedPool, sizeof(KSICLOCK));
+ if (!Clock)
+ return STATUS_INSUFFICIENT_RESOURCES;
+ /* now allocate the object header */
+ Status = KsAllocateObjectHeader((PVOID*)&Clock->ObjectHeader, 0, NULL, Irp, &DispatchTable);
+ /* did it work */
+ if (!NT_SUCCESS(Status))
+ {
+ /* failed */
+ FreeItem(Clock);
+ return Status;
+ }
- return STATUS_UNSUCCESSFUL;
+ /* initialize clock */
+ /* FIXME IKsClock */
+ Clock->ObjectHeader->Unknown = (PUNKNOWN)&Clock->lpVtbl;
+ Clock->ref = 1;
+ Clock->ClockCreate = ClockCreate;
+ Clock->DefaultClock = (PKSIDEFAULTCLOCK)DefaultClock;
+
+ /* increment reference count */
+ InterlockedIncrement(&Clock->DefaultClock->ReferenceCount);
+
+ /* get create item */
+ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+
+ return Status;
}
/*
@implemented
*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsAllocateDefaultClock(
OUT PKSDEFAULTCLOCK* DefaultClock)
{
@@ -53,7 +200,9 @@ KsAllocateDefaultClock(
/*
@unimplemented
*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsAllocateDefaultClockEx(
OUT PKSDEFAULTCLOCK* DefaultClock,
IN PVOID Context OPTIONAL,
@@ -63,72 +212,113 @@ KsAllocateDefaultClockEx(
IN const KSRESOLUTION* Resolution OPTIONAL,
IN ULONG Flags)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ PKSIDEFAULTCLOCK Clock;
+
+ if (!DefaultClock)
+ return STATUS_INVALID_PARAMETER_1;
+
+ /* allocate default clock */
+ Clock = AllocateItem(NonPagedPool, sizeof(KSIDEFAULTCLOCK));
+ if (!Clock)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* initialize default clock */
+ KeInitializeSpinLock(&Clock->TimeLock);
+ KeInitializeTimer(&Clock->Timer);
+ Clock->ReferenceCount = 1;
+ Clock->Context = Context;
+ Clock->SetTimer = SetTimer;
+ Clock->CancelTimer = CancelTimer;
+ Clock->CorrelatedTime = CorrelatedTime;
+ Clock->Resolution = (PKSRESOLUTION)Resolution;
+ Clock->Flags = Flags;
+
+ *DefaultClock = (PKSDEFAULTCLOCK)Clock;
+ return STATUS_SUCCESS;
}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI VOID NTAPI
+KSDDKAPI
+VOID
+NTAPI
KsFreeDefaultClock(
IN PKSDEFAULTCLOCK DefaultClock)
{
- UNIMPLEMENTED;
+ PKSIDEFAULTCLOCK Clock = (PKSIDEFAULTCLOCK)DefaultClock;
+
+ InterlockedDecrement(&Clock->ReferenceCount);
+
+ if (Clock->ReferenceCount == 0)
+ {
+ /* free default clock */
+ FreeItem(Clock);
+ }
}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI NTSTATUS NTAPI
-KsValidateClockCreateRequest(
- IN PIRP Irp,
- OUT PKSCLOCK_CREATE* ClockCreate)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI KSSTATE NTAPI
+KSDDKAPI
+KSSTATE
+NTAPI
KsGetDefaultClockState(
IN PKSDEFAULTCLOCK DefaultClock)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ PKSIDEFAULTCLOCK Clock = (PKSIDEFAULTCLOCK)DefaultClock;
+ return Clock->State;
}
/*
@unimplemented
*/
-KSDDKAPI VOID NTAPI
+KSDDKAPI
+VOID
+NTAPI
KsSetDefaultClockState(
IN PKSDEFAULTCLOCK DefaultClock,
IN KSSTATE State)
{
- UNIMPLEMENTED;
+ PKSIDEFAULTCLOCK Clock = (PKSIDEFAULTCLOCK)DefaultClock;
+
+ if (State != Clock->State)
+ {
+ /* FIXME set time etc */
+ Clock->State = State;
+ }
+
}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI LONGLONG NTAPI
+KSDDKAPI
+LONGLONG
+NTAPI
KsGetDefaultClockTime(
IN PKSDEFAULTCLOCK DefaultClock)
{
- UNIMPLEMENTED;
- return 0;
+ LONGLONG Time = 0LL;
+ PKSIDEFAULTCLOCK Clock = (PKSIDEFAULTCLOCK)DefaultClock;
+
+ Time = ExInterlockedCompareExchange64(&Clock->Time, &Time, &Time, &Clock->TimeLock);
+
+ return Time;
}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI VOID NTAPI
+KSDDKAPI
+VOID
+NTAPI
KsSetDefaultClockTime(
IN PKSDEFAULTCLOCK DefaultClock,
IN LONGLONG Time)
{
- UNIMPLEMENTED;
+ PKSIDEFAULTCLOCK Clock = (PKSIDEFAULTCLOCK)DefaultClock;
+
+ /* set the time safely */
+ ExInterlockedCompareExchange64(&Clock->Time, &Time, &Clock->Time, &Clock->TimeLock);
}
diff --git a/reactos/drivers/ksfilter/ks/connectivity.c b/reactos/drivers/ksfilter/ks/connectivity.c
index d2744ff76a8..7b79f51e38a 100644
--- a/reactos/drivers/ksfilter/ks/connectivity.c
+++ b/reactos/drivers/ksfilter/ks/connectivity.c
@@ -1,3 +1,12 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/connectivity.c
+ * PURPOSE: KS Pin functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
#include "priv.h"
/*
@@ -22,7 +31,7 @@ KsCreatePin(
}
return KspCreateObjectType(FilterHandle,
- L"{146F1A80-4791-11D0-A5D6-28DB04C10000}", //KSNAME_Pin
+ KSSTRING_Pin,
(PVOID)Connect,
ConnectSize,
DesiredAccess,
@@ -45,15 +54,23 @@ KsValidateConnectRequest(
PKSPIN_CONNECT ConnectDetails;
LPWSTR PinName = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}\\";
PKSDATAFORMAT DataFormat;
+ LPWSTR Offset;
IoStack = IoGetCurrentIrpStackLocation(Irp);
if (!IoStack->FileObject->FileName.Buffer)
return STATUS_INVALID_PARAMETER;
- if (wcsncmp(IoStack->FileObject->FileName.Buffer, PinName, wcslen(PinName)))
+ if (IoStack->FileObject->FileName.Length < wcslen(PinName) + sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT))
return STATUS_INVALID_PARAMETER;
- ConnectDetails = (PKSPIN_CONNECT)(IoStack->FileObject->FileName.Buffer + wcslen(PinName));
+ Offset = wcsstr(IoStack->FileObject->FileName.Buffer, PinName);
+ if (!Offset)
+ {
+ /* request is not targeted for a pin */
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ ConnectDetails = (PKSPIN_CONNECT)(Offset + wcslen(PinName));
if (ConnectDetails->PinToHandle != NULL)
{
@@ -61,11 +78,6 @@ KsValidateConnectRequest(
return STATUS_NOT_IMPLEMENTED;
}
- if (IoStack->FileObject->FileName.Length < wcslen(PinName) + sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT))
- return STATUS_INVALID_PARAMETER;
-
- ConnectDetails = (PKSPIN_CONNECT)(IoStack->FileObject->FileName.Buffer + wcslen(PinName));
-
if (ConnectDetails->PinId >= DescriptorsCount)
return STATUS_INVALID_PARAMETER;
@@ -434,9 +446,13 @@ KsPinDataIntersection(
return STATUS_NO_MATCH;
}
-/* Does this belong here? */
+/*
+ @unimplemented
+*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsHandleSizedListQuery(
IN PIRP Irp,
IN ULONG DataItemsCount,
diff --git a/reactos/drivers/ksfilter/ks/device.c b/reactos/drivers/ksfilter/ks/device.c
index 36ce5570b0c..f6f5d33c66e 100644
--- a/reactos/drivers/ksfilter/ks/device.c
+++ b/reactos/drivers/ksfilter/ks/device.c
@@ -1,26 +1,31 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/device.c
+ * PURPOSE: KS IKsDevice interface functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
#include "priv.h"
-typedef struct
-{
- IKsDeviceVtbl *lpVtbl;
-
- LONG ref;
- KSDEVICE KsDevice;
-
-}IKsDeviceImpl;
-
-
NTSTATUS
NTAPI
IKsDevice_fnQueryInterface(
IN IKsDevice * iface,
- REFIID InterfaceId,
- PVOID* Interface)
+ REFIID refiid,
+ PVOID* Output)
{
- IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
+ PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice);
- DPRINT1("IKsDevice_fnQueryInterface %p\n", This);
- return STATUS_NOT_IMPLEMENTED;
+ if (IsEqualGUIDAligned(refiid, &IID_IUnknown))
+ {
+ *Output = &This->lpVtblIKsDevice;
+ _InterlockedIncrement(&This->ref);
+ return STATUS_SUCCESS;
+ }
+
+ return STATUS_NOT_SUPPORTED;
}
ULONG
@@ -28,7 +33,7 @@ NTAPI
IKsDevice_fnAddRef(
IN IKsDevice * iface)
{
- IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
+ PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice);
return InterlockedIncrement(&This->ref);
}
@@ -38,27 +43,21 @@ NTAPI
IKsDevice_fnRelease(
IN IKsDevice * iface)
{
- IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
+ PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice);
InterlockedDecrement(&This->ref);
- if (This->ref == 0)
- {
- ExFreePoolWithTag(This, TAG_KSDEVICE);
- return 0;
- }
-
return This->ref;
}
-KSDEVICE *
+PKSDEVICE
NTAPI
IKsDevice_fnGetStruct(
IN IKsDevice * iface)
{
- IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
+ PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice);
return &This->KsDevice;
}
@@ -70,9 +69,9 @@ IKsDevice_fnInitializeObjectBag(
IN struct KSIOBJECTBAG *Bag,
IN KMUTANT * Mutant)
{
- IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
+ //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice);
- DPRINT1("IKsDevice_fnInitializeObjectBag %p\n", This);
+ UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
@@ -81,10 +80,9 @@ NTAPI
IKsDevice_fnAcquireDevice(
IN IKsDevice * iface)
{
- IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
+ PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice);
- DPRINT1("IKsDevice_fnAcquireDevice %p\n", This);
- return STATUS_NOT_IMPLEMENTED;
+ return KeWaitForSingleObject(&This->DeviceMutex, Executive, KernelMode, FALSE, NULL);
}
NTSTATUS
@@ -92,10 +90,9 @@ NTAPI
IKsDevice_fnReleaseDevice(
IN IKsDevice * iface)
{
- IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
+ PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice);
- DPRINT1("IKsDevice_fnReleaseDevice %p\n", This);
- return STATUS_NOT_IMPLEMENTED;
+ return KeReleaseMutex(&This->DeviceMutex, FALSE);
}
NTSTATUS
@@ -106,9 +103,9 @@ IKsDevice_fnGetAdapterObject(
IN PULONG Unknown1,
IN PULONG Unknown2)
{
- IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
+ //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice);
- DPRINT1("IKsDevice_fnGetAdapterObject %p\n", This);
+ UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
@@ -120,9 +117,9 @@ IKsDevice_fnAddPowerEntry(
IN struct KSPOWER_ENTRY * Entry,
IN IKsPowerNotify* Notify)
{
- IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
+ //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice);
- DPRINT1("IKsDevice_fnAddPowerEntry %p\n", This);
+ UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
@@ -132,9 +129,9 @@ IKsDevice_fnRemovePowerEntry(
IN IKsDevice * iface,
IN struct KSPOWER_ENTRY * Entry)
{
- IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
+ //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice);
- DPRINT1("IKsDevice_fnRemovePowerEntry %p\n", This);
+ UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
@@ -148,9 +145,9 @@ IKsDevice_fnPinStateChange(
IN KSSTATE OldState,
IN KSSTATE NewState)
{
- IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
+ //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice);
- DPRINT1("IKsDevice_fnPinStateChange %p\n", This);
+ UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
@@ -163,9 +160,9 @@ IKsDevice_fnArbitrateAdapterChannel(
IN IO_ALLOCATION_ACTION Action,
IN PVOID Context)
{
- IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
+ //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice);
- DPRINT1("IKsDevice_fnArbitrateAdapterChannel %p\n", This);
+ UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
@@ -176,9 +173,9 @@ IKsDevice_fnCheckIoCapability(
IN IKsDevice * iface,
IN ULONG Unknown)
{
- IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
+ //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice);
- DPRINT1("IKsDevice_fnCheckIoCapability %p\n", This);
+ UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
@@ -200,21 +197,498 @@ static IKsDeviceVtbl vt_IKsDevice =
};
+VOID
+NTAPI
+IKsDevice_PnpPostStart(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PVOID Context)
+{
+ NTSTATUS Status;
+ PPNP_POSTSTART_CONTEXT Ctx = (PPNP_POSTSTART_CONTEXT)Context;
+
+ /* call driver pnp post routine */
+ Status = Ctx->DeviceHeader->Descriptor->Dispatch->PostStart(&Ctx->DeviceHeader->KsDevice);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Driver: PostStart Routine returned %x\n", Status);
+
+ /* set state to disabled */
+ Ctx->DeviceHeader->TargetState = KSTARGET_STATE_DISABLED;
+ }
+ else
+ {
+ /* set state to enabled */
+ Ctx->DeviceHeader->TargetState = KSTARGET_STATE_ENABLED;
+ }
+
+ /* free work item */
+ IoFreeWorkItem(Ctx->WorkItem);
+
+ /* free work context */
+ FreeItem(Ctx);
+}
NTSTATUS
NTAPI
-NewIKsDevice(IKsDevice** OutDevice)
+IKsDevice_PnpStartDevice(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
{
- IKsDeviceImpl * This;
+ PIO_STACK_LOCATION IoStack;
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PPNP_POSTSTART_CONTEXT Ctx = NULL;
+ NTSTATUS Status;
- This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IKsDeviceImpl), TAG_KSDEVICE);
- if (!This)
- return STATUS_INSUFFICIENT_RESOURCES;
+ /* get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ /* get device header */
+ DeviceHeader = DeviceExtension->DeviceHeader;
- This->ref = 1;
- This->lpVtbl = &vt_IKsDevice;
+ /* first forward irp to lower device object */
+ Status = KspForwardIrpSynchronous(DeviceObject, Irp);
+
+ /* check for success */
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("NextDevice object failed to start with %x\n", Status);
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+
+ /* do we have a device descriptor */
+ if (DeviceHeader->Descriptor)
+ {
+ /* does the device want pnp notifications */
+ if (DeviceHeader->Descriptor->Dispatch)
+ {
+ /* does the driver care about IRP_MN_START_DEVICE */
+ if (DeviceHeader->Descriptor->Dispatch->Start)
+ {
+ /* call driver start device routine */
+ Status = DeviceHeader->Descriptor->Dispatch->Start(&DeviceHeader->KsDevice, Irp,
+ IoStack->Parameters.StartDevice.AllocatedResourcesTranslated,
+ IoStack->Parameters.StartDevice.AllocatedResources);
+
+ ASSERT(Status != STATUS_PENDING);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Driver: failed to start %x\n", Status);
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+
+ /* set state to run */
+ DeviceHeader->KsDevice.Started = TRUE;
+
+ }
+
+ /* does the driver need post start routine */
+ if (DeviceHeader->Descriptor->Dispatch->PostStart)
+ {
+ /* allocate pnp post workitem context */
+ Ctx = (PPNP_POSTSTART_CONTEXT)AllocateItem(NonPagedPool, sizeof(PNP_POSTSTART_CONTEXT));
+ if (!Ctx)
+ {
+ /* no memory */
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ }
+ else
+ {
+ /* allocate a work item */
+ Ctx->WorkItem = IoAllocateWorkItem(DeviceObject);
+
+ if (!Ctx->WorkItem)
+ {
+ /* no memory */
+ FreeItem(Ctx);
+ Ctx = NULL;
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ }
+ else
+ {
+ /* store device header for post-start pnp processing */
+ Ctx->DeviceHeader = DeviceHeader;
+ }
+ }
+ }
+ else
+ {
+ /* set state to enabled, IRP_MJ_CREATE request may now succeed */
+ DeviceHeader->TargetState = KSTARGET_STATE_ENABLED;
+ }
+ }
+ }
+
+ /* store result */
+ Irp->IoStatus.Status = Status;
+ /* complete request */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ if (Ctx)
+ {
+ /* queue a work item for driver post start routine */
+ IoQueueWorkItem(Ctx->WorkItem, IKsDevice_PnpPostStart, DelayedWorkQueue, (PVOID)Ctx);
+ }
+
+ /* return result */
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+IKsDevice_Pnp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PKSDEVICE_DISPATCH Dispatch = NULL;
+ NTSTATUS Status;
+
+ /* get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ /* get device header */
+ DeviceHeader = DeviceExtension->DeviceHeader;
+
+ /* do we have a device descriptor */
+ if (DeviceHeader->Descriptor)
+ {
+ /* does the device want pnp notifications */
+ Dispatch = (PKSDEVICE_DISPATCH)DeviceHeader->Descriptor->Dispatch;
+ }
+
+ switch (IoStack->MinorFunction)
+ {
+ case IRP_MN_START_DEVICE:
+ {
+ return IKsDevice_PnpStartDevice(DeviceObject, Irp);
+ }
+
+ case IRP_MN_QUERY_STOP_DEVICE:
+ {
+ Status = STATUS_SUCCESS;
+ /* check for pnp notification support */
+ if (Dispatch)
+ {
+ /* check for query stop support */
+ if (Dispatch->QueryStop)
+ {
+ /* call driver's query stop */
+ Status = Dispatch->QueryStop(&DeviceHeader->KsDevice, Irp);
+ ASSERT(Status != STATUS_PENDING);
+ }
+ }
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Driver: query stop failed %x\n", Status);
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+
+ /* pass the irp down the driver stack */
+ Status = KspForwardIrpSynchronous(DeviceObject, Irp);
+
+ DPRINT("Next Device: Status %x\n", Status);
+
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+
+ case IRP_MN_REMOVE_DEVICE:
+ {
+ /* Clean up */
+ if (Dispatch)
+ {
+ /* check for remove support */
+ if (Dispatch->Remove)
+ {
+ /* call driver's stop routine */
+ Dispatch->Remove(&DeviceHeader->KsDevice, Irp);
+ }
+ }
+
+ /* pass the irp down the driver stack */
+ Status = KspForwardIrpSynchronous(DeviceObject, Irp);
+
+ DPRINT("Next Device: Status %x\n", Status);
+
+ /* FIXME delete device resources */
+
+
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+ case IRP_MN_QUERY_INTERFACE:
+ {
+ Status = STATUS_SUCCESS;
+ /* check for pnp notification support */
+ if (Dispatch)
+ {
+ /* check for query interface support */
+ if (Dispatch->QueryInterface)
+ {
+ /* call driver's query interface */
+ Status = Dispatch->QueryInterface(&DeviceHeader->KsDevice, Irp);
+ ASSERT(Status != STATUS_PENDING);
+ }
+ }
+
+ if (NT_SUCCESS(Status))
+ {
+ /* driver supports a private interface */
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+
+ /* pass the irp down the driver stack */
+ Status = KspForwardIrpSynchronous(DeviceObject, Irp);
+
+ DPRINT("Next Device: Status %x\n", Status);
+
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+ case IRP_MN_QUERY_DEVICE_RELATIONS:
+ {
+ DPRINT("IRP_MN_QUERY_DEVICE_RELATIONS\n");
+
+ /* pass the irp down the driver stack */
+ Status = KspForwardIrpSynchronous(DeviceObject, Irp);
+
+ DPRINT("Next Device: Status %x\n", Status);
+
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+ case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
+ {
+ DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
+ /* pass the irp down the driver stack */
+ Status = KspForwardIrpSynchronous(DeviceObject, Irp);
+
+ DPRINT("Next Device: Status %x\n", Status);
+
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+ case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
+ {
+ DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
+ /* pass the irp down the driver stack */
+ Status = KspForwardIrpSynchronous(DeviceObject, Irp);
+
+ DPRINT("Next Device: Status %x\n", Status);
+
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+ default:
+ DPRINT1("unhandled function %u\n", IoStack->MinorFunction);
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_NOT_SUPPORTED;
+ }
+}
+
+NTSTATUS
+NTAPI
+IKsDevice_Power(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED
+
+ /* TODO */
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
- *OutDevice = (IKsDevice*)This;
return STATUS_SUCCESS;
}
+NTSTATUS
+NTAPI
+IKsDevice_Create(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PCREATE_ITEM_ENTRY CreateItemEntry;
+ PIO_STACK_LOCATION IoStack;
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PKSIOBJECT_HEADER ObjectHeader;
+ NTSTATUS Status;
+
+ DPRINT("KS / CREATE\n");
+ /* get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ /* get device header */
+ DeviceHeader = DeviceExtension->DeviceHeader;
+
+ /* acquire list lock */
+ IKsDevice_fnAcquireDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
+
+ /* sanity check */
+ ASSERT(IoStack->FileObject);
+
+ /* check if the request is relative */
+ if (IoStack->FileObject->RelatedFileObject != NULL)
+ {
+ /* request is to instantiate a pin / node / clock / allocator */
+ ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->RelatedFileObject->FsContext;
+
+ /* sanity check */
+ ASSERT(ObjectHeader);
+
+ /* find a matching a create item */
+ Status = FindMatchingCreateItem(&ObjectHeader->ItemList, IoStack->FileObject->FileName.Length, IoStack->FileObject->FileName.Buffer, &CreateItemEntry);
+ }
+ else
+ {
+ /* request to create a filter */
+ Status = FindMatchingCreateItem(&DeviceHeader->ItemList, IoStack->FileObject->FileName.Length, IoStack->FileObject->FileName.Buffer, &CreateItemEntry);
+ }
+
+ if (NT_SUCCESS(Status))
+ {
+ /* set object create item */
+ KSCREATE_ITEM_IRP_STORAGE(Irp) = CreateItemEntry->CreateItem;
+
+ /* call create function */
+ Status = CreateItemEntry->CreateItem->Create(DeviceObject, Irp);
+
+ if (NT_SUCCESS(Status))
+ {
+ /* increment create item reference count */
+ InterlockedIncrement(&CreateItemEntry->ReferenceCount);
+ }
+
+ /* acquire list lock */
+ IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
+
+ return Status;
+ }
+
+ /* acquire list lock */
+ IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
+
+ DPRINT1("No item found for Request %p\n", IoStack->FileObject->FileName.Buffer);
+
+ Irp->IoStatus.Information = 0;
+ /* set return status */
+ Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_UNSUCCESSFUL;
+
+ /* release lock */
+ IKsDevice_fnRelease((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
+
+ Irp->IoStatus.Information = 0;
+ /* set return status */
+ Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsInitializeDevice(
+ IN PDEVICE_OBJECT FunctionalDeviceObject,
+ IN PDEVICE_OBJECT PhysicalDeviceObject,
+ IN PDEVICE_OBJECT NextDeviceObject,
+ IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL)
+{
+ PKSIDEVICE_HEADER Header;
+ ULONG Index;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ /* first allocate device header */
+ Status = KsAllocateDeviceHeader((KSDEVICE_HEADER*)&Header, 0, NULL);
+
+ /* check for success */
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to allocate device header with %x\n", Status);
+ return Status;
+ }
+
+ /* initialize device header */
+ Header->KsDevice.FunctionalDeviceObject = FunctionalDeviceObject;
+ Header->KsDevice.PhysicalDeviceObject = PhysicalDeviceObject;
+ Header->KsDevice.NextDeviceObject = NextDeviceObject;
+ Header->KsDevice.Descriptor = Descriptor;
+ KsSetDevicePnpAndBaseObject(Header, PhysicalDeviceObject, NextDeviceObject);
+ /* initialize IKsDevice interface */
+ Header->lpVtblIKsDevice = &vt_IKsDevice;
+ Header->Type = KsObjectTypeDevice;
+ Header->ref = 1;
+
+ /* FIXME Power state */
+
+ if (Descriptor)
+ {
+ /* create a filter factory for each filter descriptor */
+ for(Index = 0; Index < Descriptor->FilterDescriptorsCount; Index++)
+ {
+ Status = KspCreateFilterFactory(FunctionalDeviceObject, Descriptor->FilterDescriptors[Index], NULL, NULL, 0, NULL, NULL, NULL);
+ /* check for success */
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("KspCreateFilterFactory failed with %x\n", Status);
+ /* FIXME memory leak */
+ return Status;
+ }
+ }
+
+ /* does the driver pnp notification */
+ if (Descriptor->Dispatch)
+ {
+ /* does the driver care about the add device */
+ Status = Descriptor->Dispatch->Add(&Header->KsDevice);
+
+ DPRINT("Driver: AddHandler Status %x\n", Status);
+ }
+ }
+
+
+ return Status;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsReferenceSoftwareBusObject(
+ IN KSDEVICE_HEADER Header)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
diff --git a/reactos/drivers/ksfilter/ks/deviceinterface.c b/reactos/drivers/ksfilter/ks/deviceinterface.c
new file mode 100644
index 00000000000..05546c32080
--- /dev/null
+++ b/reactos/drivers/ksfilter/ks/deviceinterface.c
@@ -0,0 +1,98 @@
+#include "priv.h"
+
+NTSTATUS
+KspSetDeviceInterfacesState(
+ IN PLIST_ENTRY ListHead,
+ IN BOOL Enable)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ PLIST_ENTRY Entry;
+ PSYMBOLIC_LINK_ENTRY SymEntry;
+
+
+ Entry = ListHead->Flink;
+ while(Entry != ListHead)
+ {
+ /* fetch symbolic link entry */
+ SymEntry = (PSYMBOLIC_LINK_ENTRY)CONTAINING_RECORD(Entry, SYMBOLIC_LINK_ENTRY, Entry);
+ /* set device interface state */
+ Status = IoSetDeviceInterfaceState(&SymEntry->SymbolicLink, Enable);
+ /* check for success */
+ if (!NT_SUCCESS(Status))
+ return Status;
+ /* get next entry */
+ Entry = Entry->Flink;
+ }
+ /* return result */
+ return Status;
+}
+
+NTSTATUS
+KspFreeDeviceInterfaces(
+ IN PLIST_ENTRY ListHead)
+{
+ PLIST_ENTRY Entry;
+ PSYMBOLIC_LINK_ENTRY SymEntry;
+
+ while(!IsListEmpty(ListHead))
+ {
+ /* remove first entry */
+ Entry = RemoveHeadList(ListHead);
+
+ /* fetch symbolic link entry */
+ SymEntry = (PSYMBOLIC_LINK_ENTRY)CONTAINING_RECORD(Entry, SYMBOLIC_LINK_ENTRY, Entry);
+
+ /* free device interface string */
+ RtlFreeUnicodeString(&SymEntry->SymbolicLink);
+ /* free entry item */
+ FreeItem(Entry);
+ }
+
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+KspRegisterDeviceInterfaces(
+ IN PDEVICE_OBJECT PhysicalDeviceObject,
+ IN ULONG CategoriesCount,
+ IN GUID const*Categories,
+ IN PUNICODE_STRING ReferenceString,
+ OUT PLIST_ENTRY SymbolicLinkList)
+{
+ ULONG Index;
+ NTSTATUS Status = STATUS_SUCCESS;
+ PSYMBOLIC_LINK_ENTRY SymEntry;
+
+ for(Index = 0; Index < CategoriesCount; Index++)
+ {
+ /* allocate a symbolic link entry */
+ SymEntry = AllocateItem(NonPagedPool, sizeof(SYMBOLIC_LINK_ENTRY));
+ /* check for success */
+ if (!SymEntry)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* now register device interface */
+ Status = IoRegisterDeviceInterface(PhysicalDeviceObject,
+ &Categories[Index],
+ ReferenceString, /* see damn bug 4566 */
+ &SymEntry->SymbolicLink);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to register device interface %x\n", Status);
+
+ /* free entry */
+ FreeItem(SymEntry);
+
+ /* return result */
+ return Status;
+ }
+ /* insert symbolic link entry */
+ InsertTailList(SymbolicLinkList, &SymEntry->Entry);
+ }
+
+ /* return result */
+ return Status;
+}
+
+
diff --git a/reactos/drivers/ksfilter/ks/driver.c b/reactos/drivers/ksfilter/ks/driver.c
index facd00ea95e..0eef6cea38e 100644
--- a/reactos/drivers/ksfilter/ks/driver.c
+++ b/reactos/drivers/ksfilter/ks/driver.c
@@ -1,3 +1,11 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/driver.c
+ * PURPOSE: KS Driver functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
#include "priv.h"
#include "ksfunc.h"
@@ -15,7 +23,7 @@ DriverEntry(
}
/*
- @unimplemented
+ @implemented
*/
KSDDKAPI
PKSDEVICE
@@ -23,23 +31,28 @@ NTAPI
KsGetDeviceForDeviceObject(
IN PDEVICE_OBJECT FunctionalDeviceObject)
{
+ PDEVICE_EXTENSION DeviceExtension;
- return NULL;
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)FunctionalDeviceObject->DeviceExtension;
+
+ return &DeviceExtension->DeviceHeader->KsDevice;
}
/*
- @unimplemented
+ @implemented
*/
KSDDKAPI
-NTSTATUS
+PKSDEVICE
NTAPI
-KsInitializeDevice(
- IN PDEVICE_OBJECT FunctionalDeviceObject,
- IN PDEVICE_OBJECT PhysicalDeviceObject,
- IN PDEVICE_OBJECT NextDeviceObject,
- IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL)
+KsGetDevice(
+ IN PVOID Object)
{
- return STATUS_UNSUCCESSFUL;
+ PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)(ULONG_PTR)Object - sizeof(KSBASIC_HEADER);
+
+ ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory || BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == BasicHeader->Type);
+
+ return BasicHeader->KsDevice;
}
/*
@@ -58,9 +71,8 @@ KsCreateDevice(
NTSTATUS Status = STATUS_DEVICE_REMOVED;
PDEVICE_OBJECT FunctionalDeviceObject= NULL;
PDEVICE_OBJECT OldHighestDeviceObject;
-
if (!ExtensionSize)
- ExtensionSize = sizeof(PVOID);
+ ExtensionSize = sizeof(KSDEVICE_HEADER);
Status = IoCreateDevice(DriverObject, ExtensionSize, NULL, FILE_DEVICE_KS, FILE_DEVICE_SECURE_OPEN, FALSE, &FunctionalDeviceObject);
if (!NT_SUCCESS(Status))
@@ -71,7 +83,12 @@ KsCreateDevice(
{
Status = KsInitializeDevice(FunctionalDeviceObject, PhysicalDeviceObject, OldHighestDeviceObject, Descriptor);
}
+ else
+ {
+ Status = STATUS_DEVICE_REMOVED;
+ }
+ /* check if all succeeded */
if (!NT_SUCCESS(Status))
{
if (OldHighestDeviceObject)
@@ -81,9 +98,20 @@ KsCreateDevice(
return Status;
}
+ /* set device flags */
+ FunctionalDeviceObject->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE;
+ FunctionalDeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING;
+
if (Device)
{
+ /* get PKSDEVICE struct */
*Device = KsGetDeviceForDeviceObject(FunctionalDeviceObject);
+
+ if (ExtensionSize > sizeof(KSDEVICE_HEADER))
+ {
+ /* caller needs a device extension */
+ (*Device)->Context = (PVOID)((ULONG_PTR)FunctionalDeviceObject->DeviceExtension + sizeof(KSDEVICE_HEADER));
+ }
}
return Status;
@@ -135,9 +163,13 @@ KsInitializeDriver(
}
}
/* Setting our IRP handlers */
- //DriverObject->MajorFunction[IRP_MJ_CREATE] = KspDispatch;
- //DriverObject->MajorFunction[IRP_MJ_PNP] = KspDispatch;
- //DriverObject->MajorFunction[IRP_MJ_POWER] = KspDispatch;
+ DriverObject->MajorFunction[IRP_MJ_CREATE] = IKsDevice_Create;
+ DriverObject->MajorFunction[IRP_MJ_PNP] = IKsDevice_Pnp;
+ DriverObject->MajorFunction[IRP_MJ_POWER] = IKsDevice_Power;
+ DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = KsDefaultForwardIrp;
+
+ /* The driver unload routine */
+ DriverObject->DriverUnload = KsNullDriverUnload;
/* The driver-supplied AddDevice */
DriverObject->DriverExtension->AddDevice = KsAddDevice;
diff --git a/reactos/drivers/ksfilter/ks/events.c b/reactos/drivers/ksfilter/ks/event.c
similarity index 54%
rename from reactos/drivers/ksfilter/ks/events.c
rename to reactos/drivers/ksfilter/ks/event.c
index 1558b216c68..f29ea2fc780 100644
--- a/reactos/drivers/ksfilter/ks/events.c
+++ b/reactos/drivers/ksfilter/ks/event.c
@@ -1,55 +1,20 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/event.c
+ * PURPOSE: KS Event functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
#include "priv.h"
-/* ===============================================================
- Event Functions
-*/
/*
@unimplemented
*/
-KSDDKAPI NTSTATUS NTAPI
-KsGenerateEvent(
- IN PKSEVENT_ENTRY EntryEvent)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsEnableEventWithAllocator(
- IN PIRP Irp,
- IN ULONG EventSetsCount,
- IN PKSEVENT_SET EventSet,
- IN OUT PLIST_ENTRY EventsList OPTIONAL,
- IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
- IN PVOID EventsLock OPTIONAL,
- IN PFNKSALLOCATOR Allocator OPTIONAL,
- IN ULONG EventItemSize OPTIONAL)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsGenerateDataEvent(
- IN PKSEVENT_ENTRY EventEntry,
- IN ULONG DataSize,
- IN PVOID Data)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsEnableEvent(
IN PIRP Irp,
IN ULONG EventSetsCount,
@@ -65,17 +30,30 @@ KsEnableEvent(
/*
@unimplemented
*/
-KSDDKAPI VOID NTAPI
-KsDiscardEvent(
- IN PKSEVENT_ENTRY EventEntry)
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsEnableEventWithAllocator(
+ IN PIRP Irp,
+ IN ULONG EventSetsCount,
+ IN PKSEVENT_SET EventSet,
+ IN OUT PLIST_ENTRY EventsList OPTIONAL,
+ IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
+ IN PVOID EventsLock OPTIONAL,
+ IN PFNKSALLOCATOR Allocator OPTIONAL,
+ IN ULONG EventItemSize OPTIONAL)
{
UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
}
+
/*
@unimplemented
*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsDisableEvent(
IN PIRP Irp,
IN OUT PLIST_ENTRY EventsList,
@@ -89,7 +67,22 @@ KsDisableEvent(
/*
@unimplemented
*/
-KSDDKAPI VOID NTAPI
+KSDDKAPI
+VOID
+NTAPI
+KsDiscardEvent(
+ IN PKSEVENT_ENTRY EventEntry)
+{
+ UNIMPLEMENTED;
+}
+
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
KsFreeEventList(
IN PFILE_OBJECT FileObject,
IN OUT PLIST_ENTRY EventsList,
@@ -98,3 +91,93 @@ KsFreeEventList(
{
UNIMPLEMENTED;
}
+
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsGenerateEvent(
+ IN PKSEVENT_ENTRY EntryEvent)
+{
+ UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsGenerateDataEvent(
+ IN PKSEVENT_ENTRY EventEntry,
+ IN ULONG DataSize,
+ IN PVOID Data)
+{
+ UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsGenerateEventList(
+ IN GUID* Set OPTIONAL,
+ IN ULONG EventId,
+ IN PLIST_ENTRY EventsList,
+ IN KSEVENTS_LOCKTYPE EventsFlags,
+ IN PVOID EventsLock)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsAddEvent(
+ IN PVOID Object,
+ IN PKSEVENT_ENTRY EventEntry)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+NTSTATUS
+NTAPI
+KsDefaultAddEventHandler(
+ IN PIRP Irp,
+ IN PKSEVENTDATA EventData,
+ IN OUT PKSEVENT_ENTRY EventEntry)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+void
+NTAPI
+KsGenerateEvents(
+ IN PVOID Object,
+ IN const GUID* EventSet OPTIONAL,
+ IN ULONG EventId,
+ IN ULONG DataSize,
+ IN PVOID Data OPTIONAL,
+ IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
+ IN PVOID CallBackContext OPTIONAL)
+{
+ UNIMPLEMENTED
+}
diff --git a/reactos/drivers/ksfilter/ks/filter.c b/reactos/drivers/ksfilter/ks/filter.c
new file mode 100644
index 00000000000..2cb42a737f0
--- /dev/null
+++ b/reactos/drivers/ksfilter/ks/filter.c
@@ -0,0 +1,1077 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/filter.c
+ * PURPOSE: KS IKsFilter interface functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
+#include "priv.h"
+
+typedef struct
+{
+ KSBASIC_HEADER Header;
+ KSFILTER Filter;
+
+ IKsFilterVtbl *lpVtbl;
+ IKsControlVtbl *lpVtblKsControl;
+ IKsFilterFactory * FilterFactory;
+ LONG ref;
+
+ PKSIOBJECT_HEADER ObjectHeader;
+ KSTOPOLOGY Topology;
+ KSPIN_DESCRIPTOR * PinDescriptors;
+ ULONG PinDescriptorCount;
+ PKSFILTERFACTORY Factory;
+ PFILE_OBJECT FileObject;
+
+
+ ULONG *PinInstanceCount;
+}IKsFilterImpl;
+
+const GUID IID_IKsControl = {0x28F54685L, 0x06FD, 0x11D2, {0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
+const GUID IID_IKsFilter = {0x3ef6ee44L, 0x0D41, 0x11d2, {0xbe, 0xDA, 0x00, 0xc0, 0x4f, 0x8e, 0xF4, 0x57}};
+const GUID KSPROPSETID_Topology = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
+const GUID KSPROPSETID_Pin = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
+
+
+DEFINE_KSPROPERTY_TOPOLOGYSET(IKsFilterTopologySet, KspTopologyPropertyHandler);
+DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(IKsFilterPinSet, KspPinPropertyHandler, KspPinPropertyHandler, KspPinPropertyHandler);
+
+KSPROPERTY_SET FilterPropertySet[] =
+{
+ {
+ &KSPROPSETID_Topology,
+ sizeof(IKsFilterTopologySet) / sizeof(KSPROPERTY_ITEM),
+ (const KSPROPERTY_ITEM*)&IKsFilterTopologySet,
+ 0,
+ NULL
+ },
+ {
+ &KSPROPSETID_Pin,
+ sizeof(IKsFilterPinSet) / sizeof(KSPROPERTY_ITEM),
+ (const KSPROPERTY_ITEM*)&IKsFilterPinSet,
+ 0,
+ NULL
+ }
+};
+
+NTSTATUS
+NTAPI
+IKsControl_fnQueryInterface(
+ IKsControl * iface,
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtblKsControl);
+
+ if (IsEqualGUIDAligned(refiid, &IID_IUnknown))
+ {
+ *Output = &This->lpVtbl;
+ _InterlockedIncrement(&This->ref);
+ return STATUS_SUCCESS;
+ }
+ return STATUS_UNSUCCESSFUL;
+}
+
+ULONG
+NTAPI
+IKsControl_fnAddRef(
+ IKsControl * iface)
+{
+ IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtblKsControl);
+
+ return InterlockedIncrement(&This->ref);
+}
+
+ULONG
+NTAPI
+IKsControl_fnRelease(
+ IKsControl * iface)
+{
+ IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtblKsControl);
+
+ InterlockedDecrement(&This->ref);
+
+ /* Return new reference count */
+ return This->ref;
+}
+
+NTSTATUS
+NTAPI
+IKsControl_fnKsProperty(
+ IKsControl * iface,
+ IN PKSPROPERTY Property,
+ IN ULONG PropertyLength,
+ IN OUT PVOID PropertyData,
+ IN ULONG DataLength,
+ OUT ULONG* BytesReturned)
+{
+ IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtblKsControl);
+
+ return KsSynchronousIoControlDevice(This->FileObject, KernelMode, IOCTL_KS_PROPERTY, Property, PropertyLength, PropertyData, DataLength, BytesReturned);
+}
+
+
+NTSTATUS
+NTAPI
+IKsControl_fnKsMethod(
+ IKsControl * iface,
+ IN PKSMETHOD Method,
+ IN ULONG MethodLength,
+ IN OUT PVOID MethodData,
+ IN ULONG DataLength,
+ OUT ULONG* BytesReturned)
+{
+ IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtblKsControl);
+
+ return KsSynchronousIoControlDevice(This->FileObject, KernelMode, IOCTL_KS_METHOD, Method, MethodLength, MethodData, DataLength, BytesReturned);
+}
+
+
+NTSTATUS
+NTAPI
+IKsControl_fnKsEvent(
+ IKsControl * iface,
+ IN PKSEVENT Event OPTIONAL,
+ IN ULONG EventLength,
+ IN OUT PVOID EventData,
+ IN ULONG DataLength,
+ OUT ULONG* BytesReturned)
+{
+ IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtblKsControl);
+
+ if (Event)
+ {
+ return KsSynchronousIoControlDevice(This->FileObject, KernelMode, IOCTL_KS_ENABLE_EVENT, Event, EventLength, EventData, DataLength, BytesReturned);
+ }
+ else
+ {
+ return KsSynchronousIoControlDevice(This->FileObject, KernelMode, IOCTL_KS_DISABLE_EVENT, EventData, DataLength, NULL, 0, BytesReturned);
+ }
+
+}
+
+static IKsControlVtbl vt_IKsControl =
+{
+ IKsControl_fnQueryInterface,
+ IKsControl_fnAddRef,
+ IKsControl_fnRelease,
+ IKsControl_fnKsProperty,
+ IKsControl_fnKsMethod,
+ IKsControl_fnKsEvent
+};
+
+
+NTSTATUS
+NTAPI
+IKsFilter_fnQueryInterface(
+ IKsFilter * iface,
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl);
+
+ if (IsEqualGUIDAligned(refiid, &IID_IUnknown) ||
+ IsEqualGUIDAligned(refiid, &IID_IKsFilter))
+ {
+ *Output = &This->lpVtbl;
+ _InterlockedIncrement(&This->ref);
+ return STATUS_SUCCESS;
+ }
+ else if (IsEqualGUIDAligned(refiid, &IID_IKsControl))
+ {
+ *Output = &This->lpVtblKsControl;
+ _InterlockedIncrement(&This->ref);
+ return STATUS_SUCCESS;
+ }
+
+ return STATUS_UNSUCCESSFUL;
+}
+
+ULONG
+NTAPI
+IKsFilter_fnAddRef(
+ IKsFilter * iface)
+{
+ IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl);
+
+ return InterlockedIncrement(&This->ref);
+}
+
+ULONG
+NTAPI
+IKsFilter_fnRelease(
+ IKsFilter * iface)
+{
+ IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl);
+
+ InterlockedDecrement(&This->ref);
+
+ if (This->ref == 0)
+ {
+ FreeItem(This);
+ return 0;
+ }
+ /* Return new reference count */
+ return This->ref;
+
+}
+
+PKSFILTER
+NTAPI
+IKsFilter_fnGetStruct(
+ IKsFilter * iface)
+{
+ IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl);
+
+ return &This->Filter;
+}
+
+BOOL
+NTAPI
+IKsFilter_fnDoAllNecessaryPinsExist(
+ IKsFilter * iface)
+{
+ UNIMPLEMENTED
+ return FALSE;
+}
+
+NTSTATUS
+NTAPI
+IKsFilter_fnCreateNode(
+ IKsFilter * iface,
+ IN PIRP Irp,
+ IN IKsPin * Pin,
+ IN PLIST_ENTRY ListEntry)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+IKsFilter_fnBindProcessPinsToPipeSection(
+ IKsFilter * iface,
+ IN struct KSPROCESSPIPESECTION *Section,
+ IN PVOID Create,
+ IN PKSPIN KsPin,
+ OUT IKsPin **Pin,
+ OUT PKSGATE *OutGate)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+IKsFilter_fnUnbindProcessPinsFromPipeSection(
+ IKsFilter * iface,
+ IN struct KSPROCESSPIPESECTION *Section)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+IKsFilter_fnAddProcessPin(
+ IKsFilter * iface,
+ IN PKSPROCESSPIN ProcessPin)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+IKsFilter_fnRemoveProcessPin(
+ IKsFilter * iface,
+ IN PKSPROCESSPIN ProcessPin)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+BOOL
+NTAPI
+IKsFilter_fnReprepareProcessPipeSection(
+ IKsFilter * iface,
+ IN struct KSPROCESSPIPESECTION *PipeSection,
+ IN PULONG Data)
+{
+ UNIMPLEMENTED
+ return FALSE;
+}
+
+VOID
+NTAPI
+IKsFilter_fnDeliverResetState(
+ IKsFilter * iface,
+ IN struct KSPROCESSPIPESECTION *PipeSection,
+ IN KSRESET ResetState)
+{
+ UNIMPLEMENTED
+}
+
+BOOL
+NTAPI
+IKsFilter_fnIsFrameHolding(
+ IKsFilter * iface)
+{
+ UNIMPLEMENTED
+ return FALSE;
+}
+
+VOID
+NTAPI
+IKsFilter_fnRegisterForCopyCallbacks(
+ IKsFilter * iface,
+ IKsQueue *Queue,
+ BOOL Register)
+{
+ UNIMPLEMENTED
+}
+
+PKSPROCESSPIN_INDEXENTRY
+NTAPI
+IKsFilter_fnGetProcessDispatch(
+ IKsFilter * iface)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+static IKsFilterVtbl vt_IKsFilter =
+{
+ IKsFilter_fnQueryInterface,
+ IKsFilter_fnAddRef,
+ IKsFilter_fnRelease,
+ IKsFilter_fnGetStruct,
+ IKsFilter_fnDoAllNecessaryPinsExist,
+ IKsFilter_fnCreateNode,
+ IKsFilter_fnBindProcessPinsToPipeSection,
+ IKsFilter_fnUnbindProcessPinsFromPipeSection,
+ IKsFilter_fnAddProcessPin,
+ IKsFilter_fnRemoveProcessPin,
+ IKsFilter_fnReprepareProcessPipeSection,
+ IKsFilter_fnDeliverResetState,
+ IKsFilter_fnIsFrameHolding,
+ IKsFilter_fnRegisterForCopyCallbacks,
+ IKsFilter_fnGetProcessDispatch
+};
+
+NTSTATUS
+IKsFilter_GetFilterFromIrp(
+ IN PIRP Irp,
+ OUT IKsFilter **Filter)
+{
+ PIO_STACK_LOCATION IoStack;
+ PKSIOBJECT_HEADER ObjectHeader;
+ NTSTATUS Status;
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* santiy check */
+ ASSERT(IoStack->FileObject != NULL);
+
+ ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext;
+
+ /* sanity is important */
+ ASSERT(ObjectHeader != NULL);
+ ASSERT(ObjectHeader->Type == KsObjectTypeFilter);
+ ASSERT(ObjectHeader->Unknown != NULL);
+
+ /* get our private interface */
+ Status = ObjectHeader->Unknown->lpVtbl->QueryInterface(ObjectHeader->Unknown, &IID_IKsFilter, (PVOID*)Filter);
+
+ if (!NT_SUCCESS(Status))
+ {
+ /* something is wrong here */
+ DPRINT1("KS: Misbehaving filter %p\n", ObjectHeader->Unknown);
+ Irp->IoStatus.Status = Status;
+
+ /* complete and forget irp */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+ return Status;
+}
+
+
+NTSTATUS
+NTAPI
+IKsFilter_DispatchClose(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ IKsFilter * Filter;
+ IKsFilterImpl * This;
+ NTSTATUS Status;
+
+ /* obtain filter from object header */
+ Status = IKsFilter_GetFilterFromIrp(Irp, &Filter);
+ if (!NT_SUCCESS(Status))
+ return Status;
+
+ /* get our real implementation */
+ This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, lpVtbl);
+
+ /* does the driver support notifications */
+ if (This->Factory->FilterDescriptor && This->Factory->FilterDescriptor->Dispatch && This->Factory->FilterDescriptor->Dispatch->Close)
+ {
+ /* call driver's filter close function */
+ Status = This->Factory->FilterDescriptor->Dispatch->Close(&This->Filter, Irp);
+ }
+
+ if (Status != STATUS_PENDING)
+ {
+ /* save the result */
+ Irp->IoStatus.Status = Status;
+ /* complete irp */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ /* remove our instance from the filter factory */
+ This->FilterFactory->lpVtbl->RemoveFilterInstance(This->FilterFactory, Filter);
+
+ /* now release the acquired interface */
+ Filter->lpVtbl->Release(Filter);
+
+ /* free object header */
+ KsFreeObjectHeader(This->ObjectHeader);
+ }
+
+ /* done */
+ return Status;
+}
+
+NTSTATUS
+KspHandlePropertyInstances(
+ IN PIO_STATUS_BLOCK IoStatus,
+ IN PKSIDENTIFIER Request,
+ IN OUT PVOID Data,
+ IN IKsFilterImpl * This,
+ IN BOOL Global)
+{
+ KSPIN_CINSTANCES * Instances;
+ KSP_PIN * Pin = (KSP_PIN*)Request;
+
+ if (!This->Factory->FilterDescriptor || !This->Factory->FilterDescriptor->PinDescriptorsCount)
+ {
+ /* no filter / pin descriptor */
+ IoStatus->Status = STATUS_NOT_IMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ /* ignore custom structs for now */
+ ASSERT(This->Factory->FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX));
+ ASSERT(This->Factory->FilterDescriptor->PinDescriptorsCount > Pin->PinId);
+
+ Instances = (KSPIN_CINSTANCES*)Data;
+ /* max instance count */
+ Instances->PossibleCount = This->Factory->FilterDescriptor->PinDescriptors[Pin->PinId].InstancesPossible;
+ /* current instance count */
+ Instances->CurrentCount = This->PinInstanceCount[Pin->PinId];
+
+ IoStatus->Information = sizeof(KSPIN_CINSTANCES);
+ IoStatus->Status = STATUS_SUCCESS;
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+KspHandleNecessaryPropertyInstances(
+ IN PIO_STATUS_BLOCK IoStatus,
+ IN PKSIDENTIFIER Request,
+ IN OUT PVOID Data,
+ IN IKsFilterImpl * This)
+{
+ PULONG Result;
+ KSP_PIN * Pin = (KSP_PIN*)Request;
+
+ if (!This->Factory->FilterDescriptor || !This->Factory->FilterDescriptor->PinDescriptorsCount)
+ {
+ /* no filter / pin descriptor */
+ IoStatus->Status = STATUS_NOT_IMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ /* ignore custom structs for now */
+ ASSERT(This->Factory->FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX));
+ ASSERT(This->Factory->FilterDescriptor->PinDescriptorsCount > Pin->PinId);
+
+ Result = (PULONG)Data;
+ *Result = This->Factory->FilterDescriptor->PinDescriptors[Pin->PinId].InstancesNecessary;
+
+ IoStatus->Information = sizeof(ULONG);
+ IoStatus->Status = STATUS_SUCCESS;
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+KspHandleDataIntersection(
+ IN PIRP Irp,
+ IN PIO_STATUS_BLOCK IoStatus,
+ IN PKSIDENTIFIER Request,
+ IN OUT PVOID Data,
+ IN ULONG DataLength,
+ IN IKsFilterImpl * This)
+{
+ PKSMULTIPLE_ITEM MultipleItem;
+ PKSDATARANGE DataRange;
+ NTSTATUS Status = STATUS_NO_MATCH;
+ ULONG Index, Length;
+ KSP_PIN * Pin = (KSP_PIN*)Request;
+
+ /* Access parameters */
+ MultipleItem = (PKSMULTIPLE_ITEM)(Pin + 1);
+ DataRange = (PKSDATARANGE)(MultipleItem + 1);
+
+ if (!This->Factory->FilterDescriptor || !This->Factory->FilterDescriptor->PinDescriptorsCount)
+ {
+ /* no filter / pin descriptor */
+ IoStatus->Status = STATUS_NOT_IMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ /* ignore custom structs for now */
+ ASSERT(This->Factory->FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX));
+ ASSERT(This->Factory->FilterDescriptor->PinDescriptorsCount > Pin->PinId);
+
+ if (This->Factory->FilterDescriptor->PinDescriptors[Pin->PinId].IntersectHandler == NULL ||
+ This->Factory->FilterDescriptor->PinDescriptors[Pin->PinId].PinDescriptor.DataRanges == NULL ||
+ This->Factory->FilterDescriptor->PinDescriptors[Pin->PinId].PinDescriptor.DataRangesCount == 0)
+ {
+ /* no driver supported intersect handler / no provided data ranges */
+ IoStatus->Status = STATUS_NOT_IMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ for(Index = 0; Index < MultipleItem->Count; Index++)
+ {
+ /* Call miniport's properitary handler */
+ Status = This->Factory->FilterDescriptor->PinDescriptors[Pin->PinId].IntersectHandler(NULL, /* context */
+ Irp,
+ Pin,
+ DataRange,
+ (PKSDATAFORMAT)This->Factory->FilterDescriptor->PinDescriptors[Pin->PinId].PinDescriptor.DataRanges,
+ DataLength,
+ Data,
+ &Length);
+
+ if (Status == STATUS_SUCCESS)
+ {
+ IoStatus->Information = Length;
+ break;
+ }
+ DataRange = UlongToPtr(PtrToUlong(DataRange) + DataRange->FormatSize);
+ }
+
+ IoStatus->Status = Status;
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+KspPinPropertyHandler(
+ IN PIRP Irp,
+ IN PKSIDENTIFIER Request,
+ IN OUT PVOID Data)
+{
+ PIO_STACK_LOCATION IoStack;
+ IKsFilterImpl * This;
+ NTSTATUS Status = STATUS_UNSUCCESSFUL;
+
+ /* get filter implementation */
+ This = (IKsFilterImpl*)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
+
+ /* get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ switch(Request->Id)
+ {
+ case KSPROPERTY_PIN_CTYPES:
+ case KSPROPERTY_PIN_DATAFLOW:
+ case KSPROPERTY_PIN_DATARANGES:
+ case KSPROPERTY_PIN_INTERFACES:
+ case KSPROPERTY_PIN_MEDIUMS:
+ case KSPROPERTY_PIN_COMMUNICATION:
+ case KSPROPERTY_PIN_CATEGORY:
+ case KSPROPERTY_PIN_NAME:
+ case KSPROPERTY_PIN_PROPOSEDATAFORMAT:
+ Status = KsPinPropertyHandler(Irp, Request, Data, This->PinDescriptorCount, This->PinDescriptors);
+ break;
+ case KSPROPERTY_PIN_GLOBALCINSTANCES:
+ Status = KspHandlePropertyInstances(&Irp->IoStatus, Request, Data, This, TRUE);
+ break;
+ case KSPROPERTY_PIN_CINSTANCES:
+ Status = KspHandlePropertyInstances(&Irp->IoStatus, Request, Data, This, FALSE);
+ break;
+ case KSPROPERTY_PIN_NECESSARYINSTANCES:
+ Status = KspHandleNecessaryPropertyInstances(&Irp->IoStatus, Request, Data, This);
+ break;
+
+ case KSPROPERTY_PIN_DATAINTERSECTION:
+ Status = KspHandleDataIntersection(Irp, &Irp->IoStatus, Request, Data, IoStack->Parameters.DeviceIoControl.OutputBufferLength, This);
+ break;
+ case KSPROPERTY_PIN_PHYSICALCONNECTION:
+ case KSPROPERTY_PIN_CONSTRAINEDDATARANGES:
+ UNIMPLEMENTED
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+ default:
+ UNIMPLEMENTED
+ Status = STATUS_UNSUCCESSFUL;
+ }
+
+ return Status;
+}
+
+NTSTATUS
+FindPropertyHandler(
+ IN PIO_STATUS_BLOCK IoStatus,
+ IN KSPROPERTY_SET * FilterPropertySet,
+ IN ULONG FilterPropertySetCount,
+ IN PKSPROPERTY Property,
+ IN ULONG InputBufferLength,
+ IN ULONG OutputBufferLength,
+ OUT PFNKSHANDLER *PropertyHandler)
+{
+ ULONG Index, ItemIndex;
+
+ for(Index = 0; Index < FilterPropertySetCount; Index++)
+ {
+ if (IsEqualGUIDAligned(&Property->Set, FilterPropertySet[Index].Set))
+ {
+ for(ItemIndex = 0; ItemIndex < FilterPropertySet[Index].PropertiesCount; ItemIndex++)
+ {
+ if (FilterPropertySet[Index].PropertyItem[ItemIndex].PropertyId == Property->Id)
+ {
+ if (Property->Flags & KSPROPERTY_TYPE_SET)
+ *PropertyHandler = FilterPropertySet[Index].PropertyItem[ItemIndex].SetPropertyHandler;
+
+ if (Property->Flags & KSPROPERTY_TYPE_GET)
+ *PropertyHandler = FilterPropertySet[Index].PropertyItem[ItemIndex].GetPropertyHandler;
+
+ if (FilterPropertySet[Index].PropertyItem[ItemIndex].MinProperty > InputBufferLength)
+ {
+ /* too small input buffer */
+ IoStatus->Information = FilterPropertySet[Index].PropertyItem[ItemIndex].MinProperty;
+ IoStatus->Status = STATUS_BUFFER_TOO_SMALL;
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+
+ if (FilterPropertySet[Index].PropertyItem[ItemIndex].MinData > OutputBufferLength)
+ {
+ /* too small output buffer */
+ IoStatus->Information = FilterPropertySet[Index].PropertyItem[ItemIndex].MinData;
+ IoStatus->Status = STATUS_BUFFER_TOO_SMALL;
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+ return STATUS_SUCCESS;
+ }
+ }
+ }
+ }
+ return STATUS_UNSUCCESSFUL;
+}
+
+
+
+NTSTATUS
+NTAPI
+IKsFilter_DispatchDeviceIoControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ PFNKSHANDLER PropertyHandler = NULL;
+ IKsFilter * Filter;
+ IKsFilterImpl * This;
+ NTSTATUS Status;
+
+ /* obtain filter from object header */
+ Status = IKsFilter_GetFilterFromIrp(Irp, &Filter);
+ if (!NT_SUCCESS(Status))
+ return Status;
+
+ /* get our real implementation */
+ This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, lpVtbl);
+
+ /* current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY)
+ {
+ UNIMPLEMENTED;
+
+ /* release filter interface */
+ Filter->lpVtbl->Release(Filter);
+
+ /* complete and forget irp */
+ Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ /* find a supported property handler */
+ Status = FindPropertyHandler(&Irp->IoStatus, FilterPropertySet, 2, IoStack->Parameters.DeviceIoControl.Type3InputBuffer, IoStack->Parameters.DeviceIoControl.InputBufferLength, IoStack->Parameters.DeviceIoControl.OutputBufferLength, &PropertyHandler);
+ if (NT_SUCCESS(Status))
+ {
+ KSPROPERTY_ITEM_IRP_STORAGE(Irp) = (PVOID)This;
+ DPRINT("Calling property handler %p\n", PropertyHandler);
+ Status = PropertyHandler(Irp, IoStack->Parameters.DeviceIoControl.Type3InputBuffer, Irp->UserBuffer);
+ }
+ else
+ {
+ /* call driver's property handler */
+ UNIMPLEMENTED
+ Status = STATUS_NOT_IMPLEMENTED;
+ }
+
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ /* done */
+ return Status;
+}
+
+static KSDISPATCH_TABLE DispatchTable =
+{
+ IKsFilter_DispatchDeviceIoControl,
+ KsDispatchInvalidDeviceRequest,
+ KsDispatchInvalidDeviceRequest,
+ KsDispatchInvalidDeviceRequest,
+ IKsFilter_DispatchClose,
+ KsDispatchQuerySecurity,
+ KsDispatchSetSecurity,
+ KsDispatchFastIoDeviceControlFailure,
+ KsDispatchFastReadFailure,
+ KsDispatchFastReadFailure,
+};
+
+
+NTSTATUS
+IKsFilter_CreateDescriptors(
+ IKsFilterImpl * This,
+ KSFILTER_DESCRIPTOR* FilterDescriptor)
+{
+ ULONG Index = 0;
+
+ /* initialize pin descriptors */
+ if (FilterDescriptor->PinDescriptorsCount)
+ {
+ /* allocate pin instance count array */
+ This->PinInstanceCount = AllocateItem(NonPagedPool, sizeof(ULONG) * FilterDescriptor->PinDescriptorsCount);
+ if(!This->PinDescriptors)
+ {
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+
+ /* allocate pin descriptor array */
+ This->PinDescriptors = AllocateItem(NonPagedPool, sizeof(KSPIN_DESCRIPTOR) * FilterDescriptor->PinDescriptorsCount);
+ if(!This->PinDescriptors)
+ {
+ FreeItem(This->PinInstanceCount);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* set pin count */
+ This->PinDescriptorCount = FilterDescriptor->PinDescriptorsCount;
+ /* now copy those pin descriptors over */
+ for(Index = 0; Index < FilterDescriptor->PinDescriptorsCount; Index++)
+ {
+ /* copy one pin per time */
+ RtlMoveMemory(&This->PinDescriptors[Index], &FilterDescriptor->PinDescriptors[Index].PinDescriptor, sizeof(KSPIN_DESCRIPTOR));
+ }
+ }
+
+ /* initialize topology descriptor */
+ This->Topology.CategoriesCount = FilterDescriptor->CategoriesCount;
+ This->Topology.Categories = FilterDescriptor->Categories;
+ This->Topology.TopologyNodesCount = FilterDescriptor->NodeDescriptorsCount;
+ This->Topology.TopologyConnectionsCount = FilterDescriptor->ConnectionsCount;
+ This->Topology.TopologyConnections = FilterDescriptor->Connections;
+
+ if (This->Topology.TopologyNodesCount > 0)
+ {
+ This->Topology.TopologyNodes = AllocateItem(NonPagedPool, sizeof(GUID) * This->Topology.TopologyNodesCount);
+ /* allocate topology node types array */
+ if (!This->Topology.TopologyNodes)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ This->Topology.TopologyNodesNames = AllocateItem(NonPagedPool, sizeof(GUID) * This->Topology.TopologyNodesCount);
+ /* allocate topology names array */
+ if (!This->Topology.TopologyNodesNames)
+ {
+ FreeItem((PVOID)This->Topology.TopologyNodes);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ for(Index = 0; Index < This->Topology.TopologyNodesCount; Index++)
+ {
+ /* copy topology type */
+ RtlMoveMemory((PVOID)&This->Topology.TopologyNodes[Index], FilterDescriptor->NodeDescriptors[Index].Type, sizeof(GUID));
+ /* copy topology name */
+ RtlMoveMemory((PVOID)&This->Topology.TopologyNodesNames[Index], FilterDescriptor->NodeDescriptors[Index].Name, sizeof(GUID));
+ }
+ }
+
+ /* done! */
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+KspCreateFilter(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN IKsFilterFactory *iface)
+{
+ IKsFilterImpl * This;
+ PKSFILTERFACTORY Factory;
+ PIO_STACK_LOCATION IoStack;
+ PDEVICE_EXTENSION DeviceExtension;
+ NTSTATUS Status;
+
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* get the filter factory */
+ Factory = iface->lpVtbl->GetStruct(iface);
+
+ if (!Factory || !Factory->FilterDescriptor || !Factory->FilterDescriptor->Dispatch || !Factory->FilterDescriptor->Dispatch->Create)
+ {
+ /* Sorry it just will not work */
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* allocate filter instance */
+ This = AllocateItem(NonPagedPool, sizeof(IKsFilterFactory));
+ if (!This)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* initialize filter instance */
+ This->ref = 1;
+ This->lpVtbl = &vt_IKsFilter;
+ This->lpVtblKsControl = &vt_IKsControl;
+ This->Filter.Descriptor = Factory->FilterDescriptor;
+ This->Factory = Factory;
+ This->FilterFactory = iface;
+ This->FileObject = IoStack->FileObject;
+ This->Header.KsDevice = &DeviceExtension->DeviceHeader->KsDevice;
+ This->Header.Type = KsObjectTypeFilter;
+
+ /* allocate the stream descriptors */
+ Status = IKsFilter_CreateDescriptors(This, (PKSFILTER_DESCRIPTOR)Factory->FilterDescriptor);
+ if (!NT_SUCCESS(Status))
+ {
+ /* what can go wrong, goes wrong */
+ FreeItem(This);
+ return Status;
+ }
+
+ /* now add the filter instance to the filter factory */
+ Status = iface->lpVtbl->AddFilterInstance(iface, (IKsFilter*)&This->lpVtbl);
+
+ if (!NT_SUCCESS(Status))
+ {
+ /* failed to add filter */
+ FreeItem(This);
+
+ return Status;
+ }
+
+ /* now let driver initialize the filter instance */
+ Status = Factory->FilterDescriptor->Dispatch->Create(&This->Filter, Irp);
+
+ if (!NT_SUCCESS(Status) && Status != STATUS_PENDING)
+ {
+ /* driver failed to initialize */
+ DPRINT1("Driver: Status %x\n", Status);
+
+ /* remove filter instance from filter factory */
+ iface->lpVtbl->RemoveFilterInstance(iface, (IKsFilter*)&This->lpVtbl);
+
+ /* free filter instance */
+ FreeItem(This);
+
+ return Status;
+ }
+
+ /* now allocate the object header */
+ Status = KsAllocateObjectHeader((PVOID*)&This->ObjectHeader, 0, NULL, Irp, &DispatchTable);
+ if (!NT_SUCCESS(Status))
+ {
+ /* failed to allocate object header */
+ DPRINT1("Failed to allocate object header %x\n", Status);
+
+ return Status;
+ }
+
+ /* initialize object header */
+ This->Header.Type = KsObjectTypeFilter;
+ This->Header.KsDevice = &DeviceExtension->DeviceHeader->KsDevice;
+ This->ObjectHeader->Type = KsObjectTypeFilter;
+ This->ObjectHeader->Unknown = (PUNKNOWN)&This->lpVtbl;
+
+
+ /* completed initialization */
+ return Status;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsFilterAcquireProcessingMutex(
+ IN PKSFILTER Filter)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsFilterReleaseProcessingMutex(
+ IN PKSFILTER Filter)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsFilterAddTopologyConnections (
+ IN PKSFILTER Filter,
+ IN ULONG NewConnectionsCount,
+ IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsFilterAttemptProcessing(
+ IN PKSFILTER Filter,
+ IN BOOLEAN Asynchronous)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsFilterCreateNode (
+ IN PKSFILTER Filter,
+ IN const KSNODE_DESCRIPTOR *const NodeDescriptor,
+ OUT PULONG NodeID)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsFilterCreatePinFactory (
+ IN PKSFILTER Filter,
+ IN const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
+ OUT PULONG PinID)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+PKSGATE
+NTAPI
+KsFilterGetAndGate(
+ IN PKSFILTER Filter)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+ULONG
+NTAPI
+KsFilterGetChildPinCount(
+ IN PKSFILTER Filter,
+ IN ULONG PinId)
+{
+ UNIMPLEMENTED
+ return 0;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+PKSPIN
+NTAPI
+KsFilterGetFirstChildPin(
+ IN PKSFILTER Filter,
+ IN ULONG PinId)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsFilterRegisterPowerCallbacks(
+ IN PKSFILTER Filter,
+ IN PFNKSFILTERPOWER Sleep OPTIONAL,
+ IN PFNKSFILTERPOWER Wake OPTIONAL)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+PKSFILTER
+NTAPI
+KsGetFilterFromIrp(
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
diff --git a/reactos/drivers/ksfilter/ks/filterfactory.c b/reactos/drivers/ksfilter/ks/filterfactory.c
new file mode 100644
index 00000000000..91c86e9e332
--- /dev/null
+++ b/reactos/drivers/ksfilter/ks/filterfactory.c
@@ -0,0 +1,473 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/filterfactory.c
+ * PURPOSE: KS IKsFilterFactory interface functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
+#include "priv.h"
+
+typedef struct
+{
+ KSBASIC_HEADER Header;
+ KSFILTERFACTORY FilterFactory;
+
+ IKsFilterFactoryVtbl *lpVtbl;
+ LONG ref;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PFNKSFILTERFACTORYPOWER SleepCallback;
+ PFNKSFILTERFACTORYPOWER WakeCallback;
+
+ LIST_ENTRY SymbolicLinkList;
+ LIST_ENTRY FilterInstanceList;
+}IKsFilterFactoryImpl;
+
+typedef struct
+{
+ LIST_ENTRY Entry;
+ IKsFilter *FilterInstance;
+}FILTER_INSTANCE_ENTRY, *PFILTER_INSTANCE_ENTRY;
+
+
+
+VOID
+NTAPI
+IKsFilterFactory_ItemFreeCb(
+ IN PKSOBJECT_CREATE_ITEM CreateItem)
+{
+ /* callback when create item is freed in the device header */
+ IKsFilterFactory * iface = (IKsFilterFactory*)CONTAINING_RECORD(CreateItem->Context, IKsFilterFactoryImpl, FilterFactory);
+
+ iface->lpVtbl->Release(iface);
+}
+
+NTSTATUS
+NTAPI
+IKsFilterFactory_Create(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PKSOBJECT_CREATE_ITEM CreateItem;
+ IKsFilterFactory * iface;
+ NTSTATUS Status;
+
+ /* access the create item */
+ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+ if (!CreateItem)
+ {
+ DPRINT1("IKsFilterFactory_Create no CreateItem\n");
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* get filter factory interface */
+ iface = (IKsFilterFactory*)CONTAINING_RECORD(CreateItem->Context, IKsFilterFactoryImpl, FilterFactory);
+
+ /* create a filter instance */
+ Status = KspCreateFilter(DeviceObject, Irp, iface);
+
+ DPRINT("KspCreateFilter Status %x\n", Status);
+
+ if (Status != STATUS_PENDING)
+ {
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+
+ return Status;
+}
+
+
+NTSTATUS
+NTAPI
+IKsFilterFactory_fnQueryInterface(
+ IKsFilterFactory * iface,
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl);
+
+ if (IsEqualGUIDAligned(refiid, &IID_IUnknown))
+ {
+ *Output = &This->lpVtbl;
+ _InterlockedIncrement(&This->ref);
+ return STATUS_SUCCESS;
+ }
+ return STATUS_UNSUCCESSFUL;
+}
+
+ULONG
+NTAPI
+IKsFilterFactory_fnAddRef(
+ IKsFilterFactory * iface)
+{
+ IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl);
+
+ return InterlockedIncrement(&This->ref);
+}
+
+ULONG
+NTAPI
+IKsFilterFactory_fnRelease(
+ IKsFilterFactory * iface)
+{
+ IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl);
+
+ InterlockedDecrement(&This->ref);
+
+ if (This->ref == 0)
+ {
+ if (!IsListEmpty(&This->SymbolicLinkList))
+ {
+ /* disable device interfaces */
+ KspSetDeviceInterfacesState(&This->SymbolicLinkList, FALSE);
+ /* free device interface strings */
+ KspFreeDeviceInterfaces(&This->SymbolicLinkList);
+ }
+
+ FreeItem(This);
+ return 0;
+ }
+ /* Return new reference count */
+ return This->ref;
+}
+
+KSFILTERFACTORY*
+NTAPI
+IKsFilterFactory_fnGetStruct(
+ IKsFilterFactory * iface)
+{
+ IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl);
+
+ return &This->FilterFactory;
+}
+
+NTSTATUS
+NTAPI
+IKsFilterFactory_fnSetDeviceClassesState(
+ IKsFilterFactory * iface,
+ IN BOOLEAN Enable)
+{
+ IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl);
+
+ return KspSetDeviceInterfacesState(&This->SymbolicLinkList, Enable);
+}
+
+NTSTATUS
+NTAPI
+IKsFilterFactory_fnInitialize(
+ IKsFilterFactory * iface,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN const KSFILTER_DESCRIPTOR *Descriptor,
+ IN PWSTR RefString OPTIONAL,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
+ IN ULONG CreateItemFlags,
+ IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
+ IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
+ OUT PKSFILTERFACTORY *FilterFactory OPTIONAL)
+{
+ UNICODE_STRING ReferenceString;
+ NTSTATUS Status;
+ PDEVICE_EXTENSION DeviceExtension;
+ KSOBJECT_CREATE_ITEM CreateItem;
+ BOOL FreeString = FALSE;
+
+ IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl);
+
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* initialize filterfactory */
+ This->SleepCallback = SleepCallback;
+ This->WakeCallback = WakeCallback;
+ This->FilterFactory.FilterDescriptor = Descriptor;
+ This->Header.KsDevice = &DeviceExtension->DeviceHeader->KsDevice;
+ This->Header.Type = KsObjectTypeFilterFactory;
+ This->DeviceHeader = DeviceExtension->DeviceHeader;
+
+ InitializeListHead(&This->SymbolicLinkList);
+ InitializeListHead(&This->FilterInstanceList);
+
+ /* does the device use a reference string */
+ if (RefString || !Descriptor->ReferenceGuid)
+ {
+ /* use device reference string */
+ RtlInitUnicodeString(&ReferenceString, RefString);
+ }
+ else
+ {
+ /* create reference string from descriptor guid */
+ Status = RtlStringFromGUID(Descriptor->ReferenceGuid, &ReferenceString);
+
+ /* check for success */
+ if (!NT_SUCCESS(Status))
+ {
+ /* omg, we failed */
+ return Status;
+ }
+
+ FreeString = TRUE;
+ }
+
+ /* now register the device interface */
+ Status = KspRegisterDeviceInterfaces(DeviceExtension->DeviceHeader->KsDevice.PhysicalDeviceObject,
+ Descriptor->CategoriesCount,
+ Descriptor->Categories,
+ &ReferenceString,
+ &This->SymbolicLinkList);
+ /* check for success */
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("KspRegisterDeviceInterfaces failed with %x\n", Status);
+
+ if (FreeString)
+ {
+ /* free unicode string */
+ RtlFreeUnicodeString(&ReferenceString);
+ }
+
+ return Status;
+ }
+
+ /* now setup the create item */
+ CreateItem.SecurityDescriptor = SecurityDescriptor;
+ CreateItem.Flags = CreateItemFlags;
+ CreateItem.Create = IKsFilterFactory_Create;
+ CreateItem.Context = (PVOID)&This->FilterFactory;
+ RtlInitUnicodeString(&CreateItem.ObjectClass, ReferenceString.Buffer);
+
+ /* insert create item to device header */
+ Status = KsAllocateObjectCreateItem((KSDEVICE_HEADER)DeviceExtension->DeviceHeader, &CreateItem, TRUE, IKsFilterFactory_ItemFreeCb);
+
+ if (FreeString)
+ {
+ /* free unicode string */
+ RtlFreeUnicodeString(&ReferenceString);
+ }
+
+ if (FilterFactory)
+ {
+ /* return filterfactory */
+ *FilterFactory = &This->FilterFactory;
+
+ /*FIXME create object bag */
+ }
+
+
+ /* return result */
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+IKsFilterFactory_fnAddFilterInstance(
+ IKsFilterFactory * iface,
+ IN IKsFilter *FilterInstance)
+{
+ PFILTER_INSTANCE_ENTRY Entry;
+ IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl);
+
+ /* allocate filter instance entry */
+ Entry = AllocateItem(NonPagedPool, sizeof(FILTER_INSTANCE_ENTRY));
+ if (!Entry)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* initialize filter instance entry */
+ Entry->FilterInstance = FilterInstance;
+
+ /* insert entry */
+ InsertTailList(&This->FilterInstanceList, &Entry->Entry);
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+IKsFilterFactory_fnRemoveFilterInstance(
+ IKsFilterFactory * iface,
+ IN IKsFilter *FilterInstance)
+{
+ PFILTER_INSTANCE_ENTRY InstanceEntry;
+ PLIST_ENTRY Entry;
+ IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl);
+
+ /* point to first entry */
+ Entry = This->FilterInstanceList.Flink;
+
+ while(Entry != &This->FilterInstanceList)
+ {
+ InstanceEntry = (PFILTER_INSTANCE_ENTRY)CONTAINING_RECORD(Entry, FILTER_INSTANCE_ENTRY, Entry);
+ if (InstanceEntry->FilterInstance == FilterInstance)
+ {
+ /* found entry */
+ RemoveEntryList(&InstanceEntry->Entry);
+ FreeItem(InstanceEntry);
+ return STATUS_SUCCESS;
+ }
+ }
+
+ /* entry not in list! */
+ return STATUS_NOT_FOUND;
+}
+
+static IKsFilterFactoryVtbl vt_IKsFilterFactoryVtbl =
+{
+ IKsFilterFactory_fnQueryInterface,
+ IKsFilterFactory_fnAddRef,
+ IKsFilterFactory_fnRelease,
+ IKsFilterFactory_fnGetStruct,
+ IKsFilterFactory_fnSetDeviceClassesState,
+ IKsFilterFactory_fnInitialize,
+ IKsFilterFactory_fnAddFilterInstance,
+ IKsFilterFactory_fnRemoveFilterInstance
+};
+
+
+NTSTATUS
+NTAPI
+KspCreateFilterFactory(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN const KSFILTER_DESCRIPTOR *Descriptor,
+ IN PWSTR RefString OPTIONAL,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
+ IN ULONG CreateItemFlags,
+ IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
+ IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
+ OUT PKSFILTERFACTORY *FilterFactory OPTIONAL)
+{
+ IKsFilterFactoryImpl * This;
+ IKsFilterFactory * Filter;
+ NTSTATUS Status;
+
+ /* Lets allocate a filterfactory */
+ This = AllocateItem(NonPagedPool, sizeof(IKsFilterFactoryImpl));
+ if (!This)
+ {
+ /* not enough memory */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* initialize struct */
+ This->ref = 1;
+ This->lpVtbl = &vt_IKsFilterFactoryVtbl;
+
+ /* map to com object */
+ Filter = (IKsFilterFactory*)&This->lpVtbl;
+
+ /* initialize filter */
+ Status = Filter->lpVtbl->Initialize(Filter, DeviceObject, Descriptor, RefString, SecurityDescriptor, CreateItemFlags, SleepCallback, WakeCallback, FilterFactory);
+ /* did we succeed */
+ if (!NT_SUCCESS(Status))
+ {
+ /* destroy filterfactory */
+ Filter->lpVtbl->Release(Filter);
+ }
+
+ /* return result */
+ return Status;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsCreateFilterFactory(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN const KSFILTER_DESCRIPTOR *Descriptor,
+ IN PWSTR RefString OPTIONAL,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
+ IN ULONG CreateItemFlags,
+ IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
+ IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
+ OUT PKSFILTERFACTORY *FilterFactory OPTIONAL)
+{
+ return KspCreateFilterFactory(DeviceObject, Descriptor, RefString, SecurityDescriptor, CreateItemFlags, SleepCallback, WakeCallback, FilterFactory);
+
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsFilterFactorySetDeviceClassesState(
+ IN PKSFILTERFACTORY FilterFactory,
+ IN BOOLEAN NewState)
+{
+ IKsFilterFactory * Factory = (IKsFilterFactory*)CONTAINING_RECORD(FilterFactory, IKsFilterFactoryImpl, FilterFactory);
+
+ return Factory->lpVtbl->SetDeviceClassesState(Factory, NewState);
+}
+
+
+/*
+ @implemented
+*/
+KSDDKAPI
+PUNICODE_STRING
+NTAPI
+KsFilterFactoryGetSymbolicLink(
+ IN PKSFILTERFACTORY FilterFactory)
+{
+ PSYMBOLIC_LINK_ENTRY LinkEntry;
+ IKsFilterFactoryImpl * Factory = (IKsFilterFactoryImpl*)CONTAINING_RECORD(FilterFactory, IKsFilterFactoryImpl, FilterFactory);
+
+ if (IsListEmpty(&Factory->SymbolicLinkList))
+ {
+ /* device has not registered any interfaces */
+ return NULL;
+ }
+
+ /* get first entry */
+ LinkEntry = (PSYMBOLIC_LINK_ENTRY)CONTAINING_RECORD(Factory->SymbolicLinkList.Flink, SYMBOLIC_LINK_ENTRY, Entry);
+
+ /* return first link */
+ return &LinkEntry->SymbolicLink;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsFilterFactoryAddCreateItem(
+ IN PKSFILTERFACTORY FilterFactory,
+ IN PWSTR RefString,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
+ IN ULONG CreateItemFlags)
+{
+ KSOBJECT_CREATE_ITEM CreateItem;
+
+ IKsFilterFactoryImpl * Factory = (IKsFilterFactoryImpl*)CONTAINING_RECORD(FilterFactory, IKsFilterFactoryImpl, FilterFactory);
+
+ /* initialize create item */
+ CreateItem.Context = (PVOID)&Factory->FilterFactory;
+ CreateItem.Create = IKsFilterFactory_Create;
+ CreateItem.Flags = CreateItemFlags;
+ CreateItem.SecurityDescriptor = SecurityDescriptor;
+ RtlInitUnicodeString(&CreateItem.ObjectClass, RefString);
+
+ /* insert create item to device header */
+ return KsAllocateObjectCreateItem((KSDEVICE_HEADER)Factory->DeviceHeader, &CreateItem, TRUE, IKsFilterFactory_ItemFreeCb);
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsFilterFactoryUpdateCacheData (
+ IN PKSFILTERFACTORY FilterFactory,
+ IN const KSFILTER_DESCRIPTOR* FilterDescriptor OPTIONAL)
+{
+ UNIMPLEMENTED
+
+ return STATUS_NOT_IMPLEMENTED;
+}
+
diff --git a/reactos/drivers/ksfilter/ks/image.c b/reactos/drivers/ksfilter/ks/image.c
new file mode 100644
index 00000000000..39df5e240e1
--- /dev/null
+++ b/reactos/drivers/ksfilter/ks/image.c
@@ -0,0 +1,116 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/allocators.c
+ * PURPOSE: KS Allocator functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+#include "priv.h"
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsLoadResource(
+ IN PVOID ImageBase,
+ IN POOL_TYPE PoolType,
+ IN ULONG_PTR ResourceName,
+ IN ULONG ResourceType,
+ OUT PVOID* Resource,
+ OUT PULONG ResourceSize)
+{
+ NTSTATUS Status;
+ LDR_RESOURCE_INFO ResourceInfo;
+ PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry;
+ PVOID Data;
+ ULONG Size;
+ PVOID Result = NULL;
+
+ /* set up resource info */
+ ResourceInfo.Type = ResourceType;
+ ResourceInfo.Name = ResourceName;
+ ResourceInfo.Language = 0;
+
+ _SEH2_TRY
+ {
+ /* find the resource */
+ Status = LdrFindResource_U(ImageBase, &ResourceInfo, RESOURCE_DATA_LEVEL, &ResourceDataEntry);
+ if (NT_SUCCESS(Status))
+ {
+ /* try accessing it */
+ Status = LdrAccessResource(ImageBase, ResourceDataEntry, &Data, &Size);
+ if (NT_SUCCESS(Status))
+ {
+ /* allocate resource buffer */
+ Result = ExAllocatePool(PoolType, Size);
+ if (Result)
+ {
+ /* copy resource */
+ RtlMoveMemory(Result, Data, Size);
+ /* store result */
+ *Resource = Result;
+ *ResourceSize = Size;
+ }
+ else
+ {
+ /* not enough memory */
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ }
+ }
+ }
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ /* Exception, get the error code */
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ if (!NT_SUCCESS(Status))
+ {
+ /* failed */
+ if (Result)
+ {
+ /* free resource buffer in case of a failure */
+ ExFreePool(Result);
+ }
+ }
+ /* done */
+ return Status;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsGetImageNameAndResourceId(
+ IN HANDLE RegKey,
+ OUT PUNICODE_STRING ImageName,
+ OUT PULONG_PTR ResourceId,
+ OUT PULONG ValueType)
+{
+ UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsMapModuleName(
+ IN PDEVICE_OBJECT PhysicalDeviceObject,
+ IN PUNICODE_STRING ModuleName,
+ OUT PUNICODE_STRING ImageName,
+ OUT PULONG_PTR ResourceId,
+ OUT PULONG ValueType)
+{
+ UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
+}
diff --git a/reactos/drivers/ksfilter/ks/irp.c b/reactos/drivers/ksfilter/ks/irp.c
index 722d1e1e659..2603701b9b1 100644
--- a/reactos/drivers/ksfilter/ks/irp.c
+++ b/reactos/drivers/ksfilter/ks/irp.c
@@ -1,494 +1,162 @@
/*
- ReactOS Kernel Streaming
- IRP Helpers
-*/
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/factory.c
+ * PURPOSE: KS Allocator functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
#include "priv.h"
/*
@unimplemented
*/
-KSDDKAPI NTSTATUS NTAPI
-KsAcquireResetValue(
- IN PIRP Irp,
- OUT KSRESET* ResetValue)
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsReferenceBusObject(
+ IN KSDEVICE_HEADER Header)
{
UNIMPLEMENTED;
return STATUS_UNSUCCESSFUL;
}
/*
- @implemented
+ @unimplemented
*/
KSDDKAPI
VOID
NTAPI
-KsAddIrpToCancelableQueue(
- IN OUT PLIST_ENTRY QueueHead,
- IN PKSPIN_LOCK SpinLock,
- IN PIRP Irp,
- IN KSLIST_ENTRY_LOCATION ListLocation,
- IN PDRIVER_CANCEL DriverCancel OPTIONAL)
-{
- PQUEUE_ENTRY Entry;
-
- if (!QueueHead || !SpinLock || !Irp)
- return;
-
- Entry = ExAllocatePool(NonPagedPool, sizeof(QUEUE_ENTRY));
- if (!Entry)
- return;
-
- ///FIXME
- // setup cancel routine
- //
-
- Entry->Irp = Irp;
-
- if (ListLocation == KsListEntryTail)
- ExInterlockedInsertTailList(QueueHead, &Entry->Entry, SpinLock);
- else
- ExInterlockedInsertHeadList(QueueHead, &Entry->Entry, SpinLock);
-
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsAddObjectCreateItemToObjectHeader(
- IN KSOBJECT_HEADER Header,
- IN PDRIVER_DISPATCH Create,
- IN PVOID Context,
- IN PWCHAR ObjectClass,
- IN PSECURITY_DESCRIPTOR SecurityDescriptor)
+KsDereferenceBusObject(
+ IN KSDEVICE_HEADER Header)
{
UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-
-/*
- @implemented
-*/
-KSDDKAPI
-NTSTATUS
-NTAPI
-KsAddObjectCreateItemToDeviceHeader(
- IN KSDEVICE_HEADER DevHeader,
- IN PDRIVER_DISPATCH Create,
- IN PVOID Context,
- IN PWCHAR ObjectClass,
- IN PSECURITY_DESCRIPTOR SecurityDescriptor)
-{
- PKSIDEVICE_HEADER Header;
- ULONG FreeIndex, Index;
-
- Header = (PKSIDEVICE_HEADER)DevHeader;
-
- DPRINT1("KsAddObjectCreateItemToDeviceHeader entered\n");
-
- /* check if a device header has been provided */
- if (!DevHeader)
- return STATUS_INVALID_PARAMETER_1;
-
- /* check if a create item has been provided */
- if (!Create)
- return STATUS_INVALID_PARAMETER_2;
-
- /* check if a object class has been provided */
- if (!ObjectClass)
- return STATUS_INVALID_PARAMETER_4;
-
- FreeIndex = (ULONG)-1;
- /* now scan the list and check for a free item */
- for(Index = 0; Index < Header->MaxItems; Index++)
- {
- if (!Header->ItemList[Index].bCreated)
- {
- if (FreeIndex == (ULONG)-1)
- FreeIndex = Index;
-
- continue;
- }
- else if (!wcsicmp(ObjectClass, Header->ItemList[Index].CreateItem.ObjectClass.Buffer))
- {
- /* the same object class already exists */
- return STATUS_OBJECT_NAME_COLLISION;
- }
- }
- /* found a free index */
- if (FreeIndex == (ULONG)-1)
- {
- /* allocate a new device entry */
- PDEVICE_ITEM Item = ExAllocatePoolWithTag(NonPagedPool, sizeof(DEVICE_ITEM) * (Header->MaxItems + 1), TAG_DEVICE_HEADER);
- if (!Item)
- return STATUS_INSUFFICIENT_RESOURCES;
-
- RtlMoveMemory(Item, Header->ItemList, Header->MaxItems * sizeof(DEVICE_ITEM));
- ExFreePoolWithTag(Header->ItemList, TAG_DEVICE_HEADER);
-
- Header->ItemList = Item;
- FreeIndex = Header->MaxItems;
- Header->MaxItems++;
- }
-
- /* store the new item */
- Header->ItemList[FreeIndex].bCreated = TRUE;
- Header->ItemList[FreeIndex].CreateItem.Create = Create;
- Header->ItemList[FreeIndex].CreateItem.Context = Context;
- RtlInitUnicodeString(&Header->ItemList[FreeIndex].CreateItem.ObjectClass, ObjectClass);
- Header->ItemList[FreeIndex].CreateItem.SecurityDescriptor = SecurityDescriptor;
- Header->ItemList[FreeIndex].CreateItem.Flags = 0;
- return STATUS_SUCCESS;
-}
-
-/*
- @implemented
-*/
-KSDDKAPI
-NTSTATUS
-NTAPI
-KsAllocateDeviceHeader(
- OUT KSDEVICE_HEADER* OutHeader,
- IN ULONG ItemsCount,
- IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL)
-{
- ULONG Index = 0;
- PKSIDEVICE_HEADER Header;
-
- if (!OutHeader)
- return STATUS_INVALID_PARAMETER;
-
- /* allocate a device header */
- Header = ExAllocatePoolWithTag(PagedPool, sizeof(KSIDEVICE_HEADER), TAG_DEVICE_HEADER);
-
- /* check for success */
- if (!Header)
- return STATUS_INSUFFICIENT_RESOURCES;
-
- /* clear all memory */
- RtlZeroMemory(Header, sizeof(KSIDEVICE_HEADER));
-
- /* initialize spin lock */
- KeInitializeSpinLock(&Header->ItemListLock);
-
- /* are there any create items provided */
- if (ItemsCount && ItemsList)
- {
- /* allocate space for device item list */
- Header->ItemList = ExAllocatePoolWithTag(NonPagedPool, sizeof(DEVICE_ITEM) * ItemsCount, TAG_DEVICE_HEADER);
- if (!Header->ItemList)
- {
- ExFreePoolWithTag(Header, TAG_DEVICE_HEADER);
- return STATUS_INSUFFICIENT_RESOURCES;
- }
- RtlZeroMemory(Header->ItemList, sizeof(DEVICE_ITEM) * ItemsCount);
-
- for(Index = 0; Index < ItemsCount; Index++)
- {
- /* copy provided create items */
- RtlMoveMemory(&Header->ItemList[Index].CreateItem, &ItemsList[Index], sizeof(KSOBJECT_CREATE_ITEM));
- if (ItemsList[Index].Create!= NULL)
- {
- Header->ItemList[Index].bCreated = TRUE;
- }
- }
- Header->MaxItems = ItemsCount;
- }
-
- /* store result */
- *OutHeader = Header;
-
- return STATUS_SUCCESS;
}
/*
@unimplemented
-
- http://www.osronline.com/DDKx/stream/ksfunc_3sc3.htm
-*/
-KSDDKAPI
-NTSTATUS
-NTAPI
-KsAllocateObjectCreateItem(
- IN KSDEVICE_HEADER DevHeader,
- IN PKSOBJECT_CREATE_ITEM CreateItem,
- IN BOOLEAN AllocateEntry,
- IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL)
-{
- PKSIDEVICE_HEADER Header;
-
- Header = (PKSIDEVICE_HEADER)DevHeader;
-
- if (!DevHeader)
- return STATUS_INVALID_PARAMETER_1;
-
- if (!CreateItem)
- return STATUS_INVALID_PARAMETER_2;
-
- //FIXME
- //handle ItemFreeCallback
- //
- if (AllocateEntry && ItemFreeCallback)
- DPRINT1("Ignoring ItemFreeCallback\n");
-
- return KsAddObjectCreateItemToDeviceHeader(DevHeader, CreateItem->Create, CreateItem->Context, CreateItem->ObjectClass.Buffer, CreateItem->SecurityDescriptor);
-}
-
-
-/*
- @implemented
*/
KSDDKAPI
VOID
NTAPI
-KsFreeDeviceHeader(
- IN KSDEVICE_HEADER DevHeader)
-{
- PKSIDEVICE_HEADER Header;
-
- Header = (PKSIDEVICE_HEADER)DevHeader;
-
- if (!DevHeader)
- return;
-
- ExFreePoolWithTag(Header->ItemList, TAG_DEVICE_HEADER);
- ExFreePoolWithTag(Header, TAG_DEVICE_HEADER);
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsAllocateExtraData(
- IN PIRP Irp,
- IN ULONG ExtraSize,
- OUT PVOID* ExtraBuffer)
+KsDereferenceSoftwareBusObject(
+ IN KSDEVICE_HEADER Header)
{
UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
}
/*
- @unimplemented
-
- Initialize the required file context header.
- Allocates KSOBJECT_HEADER structure.
- Irp is an IRP_MJ_CREATE structure.
- Driver must allocate KSDISPATCH_TABLE and initialize it first.
-
- http://www.osronline.com/DDKx/stream/ksfunc_0u2b.htm
+ @implemented
*/
KSDDKAPI
NTSTATUS
NTAPI
-KsAllocateObjectHeader(
- OUT KSOBJECT_HEADER *Header,
- IN ULONG ItemsCount,
- IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL,
- IN PIRP Irp,
- IN KSDISPATCH_TABLE* Table)
+KsDispatchQuerySecurity(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
{
+ PKSOBJECT_CREATE_ITEM CreateItem;
PIO_STACK_LOCATION IoStack;
- PDEVICE_EXTENSION DeviceExtension;
- PKSIDEVICE_HEADER DeviceHeader;
- PKSIOBJECT_HEADER ObjectHeader;
- WCHAR ObjectClass[50];
+ NTSTATUS Status;
+ ULONG Length;
- if (!Header)
- return STATUS_INVALID_PARAMETER_1;
-
- if (!Irp)
- return STATUS_INVALID_PARAMETER_4;
-
- if (!Table)
- return STATUS_INVALID_PARAMETER_5;
-
- /* get current stack location */
+ /* get current irp stack */
IoStack = IoGetCurrentIrpStackLocation(Irp);
- /* get device extension */
- DeviceExtension = (PDEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension;
- /* get device header */
- DeviceHeader = DeviceExtension->DeviceHeader;
- ObjectClass[0] = L'\0';
- /* check for an file object */
- if (IoStack->FileObject != NULL)
+ /* get create item */
+ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+
+ if (!CreateItem || !CreateItem->SecurityDescriptor)
{
- /* validate the file name */
- if (IoStack->FileObject->FileName.Length >= 38)
- {
- RtlMoveMemory(ObjectClass, IoStack->FileObject->FileName.Buffer, 38 * sizeof(WCHAR));
- ObjectClass[38] = L'\0';
- DPRINT("ObjectClass %S\n", ObjectClass);
- }
- }
- /* allocate the object header */
- ObjectHeader = ExAllocatePoolWithTag(NonPagedPool, sizeof(KSIOBJECT_HEADER), TAG_DEVICE_HEADER);
- if (!ObjectHeader)
- return STATUS_INSUFFICIENT_RESOURCES;
-
- /* initialize object header */
- RtlZeroMemory(ObjectHeader, sizeof(KSIOBJECT_HEADER));
-
- /* do we have a name */
- if (ObjectClass[0])
- {
- ObjectHeader->ObjectClass = ExAllocatePoolWithTag(NonPagedPool, 40 * sizeof(WCHAR), TAG_DEVICE_HEADER);
- if (ObjectHeader->ObjectClass)
- {
- wcscpy(ObjectHeader->ObjectClass, ObjectClass);
- }
+ /* no create item */
+ Irp->IoStatus.Status = STATUS_NO_SECURITY_ON_OBJECT;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_NO_SECURITY_ON_OBJECT;
}
- /* copy dispatch table */
- RtlCopyMemory(&ObjectHeader->DispatchTable, Table, sizeof(KSDISPATCH_TABLE));
- /* store create items */
- if (ItemsCount && ItemsList)
+
+ /* get input length */
+ Length = IoStack->Parameters.QuerySecurity.Length;
+
+ /* clone the security descriptor */
+ Status = SeQuerySecurityDescriptorInfo(&IoStack->Parameters.QuerySecurity.SecurityInformation, (PSECURITY_DESCRIPTOR)Irp->UserBuffer, &Length, &CreateItem->SecurityDescriptor);
+
+ DPRINT("SeQuerySecurityDescriptorInfo Status %x\n", Status);
+ /* store result */
+ Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Information = Length;
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsDispatchSetSecurity(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PKSOBJECT_CREATE_ITEM CreateItem;
+ PIO_STACK_LOCATION IoStack;
+ PGENERIC_MAPPING Mapping;
+ PSECURITY_DESCRIPTOR Descriptor;
+ NTSTATUS Status;
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* get create item */
+ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+
+ if (!CreateItem || !CreateItem->SecurityDescriptor)
{
- ObjectHeader->ItemCount = ItemsCount;
- ObjectHeader->CreateItem = ItemsList;
+ /* no create item */
+ Irp->IoStatus.Status = STATUS_NO_SECURITY_ON_OBJECT;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_NO_SECURITY_ON_OBJECT;
}
- /* was the request for a pin/clock/node */
- if (IoStack->FileObject->FileName.Buffer)
+ /* backup old descriptor */
+ Descriptor = CreateItem->SecurityDescriptor;
+
+ /* get generic mapping */
+ Mapping = IoGetFileObjectGenericMapping();
+
+ /* change security descriptor */
+ Status = SeSetSecurityDescriptorInfo(NULL, /*FIXME */
+ &IoStack->Parameters.SetSecurity.SecurityInformation,
+ IoStack->Parameters.SetSecurity.SecurityDescriptor,
+ &CreateItem->SecurityDescriptor,
+ NonPagedPool,
+ Mapping);
+
+ if (NT_SUCCESS(Status))
{
- /* store the object in the file object */
- ASSERT(IoStack->FileObject->FsContext == NULL);
- IoStack->FileObject->FsContext = ObjectHeader;
- }
- else
- {
- /* the object header is for a audio filter */
- ASSERT(DeviceHeader->DeviceIndex < DeviceHeader->MaxItems);
- DeviceHeader->ItemList[DeviceHeader->DeviceIndex].ObjectHeader = ObjectHeader;
- IoStack->FileObject->FsContext = ObjectHeader;
+ /* free old descriptor */
+ ExFreePool(Descriptor);
+
+ /* mark create item as changed */
+ CreateItem->Flags |= KSCREATE_ITEM_SECURITYCHANGED;
}
/* store result */
- *Header = ObjectHeader;
-
-
- DPRINT("KsAllocateObjectHeader ObjectClass %S FileObject %p, ObjectHeader %p\n", ObjectClass, IoStack->FileObject, ObjectHeader);
-
- return STATUS_SUCCESS;
-
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI
-VOID
-NTAPI
-KsFreeObjectHeader(
- IN PVOID Header)
-{
-
-
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsCancelIo(
- IN OUT PLIST_ENTRY QueueHead,
- IN PKSPIN_LOCK SpinLock)
-{
- UNIMPLEMENTED;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsCancelRoutine(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- UNIMPLEMENTED;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsDefaultDeviceIoCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI BOOLEAN NTAPI
-KsDispatchFastIoDeviceControlFailure(
- IN PFILE_OBJECT FileObject,
- IN BOOLEAN Wait,
- IN PVOID InputBuffer OPTIONAL,
- IN ULONG InputBufferLength,
- OUT PVOID OutputBuffer OPTIONAL,
- IN ULONG OutputBufferLength,
- IN ULONG IoControlCode,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN PDEVICE_OBJECT DeviceObject) /* always return false */
-{
- return FALSE;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI BOOLEAN NTAPI
-KsDispatchFastReadFailure(
- IN PFILE_OBJECT FileObject,
- IN PLARGE_INTEGER FileOffset,
- IN ULONG Length,
- IN BOOLEAN Wait,
- IN ULONG LockKey,
- OUT PVOID Buffer,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN PDEVICE_OBJECT DeviceObject) /* always return false */
-{
- return FALSE;
-}
-
-/*
- Used in dispatch table entries that aren't handled and need to return
- STATUS_INVALID_DEVICE_REQUEST.
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsDispatchInvalidDeviceRequest(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
+ Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_INVALID_DEVICE_REQUEST;
+ return Status;
}
/*
@unimplemented
*/
-KSDDKAPI NTSTATUS NTAPI
-KsDispatchSpecificMethod(
- IN PIRP Irp,
- IN PFNKSHANDLER Handler)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsDispatchSpecificProperty(
IN PIRP Irp,
IN PFNKSHANDLER Handler)
@@ -500,113 +168,24 @@ KsDispatchSpecificProperty(
/*
@unimplemented
*/
-KSDDKAPI NTSTATUS NTAPI
-KsForwardAndCatchIrp(
- IN PDEVICE_OBJECT DeviceObject,
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsDispatchSpecificMethod(
IN PIRP Irp,
- IN PFILE_OBJECT FileObject,
- IN KSSTACK_USE StackUse)
+ IN PFNKSHANDLER Handler)
{
UNIMPLEMENTED;
return STATUS_UNSUCCESSFUL;
}
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsForwardIrp(
- IN PIRP Irp,
- IN PFILE_OBJECT FileObject,
- IN BOOLEAN ReuseStackLocation)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI NTSTATUS NTAPI
-KsGetChildCreateParameter(
- IN PIRP Irp,
- OUT PVOID* CreateParameter)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsMoveIrpsOnCancelableQueue(
- IN OUT PLIST_ENTRY SourceList,
- IN PKSPIN_LOCK SourceLock,
- IN OUT PLIST_ENTRY DestinationList,
- IN PKSPIN_LOCK DestinationLock OPTIONAL,
- IN KSLIST_ENTRY_LOCATION ListLocation,
- IN PFNKSIRPLISTCALLBACK ListCallback,
- IN PVOID Context)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsProbeStreamIrp(
- IN PIRP Irp,
- IN ULONG ProbeFlags,
- IN ULONG HeaderSize)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsQueryInformationFile(
- IN PFILE_OBJECT FileObject,
- OUT PVOID FileInformation,
- IN ULONG Length,
- IN FILE_INFORMATION_CLASS FileInformationClass)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI ACCESS_MASK NTAPI
-KsQueryObjectAccessMask(
- IN KSOBJECT_HEADER Header)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI
-KsQueryObjectCreateItem(
- IN KSOBJECT_HEADER Header)
-{
- UNIMPLEMENTED;
-/* return STATUS_UNSUCCESSFUL; */
- return NULL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsReadFile(
IN PFILE_OBJECT FileObject,
IN PKEVENT Event OPTIONAL,
@@ -617,513 +196,331 @@ KsReadFile(
IN ULONG Key OPTIONAL,
IN KPROCESSOR_MODE RequestorMode)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
+ PDEVICE_OBJECT DeviceObject;
+ PIRP Irp;
+ NTSTATUS Status;
+ BOOLEAN Result;
+ KEVENT LocalEvent;
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsReleaseIrpOnCancelableQueue(
- IN PIRP Irp,
- IN PDRIVER_CANCEL DriverCancel OPTIONAL)
-{
- UNIMPLEMENTED;
+ if (Event)
+ {
+ /* make sure event is reset */
+ KeClearEvent(Event);
+ }
+
+ if (RequestorMode == UserMode)
+ {
+ /* probe the user buffer */
+ _SEH2_TRY
+ {
+ ProbeForWrite(Buffer, Length, sizeof(UCHAR));
+ Status = STATUS_SUCCESS;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ /* Exception, get the error code */
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Invalid user buffer provided\n");
+ return Status;
+ }
+ }
+
+ /* get corresponding device object */
+ DeviceObject = IoGetRelatedDeviceObject(FileObject);
+
+ /* fast-io read is only available for kernel mode clients */
+ if (RequestorMode == KernelMode && ExGetPreviousMode() == KernelMode &&
+ DeviceObject->DriverObject->FastIoDispatch->FastIoRead)
+ {
+ /* call fast io write */
+ Result = DeviceObject->DriverObject->FastIoDispatch->FastIoRead(FileObject, &FileObject->CurrentByteOffset, Length, TRUE, Key, Buffer, IoStatusBlock, DeviceObject);
+
+ if (Result && NT_SUCCESS(IoStatusBlock->Status))
+ {
+ /* request was handeled and succeeded */
+ return STATUS_SUCCESS;
+ }
+ }
+
+ /* do the slow way */
+ if (!Event)
+ {
+ /* initialize temp event */
+ KeInitializeEvent(&LocalEvent, NotificationEvent, FALSE);
+ Event = &LocalEvent;
+ }
+
+ /* build the irp packet */
+ Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ, DeviceObject, Buffer, Length, &FileObject->CurrentByteOffset, Event, IoStatusBlock);
+ if (!Irp)
+ {
+ /* not enough resources */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* send the packet */
+ Status = IoCallDriver(DeviceObject, Irp);
+
+ if (Status == STATUS_PENDING)
+ {
+ /* operation is pending, is sync file object */
+ if (FileObject->Flags & FO_SYNCHRONOUS_IO)
+ {
+ /* it is so wait */
+ KeWaitForSingleObject(Event, Executive, RequestorMode, FALSE, NULL);
+ Status = IoStatusBlock->Status;
+ }
+ }
+ /* return result */
+ return Status;
}
/*
@implemented
*/
KSDDKAPI
-PIRP
+NTSTATUS
NTAPI
-KsRemoveIrpFromCancelableQueue(
- IN OUT PLIST_ENTRY QueueHead,
- IN PKSPIN_LOCK SpinLock,
- IN KSLIST_ENTRY_LOCATION ListLocation,
- IN KSIRP_REMOVAL_OPERATION RemovalOperation)
+KsWriteFile(
+ IN PFILE_OBJECT FileObject,
+ IN PKEVENT Event OPTIONAL,
+ IN PVOID PortContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PVOID Buffer,
+ IN ULONG Length,
+ IN ULONG Key OPTIONAL,
+ IN KPROCESSOR_MODE RequestorMode)
{
- PQUEUE_ENTRY Entry = NULL;
+ PDEVICE_OBJECT DeviceObject;
PIRP Irp;
- KIRQL OldIrql;
+ NTSTATUS Status;
+ BOOLEAN Result;
+ KEVENT LocalEvent;
- if (!QueueHead || !SpinLock)
- return NULL;
-
- if (ListLocation != KsListEntryTail && ListLocation != KsListEntryHead)
- return NULL;
-
- if (RemovalOperation != KsAcquireOnly && RemovalOperation != KsAcquireAndRemove)
- return NULL;
-
- KeAcquireSpinLock(SpinLock, &OldIrql);
-
- if (!IsListEmpty(QueueHead))
+ if (Event)
{
- if (RemovalOperation == KsAcquireOnly)
+ /* make sure event is reset */
+ KeClearEvent(Event);
+ }
+
+ if (RequestorMode == UserMode)
+ {
+ /* probe the user buffer */
+ _SEH2_TRY
{
- if (ListLocation == KsListEntryHead)
- Entry = (PQUEUE_ENTRY)QueueHead->Flink;
- else
- Entry = (PQUEUE_ENTRY)QueueHead->Blink;
+ ProbeForRead(Buffer, Length, sizeof(UCHAR));
+ Status = STATUS_SUCCESS;
}
- else if (RemovalOperation == KsAcquireAndRemove)
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- if (ListLocation == KsListEntryTail)
- Entry = (PQUEUE_ENTRY)RemoveTailList(QueueHead);
- else
- Entry = (PQUEUE_ENTRY)RemoveHeadList(QueueHead);
+ /* Exception, get the error code */
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Invalid user buffer provided\n");
+ return Status;
+ }
+ }
+
+ /* get corresponding device object */
+ DeviceObject = IoGetRelatedDeviceObject(FileObject);
+
+ /* fast-io write is only available for kernel mode clients */
+ if (RequestorMode == KernelMode && ExGetPreviousMode() == KernelMode &&
+ DeviceObject->DriverObject->FastIoDispatch->FastIoWrite)
+ {
+ /* call fast io write */
+ Result = DeviceObject->DriverObject->FastIoDispatch->FastIoWrite(FileObject, &FileObject->CurrentByteOffset, Length, TRUE, Key, Buffer, IoStatusBlock, DeviceObject);
+
+ if (Result && NT_SUCCESS(IoStatusBlock->Status))
+ {
+ /* request was handeled and succeeded */
+ return STATUS_SUCCESS;
}
}
- KeReleaseSpinLock(SpinLock, OldIrql);
- if (!Entry)
- return NULL;
+ /* do the slow way */
+ if (!Event)
+ {
+ /* initialize temp event */
+ KeInitializeEvent(&LocalEvent, NotificationEvent, FALSE);
+ Event = &LocalEvent;
+ }
- Irp = Entry->Irp;
+ /* build the irp packet */
+ Irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE, DeviceObject, Buffer, Length, &FileObject->CurrentByteOffset, Event, IoStatusBlock);
+ if (!Irp)
+ {
+ /* not enough resources */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
- if (RemovalOperation == KsAcquireAndRemove)
- ExFreePool(Entry);
+ /* send the packet */
+ Status = IoCallDriver(DeviceObject, Irp);
- return Irp;
+ if (Status == STATUS_PENDING)
+ {
+ /* operation is pending, is sync file object */
+ if (FileObject->Flags & FO_SYNCHRONOUS_IO)
+ {
+ /* it is so wait */
+ KeWaitForSingleObject(Event, Executive, RequestorMode, FALSE, NULL);
+ Status = IoStatusBlock->Status;
+ }
+ }
+ /* return result */
+ return Status;
}
/*
@unimplemented
*/
-KSDDKAPI VOID NTAPI
-KsRemoveSpecificIrpFromCancelableQueue(
- IN PIRP Irp)
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsQueryInformationFile(
+ IN PFILE_OBJECT FileObject,
+ OUT PVOID FileInformation,
+ IN ULONG Length,
+ IN FILE_INFORMATION_CLASS FileInformationClass)
{
- UNIMPLEMENTED;
+ PDEVICE_OBJECT DeviceObject;
+ PFAST_IO_DISPATCH FastIoDispatch;
+ IO_STATUS_BLOCK IoStatus;
+
+ /* get related file object */
+ DeviceObject = IoGetRelatedDeviceObject(FileObject);
+
+ /* get fast i/o table */
+ FastIoDispatch = DeviceObject->DriverObject->FastIoDispatch;
+
+ /* is there a fast table */
+ if (FastIoDispatch)
+ {
+ /* check the class */
+ if (FileInformationClass == FileBasicInformation)
+ {
+ /* use FastIoQueryBasicInfo routine */
+ if (FastIoDispatch->FastIoQueryBasicInfo)
+ {
+ return FastIoDispatch->FastIoQueryBasicInfo(FileObject, TRUE, (PFILE_BASIC_INFORMATION)FileInformation, &IoStatus, DeviceObject);
+ }
+ }
+ else if (FileInformationClass == FileStandardInformation)
+ {
+ /* use FastIoQueryBasicInfo routine */
+ if (FastIoDispatch->FastIoQueryBasicInfo)
+ {
+ return FastIoDispatch->FastIoQueryStandardInfo(FileObject, TRUE, (PFILE_STANDARD_INFORMATION)FileInformation, &IoStatus, DeviceObject);
+ }
+ }
+ }
+
+ /* Implement Me */
+
+ return STATUS_UNSUCCESSFUL;
}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsSetInformationFile(
IN PFILE_OBJECT FileObject,
IN PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-
-
-NTAPI
-NTSTATUS
-KsCreate(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
{
PIO_STACK_LOCATION IoStack;
- PDEVICE_EXTENSION DeviceExtension;
- PKSIDEVICE_HEADER DeviceHeader;
- ULONG Index;
- NTSTATUS Status = STATUS_SUCCESS;
- KIRQL OldLevel;
+ PDEVICE_OBJECT DeviceObject;
+ PIRP Irp;
+ PVOID Buffer;
+ KEVENT Event;
+ LARGE_INTEGER Offset;
+ IO_STATUS_BLOCK IoStatus;
+ NTSTATUS Status;
- DPRINT("KS / CREATE\n");
- /* get current stack location */
- IoStack = IoGetCurrentIrpStackLocation(Irp);
- /* get device extension */
- DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
- /* get device header */
- DeviceHeader = DeviceExtension->DeviceHeader;
+ /* get related device object */
+ DeviceObject = IoGetRelatedDeviceObject(FileObject);
- /* acquire list lock */
- KeAcquireSpinLock(&DeviceHeader->ItemListLock, &OldLevel);
- /* loop all device items */
- for(Index = 0; Index < DeviceHeader->MaxItems; Index++)
+ /* copy file information */
+ Buffer = AllocateItem(NonPagedPool, Length);
+ if (!Buffer)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ _SEH2_TRY
{
- if (DeviceHeader->ItemList[Index].bCreated && DeviceHeader->ItemList[Index].ObjectHeader == NULL)
- {
- DeviceHeader->DeviceIndex = Index;
- /* set object create item */
- KSCREATE_ITEM_IRP_STORAGE(Irp) = &DeviceHeader->ItemList[Index].CreateItem;
- Status = DeviceHeader->ItemList[Index].CreateItem.Create(DeviceObject, Irp);
-
- /* FIXME IoRegisterDeviceInterface does not support reference strings */
- /* FIXME Check the irp target with the create item's object class */
- if (NT_SUCCESS(Status))
- {
- /* release lock */
- KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel);
- return Status;
- }
- }
- else if (DeviceHeader->ItemList[Index].bCreated && IoStack->FileObject->FileName.Buffer != NULL)
- {
- ULONG Length;
-
- ASSERT(DeviceHeader->ItemList[Index].ObjectHeader);
- ASSERT(DeviceHeader->ItemList[Index].ObjectHeader->CreateItem);
- ASSERT(DeviceHeader->ItemList[Index].ObjectHeader->CreateItem->ObjectClass.Buffer);
-
- Length = wcslen(DeviceHeader->ItemList[Index].ObjectHeader->CreateItem->ObjectClass.Buffer);
-
- /* filter for that type has already exists */
- if (!_wcsnicmp(DeviceHeader->ItemList[Index].ObjectHeader->CreateItem->ObjectClass.Buffer,
- IoStack->FileObject->FileName.Buffer,
- Length))
- {
- if (IoStack->FileObject->FileName.Buffer[0] != L'{')
- {
- RtlMoveMemory(IoStack->FileObject->FileName.Buffer, &IoStack->FileObject->FileName.Buffer[Length+1],
- IoStack->FileObject->FileName.Length - Length * sizeof(WCHAR));
-
- IoStack->FileObject->FileName.Length -= Length * sizeof(WCHAR);
- }
-
-
- KSCREATE_ITEM_IRP_STORAGE(Irp) = &DeviceHeader->ItemList[Index].CreateItem;
- Status = DeviceHeader->ItemList[Index].CreateItem.Create(DeviceObject, Irp);
- KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel);
- return Status;
- }
- }
+ ProbeForRead(Buffer, Length, sizeof(UCHAR));
+ RtlMoveMemory(Buffer, FileInformation, Length);
+ Status = STATUS_SUCCESS;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ /* Exception, get the error code */
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+ if (!NT_SUCCESS(Status))
+ {
+ /* invalid user buffer */
+ FreeItem(Buffer);
+ return Status;
}
- /* release lock */
- KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel);
+ /* initialize the event */
+ KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
- Irp->IoStatus.Information = 0;
- /* set return status */
- Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_UNSUCCESSFUL;
+ /* zero offset */
+ Offset.QuadPart = 0LL;
+
+ /* build the irp */
+ Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SET_INFORMATION, DeviceObject, NULL, 0, &Offset, &Event, &IoStatus);
+
+ if (!Irp)
+ {
+ /* failed to allocate irp */
+ FreeItem(Buffer);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* get next stack location */
+ IoStack = IoGetNextIrpStackLocation(Irp);
+
+ /* set irp parameters */
+ IoStack->Parameters.SetFile.FileInformationClass = FileInformationClass;
+ IoStack->Parameters.SetFile.Length = Length;
+ IoStack->Parameters.SetFile.FileObject = FileObject;
+ Irp->AssociatedIrp.SystemBuffer = Buffer;
+ Irp->UserBuffer = FileInformation;
+
+ /* dispatch the irp */
+ Status = IoCallDriver(DeviceObject, Irp);
+
+ if (Status == STATUS_PENDING)
+ {
+ /* wait untill the operation has completed */
+ KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+ /* is a sync file object */
+ if (FileObject->Flags & FO_SYNCHRONOUS_IO)
+ Status = FileObject->FinalStatus;
+ else
+ Status = IoStatus.Status;
+ }
+ /* done */
+ return Status;
}
-static NTAPI
-NTSTATUS
-KsClose(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PIO_STACK_LOCATION IoStack;
- PKSIOBJECT_HEADER ObjectHeader;
- PDEVICE_EXTENSION DeviceExtension;
- PKSIDEVICE_HEADER DeviceHeader;
- ULONG Index;
-
- /* get current stack location */
- IoStack = IoGetCurrentIrpStackLocation(Irp);
- /* get device extension */
- DeviceExtension = (PDEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension;
- /* get device header */
- DeviceHeader = DeviceExtension->DeviceHeader;
-
-
- DPRINT("KS / CLOSE\n");
-
- if (IoStack->FileObject && IoStack->FileObject->FsContext)
- {
- ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
-
- KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem;
-
- for(Index = 0; Index < DeviceHeader->MaxItems; Index++)
- {
- if (DeviceHeader->ItemList[Index].ObjectHeader == ObjectHeader)
- {
- DeviceHeader->ItemList[Index].ObjectHeader = NULL;
- }
- }
- return ObjectHeader->DispatchTable.Close(DeviceObject, Irp);
- }
- else
- {
- DPRINT1("Expected Object Header FileObject %p FsContext %p\n", IoStack->FileObject, IoStack->FileObject->FsContext);
- KeBugCheckEx(0, 0, 0, 0, 0);
- return STATUS_SUCCESS;
- }
-}
-
-static NTAPI
-NTSTATUS
-KsDeviceControl(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PIO_STACK_LOCATION IoStack;
- PKSIOBJECT_HEADER ObjectHeader;
-
- /* get current stack location */
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- DPRINT("KS / DeviceControl\n");
- if (IoStack->FileObject && IoStack->FileObject->FsContext)
- {
- ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
-
- KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem;
-
- if (IoStack->MajorFunction == IRP_MJ_DEVICE_CONTROL && IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_OBJECT_CLASS)
- {
- *((LPWSTR*)Irp->UserBuffer) = ObjectHeader->CreateItem->ObjectClass.Buffer;
- Irp->IoStatus.Status = STATUS_SUCCESS;
- Irp->IoStatus.Information = sizeof(LPWSTR);
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_SUCCESS;
- }
- return ObjectHeader->DispatchTable.DeviceIoControl(DeviceObject, Irp);
- }
- else
- {
- DPRINT1("Expected Object Header\n");
- KeBugCheckEx(0, 0, 0, 0, 0);
- return STATUS_SUCCESS;
- }
-}
-
-static NTAPI
-NTSTATUS
-KsRead(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PIO_STACK_LOCATION IoStack;
- PKSIOBJECT_HEADER ObjectHeader;
-
- /* get current stack location */
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- DPRINT("KS / Read\n");
- if (IoStack->FileObject && IoStack->FileObject->FsContext)
- {
- ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
-
- KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem;
- return ObjectHeader->DispatchTable.Read(DeviceObject, Irp);
- }
- else
- {
- DPRINT1("Expected Object Header\n");
- KeBugCheckEx(0, 0, 0, 0, 0);
- return STATUS_SUCCESS;
- }
-}
-
-static NTAPI
-NTSTATUS
-KsWrite(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PIO_STACK_LOCATION IoStack;
- PKSIOBJECT_HEADER ObjectHeader;
-
- /* get current stack location */
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- DPRINT("KS / Write\n");
- if (IoStack->FileObject && IoStack->FileObject->FsContext)
- {
- ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
-
- KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem;
- return ObjectHeader->DispatchTable.Write(DeviceObject, Irp);
- }
- else
- {
- DPRINT1("Expected Object Header %p\n", IoStack->FileObject);
- KeBugCheckEx(0, 0, 0, 0, 0);
- return STATUS_SUCCESS;
- }
-}
-
-static NTAPI
-NTSTATUS
-KsFlushBuffers(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PIO_STACK_LOCATION IoStack;
- PKSIOBJECT_HEADER ObjectHeader;
-
- /* get current stack location */
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- DPRINT("KS / FlushBuffers\n");
- if (IoStack->FileObject && IoStack->FileObject->FsContext)
- {
- ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
-
- KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem;
- return ObjectHeader->DispatchTable.Flush(DeviceObject, Irp);
- }
- else
- {
- DPRINT1("Expected Object Header\n");
- KeBugCheckEx(0, 0, 0, 0, 0);
- return STATUS_SUCCESS;
- }
-}
-
-static NTAPI
-NTSTATUS
-KsQuerySecurity(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PIO_STACK_LOCATION IoStack;
- PKSIOBJECT_HEADER ObjectHeader;
-
- /* get current stack location */
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- DPRINT("KS / QuerySecurity\n");
- if (IoStack->FileObject && IoStack->FileObject->FsContext)
- {
- ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
-
- KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem;
- return ObjectHeader->DispatchTable.QuerySecurity(DeviceObject, Irp);
- }
- else
- {
- DPRINT1("Expected Object Header\n");
- KeBugCheckEx(0, 0, 0, 0, 0);
- return STATUS_SUCCESS;
- }
-}
-
-static NTAPI
-NTSTATUS
-KsSetSecurity(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PIO_STACK_LOCATION IoStack;
- PKSIOBJECT_HEADER ObjectHeader;
-
- /* get current stack location */
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- DPRINT("KS / SetSecurity\n");
- if (IoStack->FileObject && IoStack->FileObject->FsContext)
- {
- ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
-
- KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem;
- return ObjectHeader->DispatchTable.SetSecurity(DeviceObject, Irp);
- }
- else
- {
- DPRINT1("Expected Object Header\n");
- KeBugCheckEx(0, 0, 0, 0, 0);
- return STATUS_SUCCESS;
- }
-}
-
-/*
- @implemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsSetMajorFunctionHandler(
- IN PDRIVER_OBJECT DriverObject,
- IN ULONG MajorFunction)
-{
- /*
- Sets a DriverObject's major function handler to point to an internal
- function we implement.
-
- TODO: Deal with KSDISPATCH_FASTIO
- */
-
- switch ( MajorFunction )
- {
- case IRP_MJ_CREATE:
- DriverObject->MajorFunction[MajorFunction] = KsCreate;
- break;
- case IRP_MJ_CLOSE:
- DriverObject->MajorFunction[MajorFunction] = KsClose;
- break;
- case IRP_MJ_DEVICE_CONTROL:
- DriverObject->MajorFunction[MajorFunction] = KsDeviceControl;
- break;
- case IRP_MJ_READ:
- DriverObject->MajorFunction[MajorFunction] = KsRead;
- break;
- case IRP_MJ_WRITE:
- DriverObject->MajorFunction[MajorFunction] = KsWrite;
- break;
- case IRP_MJ_FLUSH_BUFFERS :
- DriverObject->MajorFunction[MajorFunction] = KsFlushBuffers;
- break;
- case IRP_MJ_QUERY_SECURITY:
- DriverObject->MajorFunction[MajorFunction] = KsQuerySecurity;
- break;
- case IRP_MJ_SET_SECURITY:
- DriverObject->MajorFunction[MajorFunction] = KsSetSecurity;
- break;
-
- default:
- return STATUS_INVALID_PARAMETER; /* is this right? */
- };
-
- return STATUS_SUCCESS;
-}
-
-/*
- @implemented
-*/
-KSDDKAPI
-NTSTATUS
-NTAPI
-KsDispatchIrp(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PIO_STACK_LOCATION IoStack;
-
- /* Calls a dispatch routine corresponding to the function code of the IRP */
- /*
- First we need to get the dispatch table. An opaque header is pointed to by
- FsContext. The first element points to this table. This table is the key
- to dispatching the IRP correctly.
- */
-
- IoStack = IoGetCurrentIrpStackLocation(Irp);
- DPRINT("KsDispatchIrp %x\n", IoStack->MajorFunction);
-
- switch (IoStack->MajorFunction)
- {
- case IRP_MJ_CREATE:
- return KsCreate(DeviceObject, Irp);
- case IRP_MJ_CLOSE:
- return KsClose(DeviceObject, Irp);
- break;
- case IRP_MJ_DEVICE_CONTROL:
- return KsDeviceControl(DeviceObject, Irp);
- break;
- case IRP_MJ_READ:
- return KsRead(DeviceObject, Irp);
- break;
- case IRP_MJ_WRITE:
- return KsWrite(DeviceObject, Irp);
- break;
- case IRP_MJ_FLUSH_BUFFERS:
- return KsFlushBuffers(DeviceObject, Irp);
- break;
- case IRP_MJ_QUERY_SECURITY:
- return KsQuerySecurity(DeviceObject, Irp);
- break;
- case IRP_MJ_SET_SECURITY:
- return KsSetSecurity(DeviceObject, Irp);
- break;
- default:
- return STATUS_INVALID_PARAMETER; /* is this right? */
- };
-}
-
-
/*
@implemented
*/
@@ -1217,19 +614,17 @@ KsStreamIo(
return Status;
}
+
/*
@unimplemented
*/
-KSDDKAPI NTSTATUS NTAPI
-KsWriteFile(
- IN PFILE_OBJECT FileObject,
- IN PKEVENT Event OPTIONAL,
- IN PVOID PortContext OPTIONAL,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- IN PVOID Buffer,
- IN ULONG Length,
- IN ULONG Key OPTIONAL,
- IN KPROCESSOR_MODE RequestorMode)
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsProbeStreamIrp(
+ IN PIRP Irp,
+ IN ULONG ProbeFlags,
+ IN ULONG HeaderSize)
{
UNIMPLEMENTED;
return STATUS_UNSUCCESSFUL;
@@ -1238,15 +633,1041 @@ KsWriteFile(
/*
@unimplemented
*/
-KSDDKAPI NTSTATUS NTAPI
-KsDefaultForwardIrp(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsAllocateExtraData(
+ IN PIRP Irp,
+ IN ULONG ExtraSize,
+ OUT PVOID* ExtraBuffer)
{
UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsNullDriverUnload(
+ IN PDRIVER_OBJECT DriverObject)
+{
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsDispatchInvalidDeviceRequest(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return STATUS_INVALID_DEVICE_REQUEST;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsDefaultDeviceIoCompletion(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ NTSTATUS Status;
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY &&
+ IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_METHOD &&
+ IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY)
+ {
+ if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_RESET_STATE)
+ {
+ /* fake success */
+ Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ /* request unsupported */
+ Status = STATUS_INVALID_DEVICE_REQUEST;
+ }
+ }
+ else
+ {
+ /* property / method / event not found */
+ Status = STATUS_PROPSET_NOT_FOUND;
+ }
+
+ /* complete request */
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+
+ return Status;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+BOOLEAN
+NTAPI
+KsDispatchFastIoDeviceControlFailure(
+ IN PFILE_OBJECT FileObject,
+ IN BOOLEAN Wait,
+ IN PVOID InputBuffer OPTIONAL,
+ IN ULONG InputBufferLength,
+ OUT PVOID OutputBuffer OPTIONAL,
+ IN ULONG OutputBufferLength,
+ IN ULONG IoControlCode,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN PDEVICE_OBJECT DeviceObject)
+{
+ return FALSE;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+BOOLEAN
+NTAPI
+KsDispatchFastReadFailure(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN BOOLEAN Wait,
+ IN ULONG LockKey,
+ OUT PVOID Buffer,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN PDEVICE_OBJECT DeviceObject)
+{
+ return FALSE;
+}
+
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsCancelIo(
+ IN OUT PLIST_ENTRY QueueHead,
+ IN PKSPIN_LOCK SpinLock)
+{
+ PDRIVER_CANCEL OldDriverCancel;
+ PIO_STACK_LOCATION IoStack;
+ PLIST_ENTRY Entry;
+ PIRP Irp;
+ KIRQL OldLevel;
+
+ /* acquire spinlock */
+ KeAcquireSpinLock(SpinLock, &OldLevel);
+ /* point to first entry */
+ Entry = QueueHead->Flink;
+ /* loop all items */
+ while(Entry != QueueHead)
+ {
+ /* get irp offset */
+ Irp = (PIRP)CONTAINING_RECORD(Entry, IRP, Tail.Overlay.ListEntry);
+
+ /* set cancelled bit */
+ Irp->Cancel = TRUE;
+
+ /* now set the cancel routine */
+ OldDriverCancel = IoSetCancelRoutine(Irp, NULL);
+ if (OldDriverCancel)
+ {
+ /* this irp hasnt been yet used, so free to cancel */
+ KeReleaseSpinLock(SpinLock, OldLevel);
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* acquire cancel spinlock */
+ IoAcquireCancelSpinLock(&Irp->CancelIrql);
+
+ /* call provided cancel routine */
+ OldDriverCancel(IoStack->DeviceObject, Irp);
+
+ /* re-acquire spinlock */
+ KeAcquireSpinLock(SpinLock, &OldLevel);
+ }
+ /* move on to next entry */
+ Entry = Entry->Flink;
+ }
+
+ /* the irp has already been canceled */
+ KeReleaseSpinLock(SpinLock, OldLevel);
+
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsReleaseIrpOnCancelableQueue(
+ IN PIRP Irp,
+ IN PDRIVER_CANCEL DriverCancel OPTIONAL)
+{
+ PKSPIN_LOCK SpinLock;
+ PDRIVER_CANCEL OldDriverCancel;
+ PIO_STACK_LOCATION IoStack;
+ KIRQL OldLevel;
+
+ /* check for required parameters */
+ if (!Irp)
+ return;
+
+ if (!DriverCancel)
+ {
+ /* default to KsCancelRoutine */
+ DriverCancel = KsCancelRoutine;
+ }
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* get internal queue lock */
+ SpinLock = KSQUEUE_SPINLOCK_IRP_STORAGE(Irp);
+
+ /* acquire spinlock */
+ KeAcquireSpinLock(SpinLock, &OldLevel);
+
+ /* now set the cancel routine */
+ OldDriverCancel = IoSetCancelRoutine(Irp, DriverCancel);
+
+ if (Irp->Cancel && OldDriverCancel == NULL)
+ {
+ /* the irp has already been canceled */
+ KeReleaseSpinLock(SpinLock, OldLevel);
+
+ /* cancel routine requires that cancel spinlock is held */
+ IoAcquireCancelSpinLock(&Irp->CancelIrql);
+
+ /* cancel irp */
+ DriverCancel(IoStack->DeviceObject, Irp);
+ }
+ else
+ {
+ /* done */
+ KeReleaseSpinLock(SpinLock, OldLevel);
+ }
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+PIRP
+NTAPI
+KsRemoveIrpFromCancelableQueue(
+ IN OUT PLIST_ENTRY QueueHead,
+ IN PKSPIN_LOCK SpinLock,
+ IN KSLIST_ENTRY_LOCATION ListLocation,
+ IN KSIRP_REMOVAL_OPERATION RemovalOperation)
+{
+ PIRP Irp;
+ PLIST_ENTRY CurEntry;
+ KIRQL OldIrql;
+
+ /* check parameters */
+ if (!QueueHead || !SpinLock)
+ return NULL;
+
+ /* check if parameter ListLocation is valid */
+ if (ListLocation != KsListEntryTail && ListLocation != KsListEntryHead)
+ return NULL;
+
+ /* acquire list lock */
+ KeAcquireSpinLock(SpinLock, &OldIrql);
+
+ /* point to queue head */
+ CurEntry = QueueHead;
+
+ do
+ {
+ /* reset irp to null */
+ Irp = NULL;
+
+ /* iterate to next entry */
+ if (ListLocation == KsListEntryHead)
+ CurEntry = CurEntry->Flink;
+ else
+ CurEntry = CurEntry->Blink;
+
+ /* is the end of list reached */
+ if (CurEntry == QueueHead)
+ {
+ /* reached end of list */
+ break;
+ }
+
+ /* get irp offset */
+ Irp = (PIRP)CONTAINING_RECORD(Irp, IRP, Tail.Overlay.ListEntry);
+
+ if (Irp->Cancel)
+ {
+ /* irp has been canceled */
+ break;
+ }
+
+ if (Irp->CancelRoutine)
+ {
+ /* remove cancel routine */
+ Irp->CancelRoutine = NULL;
+
+ if (RemovalOperation == KsAcquireAndRemove || RemovalOperation == KsAcquireAndRemoveOnlySingleItem)
+ {
+ /* remove irp from list */
+ RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+ }
+
+ if (RemovalOperation == KsAcquireAndRemoveOnlySingleItem || RemovalOperation == KsAcquireOnlySingleItem)
+ break;
+ }
+
+ }while(TRUE);
+
+ /* release lock */
+ KeReleaseSpinLock(SpinLock, OldIrql);
+
+ if (!Irp || Irp->CancelRoutine == NULL)
+ {
+ /* either an irp has been acquired or nothing found */
+ return Irp;
+ }
+
+ /* time to remove the canceled irp */
+ IoAcquireCancelSpinLock(&OldIrql);
+ /* acquire list lock */
+ KeAcquireSpinLockAtDpcLevel(SpinLock);
+
+ if (RemovalOperation == KsAcquireAndRemove || RemovalOperation == KsAcquireAndRemoveOnlySingleItem)
+ {
+ /* remove it */
+ RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+ }
+
+ /* release list lock */
+ KeReleaseSpinLockFromDpcLevel(SpinLock);
+
+ /* release cancel spinlock */
+ IoReleaseCancelSpinLock(OldIrql);
+ /* no non canceled irp has been found */
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsMoveIrpsOnCancelableQueue(
+ IN OUT PLIST_ENTRY SourceList,
+ IN PKSPIN_LOCK SourceLock,
+ IN OUT PLIST_ENTRY DestinationList,
+ IN PKSPIN_LOCK DestinationLock OPTIONAL,
+ IN KSLIST_ENTRY_LOCATION ListLocation,
+ IN PFNKSIRPLISTCALLBACK ListCallback,
+ IN PVOID Context)
+{
+ UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsRemoveSpecificIrpFromCancelableQueue(
+ IN PIRP Irp)
+{
+ PKSPIN_LOCK SpinLock;
+ KIRQL OldLevel;
+
+ /* get internal queue lock */
+ SpinLock = KSQUEUE_SPINLOCK_IRP_STORAGE(Irp);
+
+ /* acquire spinlock */
+ KeAcquireSpinLock(SpinLock, &OldLevel);
+
+ /* remove the irp from the list */
+ RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+
+ /* release spinlock */
+ KeReleaseSpinLock(SpinLock, OldLevel);
+}
+
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsAddIrpToCancelableQueue(
+ IN OUT PLIST_ENTRY QueueHead,
+ IN PKSPIN_LOCK SpinLock,
+ IN PIRP Irp,
+ IN KSLIST_ENTRY_LOCATION ListLocation,
+ IN PDRIVER_CANCEL DriverCancel OPTIONAL)
+{
+ PDRIVER_CANCEL OldDriverCancel;
+ PIO_STACK_LOCATION IoStack;
+ KIRQL OldLevel;
+
+ /* check for required parameters */
+ if (!QueueHead || !SpinLock || !Irp)
+ return;
+
+ if (!DriverCancel)
+ {
+ /* default to KsCancelRoutine */
+ DriverCancel = KsCancelRoutine;
+ }
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* acquire spinlock */
+ KeAcquireSpinLock(SpinLock, &OldLevel);
+
+ if (ListLocation == KsListEntryTail)
+ {
+ /* insert irp to tail of list */
+ InsertTailList(QueueHead, &Irp->Tail.Overlay.ListEntry);
+ }
+ else
+ {
+ /* insert irp to head of list */
+ InsertHeadList(QueueHead, &Irp->Tail.Overlay.ListEntry);
+ }
+
+ /* store internal queue lock */
+ KSQUEUE_SPINLOCK_IRP_STORAGE(Irp) = SpinLock;
+
+ /* now set the cancel routine */
+ OldDriverCancel = IoSetCancelRoutine(Irp, DriverCancel);
+
+ if (Irp->Cancel && OldDriverCancel == NULL)
+ {
+ /* the irp has already been canceled */
+ KeReleaseSpinLock(SpinLock, OldLevel);
+
+ /* cancel routine requires that cancel spinlock is held */
+ IoAcquireCancelSpinLock(&Irp->CancelIrql);
+
+ /* cancel irp */
+ DriverCancel(IoStack->DeviceObject, Irp);
+ }
+ else
+ {
+ /* done */
+ KeReleaseSpinLock(SpinLock, OldLevel);
+ }
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsCancelRoutine(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PKSPIN_LOCK SpinLock;
+ KIRQL OldLevel;
+
+ /* get internal queue lock */
+ SpinLock = KSQUEUE_SPINLOCK_IRP_STORAGE(Irp);
+
+ /* acquire spinlock */
+ KeAcquireSpinLock(SpinLock, &OldLevel);
+
+ /* sanity check */
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+
+ /* release cancel spinlock */
+ IoReleaseCancelSpinLock(DISPATCH_LEVEL);
+
+ /* remove the irp from the list */
+ RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+
+ /* release spinlock */
+ KeReleaseSpinLock(SpinLock, OldLevel);
+
+ /* has the irp already been canceled */
+ if (Irp->IoStatus.Status != STATUS_CANCELLED)
+ {
+ /* let's complete it */
+ Irp->IoStatus.Status = STATUS_CANCELLED;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsGetChildCreateParameter(
+ IN PIRP Irp,
+ OUT PVOID* CreateParameter)
+{
+ UNIMPLEMENTED;
+ return STATUS_UNSUCCESSFUL;
+}
+
+NTSTATUS
+FindMatchingCreateItem(
+ PLIST_ENTRY ListHead,
+ ULONG BufferSize,
+ LPWSTR Buffer,
+ OUT PCREATE_ITEM_ENTRY *OutCreateItem)
+{
+ PLIST_ENTRY Entry;
+ PCREATE_ITEM_ENTRY CreateItemEntry;
+
+ /* remove '\' slash */
+ Buffer++;
+ BufferSize -= sizeof(WCHAR);
+
+ /* point to first entry */
+ Entry = ListHead->Flink;
+
+ /* loop all device items */
+ while(Entry != ListHead)
+ {
+ /* get create item entry */
+ CreateItemEntry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(Entry, CREATE_ITEM_ENTRY, Entry);
+
+ ASSERT(CreateItemEntry->CreateItem);
+
+ if(CreateItemEntry->CreateItem->Flags & KSCREATE_ITEM_WILDCARD)
+ {
+ /* create item is default */
+ *OutCreateItem = CreateItemEntry;
+ return STATUS_SUCCESS;
+ }
+
+ if (!CreateItemEntry->CreateItem->Create)
+ {
+ /* skip free create item */
+ Entry = Entry->Flink;
+ continue;
+ }
+
+ ASSERT(CreateItemEntry->CreateItem->ObjectClass.Buffer);
+
+ DPRINT1("CreateItem %S Length %u Request %S %u\n", CreateItemEntry->CreateItem->ObjectClass.Buffer,
+ CreateItemEntry->CreateItem->ObjectClass.Length,
+ Buffer,
+ BufferSize);
+
+ if (CreateItemEntry->CreateItem->ObjectClass.Length > BufferSize)
+ {
+ /* create item doesnt match in length */
+ Entry = Entry->Flink;
+ continue;
+ }
+
+ /* now check if the object class is the same */
+ if (RtlCompareMemory(CreateItemEntry->CreateItem->ObjectClass.Buffer, Buffer, CreateItemEntry->CreateItem->ObjectClass.Length) == CreateItemEntry->CreateItem->ObjectClass.Length)
+ {
+ /* found matching create item */
+ *OutCreateItem = CreateItemEntry;
+ return STATUS_SUCCESS;
+ }
+ /* iterate to next */
+ Entry = Entry->Flink;
+ }
+
+ return STATUS_NOT_FOUND;
+}
+
+NTSTATUS
+NTAPI
+KspCreate(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PCREATE_ITEM_ENTRY CreateItemEntry;
+ PIO_STACK_LOCATION IoStack;
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PKSIOBJECT_HEADER ObjectHeader;
+ NTSTATUS Status;
+
+ DPRINT("KS / CREATE\n");
+ /* get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ /* get device header */
+ DeviceHeader = DeviceExtension->DeviceHeader;
+
+ if (IoStack->FileObject->FileName.Buffer == NULL && DeviceHeader->ItemListCount == 1)
+ {
+ /* hack for bug 4566 */
+ ASSERT(!IsListEmpty(&DeviceHeader->ItemList));
+ /* get create item entry */
+ CreateItemEntry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(DeviceHeader->ItemList.Flink, CREATE_ITEM_ENTRY, Entry);
+
+ ASSERT(CreateItemEntry->CreateItem);
+
+ if (!CreateItemEntry->CreateItem->Create)
+ {
+ /* no valid create item */
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ /* return status */
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* set object create item */
+ KSCREATE_ITEM_IRP_STORAGE(Irp) = CreateItemEntry->CreateItem;
+
+ /* call create function */
+ Status = CreateItemEntry->CreateItem->Create(DeviceObject, Irp);
+
+ if (NT_SUCCESS(Status))
+ {
+ /* increment create item reference count */
+ InterlockedIncrement(&CreateItemEntry->ReferenceCount);
+ }
+ /* return result */
+ return Status;
+ }
+
+
+ /* hack for bug 4566 */
+ if (IoStack->FileObject->FileName.Buffer == NULL)
+ {
+ DPRINT("Using reference string hack\n");
+ Irp->IoStatus.Information = 0;
+ /* set return status */
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+ }
+
+
+ if (IoStack->FileObject->RelatedFileObject != NULL)
+ {
+ /* request is to instantiate a pin / node / clock / allocator */
+ ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->RelatedFileObject->FsContext;
+
+ /* sanity check */
+ ASSERT(ObjectHeader);
+
+ /* find a matching a create item */
+ Status = FindMatchingCreateItem(&ObjectHeader->ItemList, IoStack->FileObject->FileName.Length, IoStack->FileObject->FileName.Buffer, &CreateItemEntry);
+ }
+ else
+ {
+ /* request to create a filter */
+ Status = FindMatchingCreateItem(&DeviceHeader->ItemList, IoStack->FileObject->FileName.Length, IoStack->FileObject->FileName.Buffer, &CreateItemEntry);
+ }
+
+ if (NT_SUCCESS(Status))
+ {
+ /* set object create item */
+ KSCREATE_ITEM_IRP_STORAGE(Irp) = CreateItemEntry->CreateItem;
+
+ /* call create function */
+ Status = CreateItemEntry->CreateItem->Create(DeviceObject, Irp);
+
+ if (NT_SUCCESS(Status))
+ {
+ /* increment create item reference count */
+ InterlockedIncrement(&CreateItemEntry->ReferenceCount);
+ }
+ return Status;
+ }
+
+
Irp->IoStatus.Information = 0;
+ /* set return status */
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_UNSUCCESSFUL;
}
+NTSTATUS
+RosDeviceInterfaceReferenceStringHack(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PDEVICE_EXTENSION DeviceExtension;
+ PCREATE_ITEM_ENTRY CreateItemEntry;
+ PLIST_ENTRY Entry;
+ LPWSTR Buffer;
+ ULONG Length;
+
+ /* get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension;
+ /* get device header */
+ DeviceHeader = DeviceExtension->DeviceHeader;
+
+ /* retrieve all available reference strings registered */
+ Length = 0;
+ Entry = DeviceHeader->ItemList.Flink;
+ while(Entry != &DeviceHeader->ItemList)
+ {
+ CreateItemEntry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(Entry, CREATE_ITEM_ENTRY, Entry);
+
+ ASSERT(CreateItemEntry->CreateItem);
+ if (CreateItemEntry->CreateItem->Create && CreateItemEntry->CreateItem->ObjectClass.Buffer)
+ Length += wcslen(CreateItemEntry->CreateItem->ObjectClass.Buffer) + 1;
+
+ Entry = Entry->Flink;
+ }
+
+ /* add extra zero */
+ Length += 1;
+
+ /* allocate the buffer */
+ Buffer = ExAllocatePool(NonPagedPool, Length * sizeof(WCHAR));
+ if (!Buffer)
+ {
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+
+ *((LPWSTR*)Irp->UserBuffer) = Buffer;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = sizeof(LPWSTR);
+
+ Entry = DeviceHeader->ItemList.Flink;
+ while(Entry != &DeviceHeader->ItemList)
+ {
+ CreateItemEntry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(Entry, CREATE_ITEM_ENTRY, Entry);
+
+ ASSERT(CreateItemEntry->CreateItem);
+ if (CreateItemEntry->CreateItem->Create && CreateItemEntry->CreateItem->ObjectClass.Buffer)
+ {
+ wcscpy(Buffer, CreateItemEntry->CreateItem->ObjectClass.Buffer);
+ Buffer += wcslen(Buffer) + 1;
+ }
+ Entry = Entry->Flink;
+ }
+
+
+
+ *Buffer = L'\0';
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+
+}
+
+NTSTATUS
+NTAPI
+KspDeviceControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ PKSIOBJECT_HEADER ObjectHeader;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PDEVICE_EXTENSION DeviceExtension;
+
+
+
+ /* get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension;
+ /* get device header */
+ DeviceHeader = DeviceExtension->DeviceHeader;
+
+ if (IoStack->MajorFunction == IRP_MJ_DEVICE_CONTROL && IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_OBJECT_CLASS)
+ {
+ /* hack for bug 4566 */
+ return RosDeviceInterfaceReferenceStringHack(DeviceObject, Irp);
+ }
+
+ ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
+
+ ASSERT(ObjectHeader);
+ //KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem;
+
+ return ObjectHeader->DispatchTable.DeviceIoControl(DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+KspDispatchIrp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIOBJECT_HEADER ObjectHeader;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PDRIVER_DISPATCH Dispatch;
+ NTSTATUS Status;
+
+ /* get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ /* get device header */
+ DeviceHeader = DeviceExtension->DeviceHeader;
+
+ /* get object header */
+ ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
+
+ if (!ObjectHeader)
+ {
+ /* hack for bug 4566 */
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
+ /* complete and forget */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+ }
+
+ /* sanity check */
+ ASSERT(ObjectHeader);
+ /* store create item */
+ //KSCREATE_ITEM_IRP_STORAGE(Irp) = (PKSOBJECT_CREATE_ITEM)0x12345678; //ObjectHeader->CreateItem;
+
+ /* retrieve matching dispatch function */
+ switch(IoStack->MajorFunction)
+ {
+ case IRP_MJ_CLOSE:
+ Dispatch = ObjectHeader->DispatchTable.Close;
+ break;
+ case IRP_MJ_DEVICE_CONTROL:
+ Dispatch = ObjectHeader->DispatchTable.DeviceIoControl;
+ break;
+ case IRP_MJ_READ:
+ Dispatch = ObjectHeader->DispatchTable.Read;
+ break;
+ case IRP_MJ_WRITE:
+ Dispatch = ObjectHeader->DispatchTable.Write;
+ break;
+ case IRP_MJ_FLUSH_BUFFERS :
+ Dispatch = ObjectHeader->DispatchTable.Flush;
+ break;
+ case IRP_MJ_QUERY_SECURITY:
+ Dispatch = ObjectHeader->DispatchTable.QuerySecurity;
+ break;
+ case IRP_MJ_SET_SECURITY:
+ Dispatch = ObjectHeader->DispatchTable.SetSecurity;
+ break;
+ case IRP_MJ_PNP:
+ Dispatch = KsDefaultDispatchPnp;
+ default:
+ Dispatch = NULL;
+ }
+
+ /* is the request supported */
+ if (Dispatch)
+ {
+ /* now call the dispatch function */
+ Status = Dispatch(DeviceObject, Irp);
+ }
+ else
+ {
+ /* not supported request */
+ Status = KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+ }
+
+ /* done */
+ return Status;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsSetMajorFunctionHandler(
+ IN PDRIVER_OBJECT DriverObject,
+ IN ULONG MajorFunction)
+{
+ switch ( MajorFunction )
+ {
+ case IRP_MJ_CREATE:
+ DriverObject->MajorFunction[MajorFunction] = KspCreate;
+ break;
+ break;
+ case IRP_MJ_DEVICE_CONTROL:
+ DriverObject->MajorFunction[MajorFunction] = KspDeviceControl;
+ break;
+ case IRP_MJ_CLOSE:
+ case IRP_MJ_READ:
+ case IRP_MJ_WRITE:
+ case IRP_MJ_FLUSH_BUFFERS :
+ case IRP_MJ_QUERY_SECURITY:
+ case IRP_MJ_SET_SECURITY:
+ DriverObject->MajorFunction[MajorFunction] = KspDispatchIrp;
+ break;
+ default:
+ return STATUS_INVALID_PARAMETER;
+ };
+
+ return STATUS_SUCCESS;
+}
+
+/*
+ @implemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsDispatchIrp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ PKSIDEVICE_HEADER DeviceHeader;
+ PDEVICE_EXTENSION DeviceExtension;
+
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ /* get device header */
+ DeviceHeader = DeviceExtension->DeviceHeader;
+
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ if (IoStack->MajorFunction <= IRP_MJ_DEVICE_CONTROL)
+ {
+ if (IoStack->MajorFunction == IRP_MJ_CREATE)
+ {
+ /* check internal type */
+ if (DeviceHeader->lpVtblIKsDevice) /* FIXME improve check */
+ {
+ /* AVStream client */
+ return IKsDevice_Create(DeviceObject, Irp);
+ }
+ else
+ {
+ /* external client (portcls) */
+ return KspCreate(DeviceObject, Irp);
+ }
+ }
+
+ if (IoStack->MajorFunction == IRP_MJ_DEVICE_CONTROL)
+ {
+ /* handle device requests */
+ return KspDeviceControl(DeviceObject, Irp);
+ }
+
+ switch (IoStack->MajorFunction)
+ {
+ case IRP_MJ_CLOSE:
+ case IRP_MJ_READ:
+ case IRP_MJ_WRITE:
+ case IRP_MJ_FLUSH_BUFFERS:
+ case IRP_MJ_QUERY_SECURITY:
+ case IRP_MJ_SET_SECURITY:
+ case IRP_MJ_PNP:
+ return KspDispatchIrp(DeviceObject, Irp);
+ default:
+ return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+ }
+ }
+
+ /* dispatch power */
+ if (IoStack->MajorFunction == IRP_MJ_POWER)
+ {
+ /* check internal type */
+ if (DeviceHeader->lpVtblIKsDevice) /* FIXME improve check */
+ {
+ /* AVStream client */
+ return IKsDevice_Power(DeviceObject, Irp);
+ }
+ else
+ {
+ /* external client (portcls) */
+ return KsDefaultDispatchPower(DeviceObject, Irp);
+ }
+ }
+ else if (IoStack->MajorFunction == IRP_MJ_PNP) /* dispatch pnp */
+ {
+ /* check internal type */
+ if (DeviceHeader->lpVtblIKsDevice) /* FIXME improve check */
+ {
+ /* AVStream client */
+ return IKsDevice_Pnp(DeviceObject, Irp);
+ }
+ else
+ {
+ /* external client (portcls) */
+ return KsDefaultDispatchPnp(DeviceObject, Irp);
+ }
+ }
+ else if (IoStack->MajorFunction == IRP_MJ_SYSTEM_CONTROL)
+ {
+ /* forward irp */
+ return KsDefaultForwardIrp(DeviceObject, Irp);
+ }
+ else
+ {
+ /* not supported */
+ return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+ }
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+ULONG
+NTAPI
+KsGetNodeIdFromIrp(
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED
+ return (ULONG)-1;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+PKSPIN
+NTAPI
+KsGetPinFromIrp(
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
diff --git a/reactos/drivers/ksfilter/ks/kcom.c b/reactos/drivers/ksfilter/ks/kcom.c
index 3b2a7b63d5a..8921caf1268 100644
--- a/reactos/drivers/ksfilter/ks/kcom.c
+++ b/reactos/drivers/ksfilter/ks/kcom.c
@@ -1,6 +1,11 @@
-/* ===============================================================
- Kernel-mode COM
-*/
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/allocators.c
+ * PURPOSE: KS Allocator functions
+ * PROGRAMMER: Johannes Anderwald
+ Andrew Greenwood
+ */
#include "priv.h"
diff --git a/reactos/drivers/ksfilter/ks/ks.rbuild b/reactos/drivers/ksfilter/ks/ks.rbuild
index 8862684d5df..1a463d6c82c 100644
--- a/reactos/drivers/ksfilter/ks/ks.rbuild
+++ b/reactos/drivers/ksfilter/ks/ks.rbuild
@@ -7,20 +7,27 @@
ntoskrnl
hal
+ pseh
ks.rc
+ api.c
allocators.c
bag.c
device.c
+ deviceinterface.c
driver.c
clocks.c
connectivity.c
- events.c
+ event.c
+ filter.c
+ filterfactory.c
+ image.c
irp.c
methods.c
misc.c
- properties.c
+ pin.c
+ property.c
topology.c
worker.c
kcom.c
diff --git a/reactos/drivers/ksfilter/ks/ks.spec b/reactos/drivers/ksfilter/ks/ks.spec
index 5db6978b036..c1de7281046 100644
--- a/reactos/drivers/ksfilter/ks/ks.spec
+++ b/reactos/drivers/ksfilter/ks/ks.spec
@@ -1,111 +1,218 @@
-@ stdcall KsCreateAllocator(ptr ptr ptr)
-@ stdcall KsCreateDefaultAllocator(ptr)
-@ stdcall KsValidateAllocatorCreateRequest(ptr ptr)
-@ stdcall KsCreateDefaultAllocatorEx(ptr ptr ptr ptr ptr ptr)
-@ stdcall KsValidateAllocatorFramingEx(ptr long ptr)
-
-@ stdcall KsCreateClock(ptr ptr ptr)
-@ stdcall KsCreateDefaultClock(ptr ptr)
+@ stdcall DllInitialize(ptr)
+@ stdcall KoCreateInstance(ptr ptr long ptr ptr)
+@ stdcall KoDeviceInitialize(ptr)
+@ stdcall KoDriverInitialize(ptr ptr ptr)
+@ stdcall KoRelease(ptr)
+@ stdcall KsAcquireControl(ptr)
+@ stdcall KsAcquireDevice(ptr)
+@ stdcall KsAcquireDeviceSecurityLock(ptr long)
+@ stdcall KsAcquireResetValue(ptr ptr)
+@ stdcall KsAddDevice(ptr ptr)
+@ stdcall KsAddEvent(ptr ptr)
+@ stdcall KsAddIrpToCancelableQueue(ptr ptr ptr long ptr)
+@ stdcall KsAddItemToObjectBag(ptr ptr ptr)
+@ stdcall KsAddObjectCreateItemToDeviceHeader (ptr ptr ptr ptr ptr)
+@ stdcall KsAddObjectCreateItemToObjectHeader(ptr ptr ptr ptr ptr)
@ stdcall KsAllocateDefaultClock(ptr)
@ stdcall KsAllocateDefaultClockEx(ptr ptr ptr ptr ptr ptr long)
-@ stdcall KsFreeDefaultClock(ptr)
-@ stdcall KsValidateClockCreateRequest(ptr ptr)
-@ stdcall KsGetDefaultClockState(ptr)
-@ stdcall KsSetDefaultClockState(ptr long)
-@ stdcall KsGetDefaultClockTime(ptr)
-@ stdcall KsSetDefaultClockTime(ptr long long)
-
-@ stdcall KsMethodHandler(ptr long ptr)
-@ stdcall KsMethodHandlerWithAllocator(ptr long ptr ptr long)
-@ stdcall KsFastMethodHandler(ptr ptr long ptr long ptr long ptr)
-
-@ stdcall KsPropertyHandler(ptr long ptr)
-@ stdcall KsPropertyHandlerWithAllocator(ptr long ptr ptr long)
-@ stdcall KsUnserializeObjectPropertiesFromRegistry(ptr ptr ptr)
-@ stdcall KsFastPropertyHandler(ptr ptr long ptr long ptr long ptr)
-
-@ stdcall KsGenerateEvent(ptr)
-@ stdcall KsEnableEventWithAllocator(ptr long ptr ptr long ptr ptr long)
-@ stdcall KsGenerateDataEvent(ptr long ptr)
-@ stdcall KsEnableEvent(ptr long ptr ptr long ptr)
-@ stdcall KsDiscardEvent(ptr)
-@ stdcall KsDisableEvent(ptr ptr long ptr)
-@ stdcall KsFreeEventList(ptr ptr long ptr)
-
-@ stdcall KsValidateTopologyNodeCreateRequest(ptr ptr ptr)
-@ stdcall KsCreateTopologyNode(ptr ptr long ptr)
-@ stdcall KsTopologyPropertyHandler(ptr ptr ptr ptr)
-
-@ stdcall KsCreatePin(ptr ptr long ptr)
-@ stdcall KsValidateConnectRequest(ptr long ptr ptr)
-@ stdcall KsPinPropertyHandler(ptr ptr ptr long ptr)
-@ stdcall KsPinDataIntersection(ptr ptr ptr long ptr ptr)
-
-@ stdcall KsHandleSizedListQuery(ptr long long ptr)
-
-@ stdcall KsAcquireResetValue(ptr ptr)
-@ stdcall KsDefaultForwardIrp(ptr ptr)
-@ stdcall KsAddIrpToCancelableQueue(ptr ptr ptr long ptr)
-@ stdcall KsAddObjectCreateItemToDeviceHeader(ptr ptr ptr wstr ptr)
-@ stdcall KsAddObjectCreateItemToObjectHeader(ptr ptr ptr wstr ptr)
@ stdcall KsAllocateDeviceHeader(ptr long ptr)
@ stdcall KsAllocateExtraData(ptr long ptr)
-@ stdcall KsAllocateObjectCreateItem(long ptr long ptr)
+@ stdcall KsAllocateObjectBag(ptr ptr)
+@ stdcall KsAllocateObjectCreateItem(ptr ptr long ptr)
@ stdcall KsAllocateObjectHeader(ptr long ptr ptr ptr)
+@ stdcall KsCacheMedium(ptr ptr long)
@ stdcall KsCancelIo(ptr ptr)
@ stdcall KsCancelRoutine(ptr ptr)
+@ stdcall KsCompletePendingRequest(ptr)
+@ stdcall KsCopyObjectBagItems(ptr ptr)
+@ stdcall KsCreateAllocator(ptr ptr ptr)
+@ stdcall KsCreateBusEnumObject(ptr ptr ptr ptr ptr ptr)
+@ stdcall KsCreateClock(ptr ptr ptr)
+@ stdcall KsCreateDefaultAllocator(ptr)
+@ stdcall KsCreateDefaultAllocatorEx(ptr ptr ptr ptr ptr ptr)
+@ stdcall KsCreateDefaultClock(ptr ptr)
+@ stdcall KsCreateDefaultSecurity(ptr ptr)
+@ stdcall KsCreateDevice(ptr ptr ptr long ptr)
+@ stdcall KsCreateFilterFactory(ptr ptr ptr ptr long ptr ptr ptr)
+@ stdcall KsCreatePin(ptr ptr long ptr)
+@ stdcall KsCreateTopologyNode(ptr ptr long ptr)
+@ stdcall KsDecrementCountedWorker(ptr)
+@ stdcall KsDefaultAddEventHandler(ptr ptr ptr)
@ stdcall KsDefaultDeviceIoCompletion(ptr ptr)
+@ stdcall KsDefaultDispatchPnp(ptr ptr)
+@ stdcall KsDefaultDispatchPower(ptr ptr)
+@ stdcall KsDefaultForwardIrp(ptr ptr)
+@ stdcall KsDereferenceBusObject(ptr)
+@ stdcall KsDereferenceSoftwareBusObject(ptr)
+@ stdcall KsDeviceGetBusData(ptr long ptr long long)
+@ stdcall KsDeviceRegisterAdapterObject(ptr ptr long long)
+@ stdcall KsDeviceSetBusData(ptr long ptr long long)
+@ stdcall KsDisableEvent(ptr ptr long long)
+@ stdcall KsDiscardEvent(ptr)
@ stdcall KsDispatchFastIoDeviceControlFailure(ptr long ptr long ptr long long ptr ptr)
@ stdcall KsDispatchFastReadFailure(ptr ptr long long long ptr ptr ptr)
-; KsDispatchFastWriteFailure@32
@ stdcall KsDispatchInvalidDeviceRequest(ptr ptr)
@ stdcall KsDispatchIrp(ptr ptr)
+@ stdcall KsDispatchQuerySecurity(ptr ptr)
+@ stdcall KsDispatchSetSecurity(ptr ptr)
@ stdcall KsDispatchSpecificMethod(ptr ptr)
@ stdcall KsDispatchSpecificProperty(ptr ptr)
+@ stdcall _KsEdit(ptr ptr long long long)
+@ stdcall KsEnableEvent(ptr long ptr ptr long ptr)
+@ stdcall KsEnableEventWithAllocator(ptr long ptr ptr long ptr ptr long)
+@ stdcall KsFastMethodHandler(ptr ptr long ptr long ptr long ptr)
+@ stdcall KsFastPropertyHandler(ptr ptr long ptr long ptr long ptr)
+@ stdcall KsFilterAcquireProcessingMutex(ptr)
+@ stdcall KsFilterAddTopologyConnections(ptr long ptr)
+@ stdcall KsFilterAttemptProcessing(ptr long)
+@ stdcall KsFilterCreateNode(ptr ptr ptr)
+@ stdcall KsFilterCreatePinFactory(ptr ptr ptr)
+@ stdcall KsFilterFactoryAddCreateItem(ptr ptr ptr long)
+@ stdcall KsFilterFactoryGetSymbolicLink(ptr)
+@ stdcall KsFilterFactorySetDeviceClassesState(ptr long)
+@ stdcall KsFilterFactoryUpdateCacheData(ptr ptr)
+@ stdcall KsFilterGetAndGate(ptr)
+@ stdcall KsFilterGetChildPinCount(ptr long)
+@ stdcall KsFilterGetFirstChildPin(ptr long)
+@ stdcall KsFilterRegisterPowerCallbacks(ptr ptr ptr)
+@ stdcall KsFilterReleaseProcessingMutex(ptr)
@ stdcall KsForwardAndCatchIrp(ptr ptr ptr long)
@ stdcall KsForwardIrp(ptr ptr long)
+@ stdcall KsFreeDefaultClock(ptr)
@ stdcall KsFreeDeviceHeader(ptr)
+@ stdcall KsFreeEventList(ptr ptr long ptr)
+@ stdcall KsFreeObjectBag(ptr)
+@ stdcall KsFreeObjectCreateItem(ptr ptr)
+@ stdcall KsFreeObjectCreateItemsByContext(ptr ptr)
@ stdcall KsFreeObjectHeader(ptr)
-@ stdcall KsGetChildCreateParameter(ptr ptr)
+@ stdcall KsGenerateDataEvent(ptr long ptr)
+@ stdcall KsGenerateEvent(ptr)
+@ stdcall KsGenerateEventList(ptr long ptr long ptr)
+@ stdcall KsGenerateEvents(ptr ptr long long ptr ptr ptr)
+@ stdcall KsGetBusEnumIdentifier(ptr)
+@ stdcall KsGetBusEnumParentFDOFromChildPDO(ptr ptr)
+@ stdcall KsGetBusEnumPnpDeviceObject(ptr ptr)
+@ stdcall KsGetDefaultClockState(ptr)
+@ stdcall KsGetDefaultClockTime(ptr)
+@ stdcall KsGetDevice(ptr)
+@ stdcall KsGetDeviceForDeviceObject(ptr)
+@ stdcall KsGetFilterFromIrp(ptr)
+@ stdcall KsGetFirstChild(ptr)
+@ stdcall KsGetImageNameAndResourceId(ptr ptr ptr ptr)
+@ stdcall KsGetNextSibling(ptr)
+@ stdcall KsGetNodeIdFromIrp(ptr)
+@ stdcall KsGetObjectFromFileObject(ptr)
+@ stdcall KsGetObjectTypeFromFileObject(ptr)
+@ stdcall KsGetObjectTypeFromIrp(ptr)
+@ stdcall KsGetOuterUnknown(ptr)
+@ stdcall KsGetParent(ptr)
+@ stdcall KsGetPinFromIrp(ptr)
+@ stdcall KsHandleSizedListQuery(ptr long long ptr)
+;@ stdcall KsiDefaultClockAddMarkEvent
+@ stdcall KsIncrementCountedWorker(ptr)
+@ stdcall KsInitializeDevice(ptr ptr ptr ptr)
+@ stdcall KsInitializeDriver(ptr ptr ptr)
+@ stdcall KsInstallBusEnumInterface(ptr)
+;KsiPropertyDefaultClockGetCorrelatedPhysicalTime
+;KsiPropertyDefaultClockGetCorrelatedTime
+;KsiPropertyDefaultClockGetFunctionTable
+;KsiPropertyDefaultClockGetPhysicalTime
+;KsiPropertyDefaultClockGetResolution
+;KsiPropertyDefaultClockGetState
+;KsiPropertyDefaultClockGetTime
+;KsiQueryObjectCreateItemsPresent
+@ stdcall KsIsBusEnumChildDevice(ptr ptr)
+@ stdcall KsLoadResource(ptr long long long ptr ptr)
+@ stdcall KsMapModuleName(ptr ptr ptr ptr ptr)
+@ stdcall KsMergeAutomationTables(ptr ptr ptr ptr)
+@ stdcall KsMethodHandler(ptr long ptr)
+@ stdcall KsMethodHandlerWithAllocator(ptr long ptr ptr long)
@ stdcall KsMoveIrpsOnCancelableQueue(ptr ptr ptr ptr long ptr ptr)
+@ stdcall KsNullDriverUnload(ptr)
+@ stdcall KsPinAcquireProcessingMutex(ptr)
+@ stdcall KsPinAttachAndGate(ptr ptr)
+@ stdcall KsPinAttachOrGate(ptr ptr)
+@ stdcall KsPinAttemptProcessing(ptr long)
+@ stdcall KsPinDataIntersection(ptr ptr ptr long ptr ptr)
+@ stdcall KsPinGetAndGate(ptr)
+@ stdcall KsPinGetAvailableByteCount(ptr ptr ptr)
+@ stdcall KsPinGetConnectedFilterInterface(ptr ptr ptr)
+@ stdcall KsPinGetConnectedPinDeviceObject(ptr)
+@ stdcall KsPinGetConnectedPinFileObject(ptr)
+@ stdcall KsPinGetConnectedPinInterface(ptr ptr ptr)
+@ stdcall KsPinGetCopyRelationships(ptr ptr ptr)
+@ stdcall KsPinGetFirstCloneStreamPointer(ptr)
+@ stdcall KsPinGetLeadingEdgeStreamPointer(ptr long)
+@ stdcall KsPinGetNextSiblingPin(ptr)
+@ stdcall KsPinGetParentFilter(ptr)
+@ stdcall KsPinGetReferenceClockInterface(ptr ptr)
+@ stdcall KsPinGetTrailingEdgeStreamPointer(ptr ptr)
+@ stdcall KsPinPropertyHandler(ptr ptr ptr long ptr)
+@ stdcall KsPinRegisterFrameReturnCallback(ptr ptr)
+@ stdcall KsPinRegisterHandshakeCallback(ptr ptr)
+@ stdcall KsPinRegisterIrpCompletionCallback(ptr ptr)
+@ stdcall KsPinRegisterPowerCallbacks(ptr ptr ptr)
+@ stdcall KsPinReleaseProcessingMutex(ptr)
+@ stdcall KsPinSetPinClockTime(ptr double)
+@ stdcall KsPinSubmitFrame(ptr ptr long ptr ptr)
+@ stdcall KsPinSubmitFrameMdl(ptr ptr ptr ptr)
@ stdcall KsProbeStreamIrp(ptr long long)
+@ stdcall KsProcessPinUpdate(ptr)
+@ stdcall KsPropertyHandler(ptr long ptr)
+@ stdcall KsPropertyHandlerWithAllocator(ptr long ptr ptr long)
+@ stdcall KsQueryDevicePnpObject(ptr)
@ stdcall KsQueryInformationFile(ptr ptr long long)
@ stdcall KsQueryObjectAccessMask(ptr)
@ stdcall KsQueryObjectCreateItem(ptr)
+@ stdcall KsQueueWorkItem(ptr ptr)
@ stdcall KsReadFile(ptr ptr ptr ptr ptr long long long)
+@ stdcall KsRecalculateStackDepth(ptr long)
+@ stdcall KsReferenceBusObject(ptr)
+@ stdcall KsReferenceSoftwareBusObject(ptr)
+@ stdcall KsRegisterAggregatedClientUnknown(ptr ptr)
+@ stdcall KsRegisterCountedWorker(long ptr ptr)
+@ stdcall KsRegisterFilterWithNoKSPins(ptr ptr long ptr ptr ptr)
+@ stdcall KsRegisterWorker(long ptr)
+@ stdcall KsReleaseControl(ptr)
+@ stdcall KsReleaseDevice(ptr)
+@ stdcall KsReleaseDeviceSecurityLock(ptr)
@ stdcall KsReleaseIrpOnCancelableQueue(ptr ptr)
+@ stdcall KsRemoveBusEnumInterface(ptr)
@ stdcall KsRemoveIrpFromCancelableQueue(ptr ptr long long)
+@ stdcall KsRemoveItemFromObjectBag(ptr ptr long)
@ stdcall KsRemoveSpecificIrpFromCancelableQueue(ptr)
+@ stdcall KsServiceBusEnumCreateRequest(ptr ptr)
+@ stdcall KsServiceBusEnumPnpRequest(ptr ptr)
+@ stdcall KsSetDefaultClockState(ptr long)
+@ stdcall KsSetDefaultClockTime(ptr double)
+@ stdcall KsSetDevicePnpAndBaseObject(ptr ptr ptr)
@ stdcall KsSetInformationFile(ptr ptr long long)
@ stdcall KsSetMajorFunctionHandler(ptr long)
-@ stdcall KsStreamIo(ptr ptr ptr ptr ptr long ptr ptr long long long)
-@ stdcall KsWriteFile(ptr ptr ptr ptr ptr long long long)
-
-@ stdcall KsRegisterWorker(long ptr)
-@ stdcall KsUnregisterWorker(ptr)
-@ stdcall KsRegisterCountedWorker(long ptr ptr)
-@ stdcall KsDecrementCountedWorker(ptr)
-@ stdcall KsIncrementCountedWorker(ptr)
-@ stdcall KsQueueWorkItem(ptr ptr)
-
-@ stdcall KsCacheMedium(ptr ptr long)
-@ stdcall KsDefaultDispatchPnp(ptr ptr)
-@ stdcall KsSetDevicePnpAndBaseObject(ptr ptr ptr)
-@ stdcall KsDefaultDispatchPower(ptr ptr)
@ stdcall KsSetPowerDispatch(ptr ptr ptr)
-@ stdcall KsReferenceBusObject(ptr)
-@ stdcall KsDereferenceBusObject(ptr)
-@ stdcall KsFreeObjectCreateItem(ptr ptr)
-@ stdcall KsFreeObjectCreateItemsByContext(ptr ptr)
-@ stdcall KsLoadResource(ptr long ptr long ptr ptr)
-@ stdcall KsNullDriverUnload(ptr)
-@ stdcall KsPinDataIntersectionEx(ptr ptr ptr long ptr long ptr ptr)
-@ stdcall KsQueryDevicePnpObject(ptr)
-@ stdcall KsRecalculateStackDepth(ptr long)
@ stdcall KsSetTargetDeviceObject(ptr ptr)
@ stdcall KsSetTargetState(ptr long)
+@ stdcall KsStreamIo(ptr ptr ptr ptr ptr long ptr ptr long long long)
+@ stdcall KsStreamPointerAdvance(ptr)
+@ stdcall KsStreamPointerAdvanceOffsets(ptr long long long)
+@ stdcall KsStreamPointerAdvanceOffsetsAndUnlock(ptr long long long)
+@ stdcall KsStreamPointerCancelTimeout(ptr)
+@ stdcall KsStreamPointerClone(ptr ptr long ptr)
+@ stdcall KsStreamPointerDelete(ptr)
+@ stdcall KsStreamPointerGetIrp(ptr ptr ptr)
+@ stdcall KsStreamPointerGetMdl(ptr)
+@ stdcall KsStreamPointerGetNextClone(ptr)
+@ stdcall KsStreamPointerLock(ptr)
+@ stdcall KsStreamPointerScheduleTimeout(ptr ptr double)
+@ stdcall KsStreamPointerSetStatusCode(ptr long)
+@ stdcall KsStreamPointerUnlock(ptr long)
@ stdcall KsSynchronousIoControlDevice(ptr long long ptr long ptr long ptr)
-@ stdcall KsInitializeDriver(ptr ptr ptr)
-
-; Kernel COM
-@ stdcall KoCreateInstance(ptr ptr long ptr ptr)
+@ stdcall KsTerminateDevice(ptr)
+@ stdcall KsTopologyPropertyHandler(ptr ptr ptr ptr)
+@ stdcall KsUnregisterWorker(ptr)
+@ stdcall KsUnserializeObjectPropertiesFromRegistry(ptr ptr ptr)
+@ stdcall KsValidateAllocatorCreateRequest(ptr ptr)
+@ stdcall KsValidateAllocatorFramingEx(ptr long ptr)
+@ stdcall KsValidateClockCreateRequest(ptr ptr)
+@ stdcall KsValidateConnectRequest(ptr long ptr ptr)
+@ stdcall KsValidateTopologyNodeCreateRequest(ptr ptr ptr)
+@ stdcall KsWriteFile(ptr ptr ptr ptr ptr long long long)
diff --git a/reactos/drivers/ksfilter/ks/ksfunc.h b/reactos/drivers/ksfilter/ks/ksfunc.h
index a3769122e80..72c9f487861 100644
--- a/reactos/drivers/ksfilter/ks/ksfunc.h
+++ b/reactos/drivers/ksfilter/ks/ksfunc.h
@@ -2,10 +2,7 @@
#define KSFUNC_H__
#include "ksiface.h"
-
-NTSTATUS
-NTAPI
-NewIKsDevice(IKsDevice** OutDevice);
+#include "kstypes.h"
#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
#define TAG_KSDEVICE TAG('K', 'S', 'E', 'D')
@@ -21,6 +18,100 @@ KspCreateObjectType(
IN ACCESS_MASK DesiredAccess,
OUT PHANDLE NodeHandle);
+NTSTATUS
+NTAPI
+KspCreateFilterFactory(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN const KSFILTER_DESCRIPTOR *Descriptor,
+ IN PWSTR RefString OPTIONAL,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
+ IN ULONG CreateItemFlags,
+ IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
+ IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
+ OUT PKSFILTERFACTORY *FilterFactory OPTIONAL);
+NTSTATUS
+NTAPI
+IKsDevice_Create(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+IKsDevice_Pnp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+IKsDevice_Power(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+KspCreateFilter(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN IKsFilterFactory *iface);
+
+NTSTATUS
+KspSetDeviceInterfacesState(
+ IN PLIST_ENTRY ListHead,
+ IN BOOL Enable);
+
+NTSTATUS
+KspFreeDeviceInterfaces(
+ IN PLIST_ENTRY ListHead);
+
+NTSTATUS
+KspRegisterDeviceInterfaces(
+ IN PDEVICE_OBJECT PhysicalDeviceObject,
+ IN ULONG CategoriesCount,
+ IN GUID const*Categories,
+ IN PUNICODE_STRING ReferenceString,
+ OUT PLIST_ENTRY SymbolicLinkList);
+
+NTSTATUS
+KspForwardIrpSynchronous(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+PVOID
+AllocateItem(
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes);
+
+VOID
+FreeItem(
+ IN PVOID Item);
+
+NTSTATUS
+NTAPI
+KspTopologyPropertyHandler(
+ IN PIRP Irp,
+ IN PKSIDENTIFIER Request,
+ IN OUT PVOID Data);
+
+NTSTATUS
+NTAPI
+KspPinPropertyHandler(
+ IN PIRP Irp,
+ IN PKSIDENTIFIER Request,
+ IN OUT PVOID Data);
+
+NTSTATUS
+FindMatchingCreateItem(
+ PLIST_ENTRY ListHead,
+ ULONG BufferSize,
+ LPWSTR Buffer,
+ OUT PCREATE_ITEM_ENTRY *OutCreateItem);
+
+NTSTATUS
+KspCopyCreateRequest(
+ IN PIRP Irp,
+ IN LPWSTR ObjectClass,
+ IN OUT PULONG Size,
+ OUT PVOID * Result);
#endif
diff --git a/reactos/drivers/ksfilter/ks/ksiface.h b/reactos/drivers/ksfilter/ks/ksiface.h
index 896652b554e..f323e1a84c8 100644
--- a/reactos/drivers/ksfilter/ks/ksiface.h
+++ b/reactos/drivers/ksfilter/ks/ksiface.h
@@ -14,6 +14,129 @@
STDMETHOD_(ULONG,Release)(THIS) PURE;
#endif
+/*****************************************************************************
+ * IKsAllocator
+ *****************************************************************************
+ */
+
+#undef INTERFACE
+#define INTERFACE IKsAllocator
+
+DECLARE_INTERFACE_(IKsAllocator, IUnknown)
+{
+ DEFINE_ABSTRACT_UNKNOWN()
+
+ STDMETHOD_(NTSTATUS, DispatchDeviceIoControl)(THIS_
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp) PURE;
+
+ STDMETHOD_(NTSTATUS, Close)(THIS) PURE;
+
+ STDMETHOD_(NTSTATUS, AllocateFrame)(THIS_
+ IN PVOID * OutFrame) PURE;
+
+ STDMETHOD_(VOID, FreeFrame)(THIS_
+ IN PVOID OutFrame) PURE;
+};
+
+
+/*****************************************************************************
+ * IKsPin
+ *****************************************************************************
+ */
+
+#undef INTERFACE
+#define INTERFACE IKsClock
+
+DECLARE_INTERFACE_(IKsClock, IUnknown)
+{
+ DEFINE_ABSTRACT_UNKNOWN()
+};
+
+/*****************************************************************************
+ * IKsPin
+ *****************************************************************************
+ */
+
+#undef INTERFACE
+#define INTERFACE IKsPin
+
+DECLARE_INTERFACE_(IKsPin, IUnknown)
+{
+ DEFINE_ABSTRACT_UNKNOWN()
+};
+
+/*****************************************************************************
+ * IKsQueue
+ *****************************************************************************
+ */
+
+#undef INTERFACE
+#define INTERFACE IKsQueue
+
+DECLARE_INTERFACE_(IKsQueue, IUnknown)
+{
+ DEFINE_ABSTRACT_UNKNOWN()
+
+};
+
+/*****************************************************************************
+ * IKsFilterFactory
+ *****************************************************************************
+ */
+
+#undef INTERFACE
+#define INTERFACE IKsFilter
+
+struct KSPROCESSPIPESECTION;
+
+
+DECLARE_INTERFACE_(IKsFilter, IUnknown)
+{
+ DEFINE_ABSTRACT_UNKNOWN()
+
+ STDMETHOD_(PKSFILTER, GetStruct)(THIS) PURE;
+
+ STDMETHOD_(BOOL, DoAllNecessaryPinsExist)(THIS) PURE;
+
+ STDMETHOD_(NTSTATUS, CreateNode)(THIS_
+ IN PIRP Irp,
+ IN IKsPin * Pin,
+ IN PLIST_ENTRY ListEntry) PURE;
+
+ STDMETHOD_(NTSTATUS, BindProcessPinsToPipeSection)(THIS_
+ IN struct KSPROCESSPIPESECTION *Section,
+ IN PVOID Create,
+ IN PKSPIN KsPin,
+ OUT IKsPin **Pin,
+ OUT PKSGATE *OutGate) PURE;
+
+ STDMETHOD_(NTSTATUS, UnbindProcessPinsFromPipeSection)(THIS_
+ IN struct KSPROCESSPIPESECTION *Section) PURE;
+
+ STDMETHOD_(NTSTATUS, AddProcessPin)(THIS_
+ IN PKSPROCESSPIN ProcessPin) PURE;
+
+ STDMETHOD_(NTSTATUS, RemoveProcessPin)(THIS_
+ IN PKSPROCESSPIN ProcessPin) PURE;
+
+ STDMETHOD_(BOOL, ReprepareProcessPipeSection)(THIS_
+ IN struct KSPROCESSPIPESECTION *PipeSection,
+ IN PULONG Data) PURE;
+
+ STDMETHOD_(VOID, DeliverResetState)(THIS_
+ IN struct KSPROCESSPIPESECTION *PipeSection,
+ IN KSRESET ResetState) PURE;
+
+ STDMETHOD_(BOOL, IsFrameHolding)(THIS);
+
+ STDMETHOD_(VOID, RegisterForCopyCallbacks)(THIS_
+ IKsQueue * Queue,
+ IN BOOL Enable) PURE;
+
+ STDMETHOD_(PKSPROCESSPIN_INDEXENTRY, GetProcessDispatch)(THIS);
+};
+
/*****************************************************************************
* IKsFilterFactory
*****************************************************************************
@@ -26,10 +149,26 @@ DECLARE_INTERFACE_(IKsFilterFactory, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
- STDMETHOD_(KSFILTERFACTORY*,GetStruct)(THIS) PURE;
+ STDMETHOD_(KSFILTERFACTORY*, GetStruct)(THIS) PURE;
- STDMETHOD_(NTSTATUS,SetDeviceClassesState)(THIS_
+ STDMETHOD_(NTSTATUS, SetDeviceClassesState)(THIS_
IN BOOLEAN Enable)PURE;
+
+ STDMETHOD_(NTSTATUS, Initialize)(THIS_
+ IN PDEVICE_OBJECT DeviceObject,
+ IN const KSFILTER_DESCRIPTOR *Descriptor,
+ IN PWSTR RefString OPTIONAL,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
+ IN ULONG CreateItemFlags,
+ IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
+ IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
+ OUT PKSFILTERFACTORY *FilterFactory OPTIONAL)PURE;
+
+ STDMETHOD_(NTSTATUS, AddFilterInstance)(THIS_
+ IN IKsFilter *Filter)PURE;
+
+ STDMETHOD_(NTSTATUS, RemoveFilterInstance)(THIS_
+ IN IKsFilter *Filter)PURE;
};
diff --git a/reactos/drivers/ksfilter/ks/kstypes.h b/reactos/drivers/ksfilter/ks/kstypes.h
index 68a563c7747..e7583414e80 100644
--- a/reactos/drivers/ksfilter/ks/kstypes.h
+++ b/reactos/drivers/ksfilter/ks/kstypes.h
@@ -1,35 +1,69 @@
#ifndef KSTYPES_H__
#define KSTYPES_H__
-struct KSIDEVICE_HEADER;
-
typedef struct
{
KSDISPATCH_TABLE DispatchTable;
- LPWSTR ObjectClass;
- ULONG ItemCount;
- PKSOBJECT_CREATE_ITEM CreateItem;
+ KSOBJECTTYPE Type;
+
+ LONG ItemListCount;
+ LIST_ENTRY ItemList;
+
+ UNICODE_STRING ObjectClass;
+ PUNKNOWN Unknown;
+
+ PDEVICE_OBJECT TargetDevice;
+ LIST_ENTRY TargetDeviceListEntry;
+
+ PDEVICE_OBJECT ParentDeviceObject;
+
+ PFNKSCONTEXT_DISPATCH PowerDispatch;
+ PVOID PowerContext;
+ LIST_ENTRY PowerDispatchEntry;
+ PKSOBJECT_CREATE_ITEM OriginalCreateItem;
+ ACCESS_MASK AccessMask;
}KSIOBJECT_HEADER, *PKSIOBJECT_HEADER;
typedef struct
{
- BOOL bCreated;
- PKSIOBJECT_HEADER ObjectHeader;
- KSOBJECT_CREATE_ITEM CreateItem;
-}DEVICE_ITEM, *PDEVICE_ITEM;
-
+ LIST_ENTRY Entry;
+ PKSOBJECT_CREATE_ITEM CreateItem;
+ PFNKSITEMFREECALLBACK ItemFreeCallback;
+ LONG ReferenceCount;
+ LIST_ENTRY ObjectItemList;
+}CREATE_ITEM_ENTRY, *PCREATE_ITEM_ENTRY;
typedef struct
{
- USHORT MaxItems;
- DEVICE_ITEM *ItemList;
+ KSOBJECTTYPE Type;
+ PKSDEVICE KsDevice;
+}KSBASIC_HEADER, *PKSBASIC_HEADER;
+
+typedef struct
+{
+ KSOBJECTTYPE Type;
+ KSDEVICE KsDevice;
+ IKsDeviceVtbl *lpVtblIKsDevice;
+
+ LONG ref;
+ ERESOURCE SecurityLock;
+
+ LONG ItemListCount;
+ LIST_ENTRY ItemList;
ULONG DeviceIndex;
- KSPIN_LOCK ItemListLock;
+ PDEVICE_OBJECT PnpDeviceObject;
+ PDEVICE_OBJECT BaseDevice;
+
+ KSTARGET_STATE TargetState;
+ LIST_ENTRY TargetDeviceList;
+
+ KMUTEX DeviceMutex;
+ KSDEVICE_DESCRIPTOR* Descriptor;
+
+ LIST_ENTRY PowerDispatchList;
- PDEVICE_OBJECT NextDeviceObject;
- ERESOURCE SecurityLock;
}KSIDEVICE_HEADER, *PKSIDEVICE_HEADER;
@@ -42,8 +76,14 @@ typedef struct
typedef struct
{
LIST_ENTRY Entry;
- PIRP Irp;
-}QUEUE_ENTRY, *PQUEUE_ENTRY;
+ UNICODE_STRING SymbolicLink;
+}SYMBOLIC_LINK_ENTRY, *PSYMBOLIC_LINK_ENTRY;
+
+typedef struct
+{
+ PKSIDEVICE_HEADER DeviceHeader;
+ PIO_WORKITEM WorkItem;
+}PNP_POSTSTART_CONTEXT, *PPNP_POSTSTART_CONTEXT;
#endif
diff --git a/reactos/drivers/ksfilter/ks/methods.c b/reactos/drivers/ksfilter/ks/methods.c
index 9084df3773d..512371a6a29 100644
--- a/reactos/drivers/ksfilter/ks/methods.c
+++ b/reactos/drivers/ksfilter/ks/methods.c
@@ -1,13 +1,19 @@
-#include "priv.h"
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/methods.c
+ * PURPOSE: KS Allocator functions
+ * PROGRAMMER: Johannes Anderwald
+ */
-/* ===============================================================
- Method Functions
-*/
+#include "priv.h"
/*
@unimplemented
*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsMethodHandler(
IN PIRP Irp,
IN ULONG MethodSetsCount,
@@ -20,7 +26,9 @@ KsMethodHandler(
/*
@unimplemented
*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsMethodHandlerWithAllocator(
IN PIRP Irp,
IN ULONG MethodSetsCount,
@@ -35,7 +43,9 @@ KsMethodHandlerWithAllocator(
/*
@unimplemented
*/
-KSDDKAPI BOOLEAN NTAPI
+KSDDKAPI
+BOOLEAN
+NTAPI
KsFastMethodHandler(
IN PFILE_OBJECT FileObject,
IN PKSMETHOD UNALIGNED Method,
diff --git a/reactos/drivers/ksfilter/ks/misc.c b/reactos/drivers/ksfilter/ks/misc.c
index c40226662f2..b7af2bc67b2 100644
--- a/reactos/drivers/ksfilter/ks/misc.c
+++ b/reactos/drivers/ksfilter/ks/misc.c
@@ -1,175 +1,84 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/misc.c
+ * PURPOSE: KS Allocator functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
#include "priv.h"
-/* ===============================================================
- Misc. Helper Functions
-*/
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsCacheMedium(
- IN PUNICODE_STRING SymbolicLink,
- IN PKSPIN_MEDIUM Medium,
- IN ULONG PinDirection)
+PVOID
+AllocateItem(
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ PVOID Item = ExAllocatePool(PoolType, NumberOfBytes);
+ if (!Item)
+ return Item;
+
+ RtlZeroMemory(Item, NumberOfBytes);
+ return Item;
}
-/*
- @unimplemented
-*/
-
-KSDDKAPI NTSTATUS NTAPI
-KsDefaultDispatchPnp(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
+VOID
+FreeItem(
+ IN PVOID Item)
{
- PIO_STACK_LOCATION IoStack;
- NTSTATUS Status = STATUS_SUCCESS;
- IoStack = IoGetCurrentIrpStackLocation(Irp);
+ ExFreePool(Item);
+}
- DPRINT1("KsDefaultDispatchPnp entered with func %x\n", IoStack->MinorFunction);
-
- switch(IoStack->MinorFunction)
+NTSTATUS
+NTAPI
+KspForwardIrpSynchronousCompletion(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PVOID Context)
+{
+ if (Irp->PendingReturned == TRUE)
{
- case IRP_MN_QUERY_DEVICE_RELATIONS:
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_INSUFFICIENT_RESOURCES;
- case IRP_MN_REMOVE_DEVICE:
- // FIXME
- // destroy device header, detach device and delete device
- case IRP_MN_START_DEVICE:
- case IRP_MN_QUERY_REMOVE_DEVICE:
- case IRP_MN_CANCEL_STOP_DEVICE:
- case IRP_MN_SURPRISE_REMOVAL:
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_SUCCESS;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_SUCCESS;
- default:
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- //Status = IoCallDriver(NULL /* PnpBaseObject */, Irp);
+ KeSetEvent ((PKEVENT) Context, IO_NO_INCREMENT, FALSE);
}
-
- return Status;
+ return STATUS_MORE_PROCESSING_REQUIRED;
}
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsSetDevicePnpAndBaseObject(
- IN KSDEVICE_HEADER Header,
- IN PDEVICE_OBJECT PnpDeviceObject,
- IN PDEVICE_OBJECT BaseDevice)
-{
- UNIMPLEMENTED;
-}
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsDefaultDispatchPower(
+NTSTATUS
+KspForwardIrpSynchronous(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
- UNIMPLEMENTED;
+ KEVENT Event;
+ NTSTATUS Status;
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIDEVICE_HEADER DeviceHeader;
- Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_UNSUCCESSFUL;
-}
+ ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsSetPowerDispatch(
- IN KSOBJECT_HEADER Header,
- IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL,
- IN PVOID PowerContext OPTIONAL)
-{
- UNIMPLEMENTED;
-}
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ /* get device header */
+ DeviceHeader = DeviceExtension->DeviceHeader;
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsReferenceBusObject(
- IN KSDEVICE_HEADER Header)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
+ /* initialize the notification event */
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsDereferenceBusObject(
- IN KSDEVICE_HEADER Header)
-{
- UNIMPLEMENTED;
-}
+ IoCopyCurrentIrpStackLocationToNext(Irp);
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsFreeObjectCreateItem(
- IN KSDEVICE_HEADER Header,
- IN PUNICODE_STRING CreateItem)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
+ IoSetCompletionRoutine(Irp, KspForwardIrpSynchronousCompletion, (PVOID)&Event, TRUE, TRUE, TRUE);
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsFreeObjectCreateItemsByContext(
- IN KSDEVICE_HEADER Header,
- IN PVOID Context)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsLoadResource(
- IN PVOID ImageBase,
- IN POOL_TYPE PoolType,
- IN ULONG_PTR ResourceName,
- IN ULONG ResourceType,
- OUT PVOID* Resource,
- OUT PULONG ResourceSize)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsNullDriverUnload(
- IN PDRIVER_OBJECT DriverObject)
-{
- UNIMPLEMENTED;
+ /* now call the driver */
+ Status = IoCallDriver(DeviceHeader->BaseDevice, Irp);
+ /* did the request complete yet */
+ if (Status == STATUS_PENDING)
+ {
+ /* not yet, lets wait a bit */
+ KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+ Status = Irp->IoStatus.Status;
+ }
+ return Status;
}
/*
@@ -190,186 +99,108 @@ KsPinDataIntersectionEx(
return STATUS_UNSUCCESSFUL;
}
+
+NTSTATUS
+KspCopyCreateRequest(
+ IN PIRP Irp,
+ IN LPWSTR ObjectClass,
+ IN OUT PULONG Size,
+ OUT PVOID * Result)
+{
+ PIO_STACK_LOCATION IoStack;
+ ULONG ObjectLength, ParametersLength;
+ PVOID Buffer;
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* get object class length */
+ ObjectLength = (wcslen(ObjectClass) + 2) * sizeof(WCHAR);
+
+ /* check for minium length requirement */
+ if (ObjectLength + *Size > IoStack->FileObject->FileName.MaximumLength)
+ return STATUS_UNSUCCESSFUL;
+
+ /* extract parameters length */
+ ParametersLength = IoStack->FileObject->FileName.MaximumLength - ObjectLength;
+
+ /* allocate buffer */
+ Buffer = AllocateItem(NonPagedPool, ParametersLength);
+ if (!Buffer)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* copy parameters */
+ RtlMoveMemory(Buffer, &IoStack->FileObject->FileName.Buffer[ObjectLength / sizeof(WCHAR)], ParametersLength);
+
+ /* store result */
+ *Result = Buffer;
+ *Size = ParametersLength;
+
+ return STATUS_SUCCESS;
+}
+
/*
@unimplemented
*/
-KSDDKAPI PDEVICE_OBJECT NTAPI
-KsQueryDevicePnpObject(
- IN KSDEVICE_HEADER Header)
+KSDDKAPI
+PVOID
+NTAPI
+KsGetObjectFromFileObject(
+ IN PFILE_OBJECT FileObject)
{
- UNIMPLEMENTED;
+ UNIMPLEMENTED
return NULL;
}
/*
@unimplemented
*/
-KSDDKAPI VOID NTAPI
-KsRecalculateStackDepth(
- IN KSDEVICE_HEADER Header,
- IN BOOLEAN ReuseStackLocation)
+KSDDKAPI
+KSOBJECTTYPE
+NTAPI
+KsGetObjectTypeFromFileObject(
+ IN PFILE_OBJECT FileObject)
{
- UNIMPLEMENTED;
+ UNIMPLEMENTED
+ return (KSOBJECTTYPE)-1;
}
/*
@unimplemented
*/
-KSDDKAPI VOID NTAPI
-KsSetTargetDeviceObject(
- IN KSOBJECT_HEADER Header,
- IN PDEVICE_OBJECT TargetDevice OPTIONAL)
+KSOBJECTTYPE
+NTAPI
+KsGetObjectTypeFromIrp(
+ IN PIRP Irp)
{
- UNIMPLEMENTED;
+ UNIMPLEMENTED
+ return (KSOBJECTTYPE)-1;
}
/*
@unimplemented
*/
-KSDDKAPI VOID NTAPI
-KsSetTargetState(
- IN KSOBJECT_HEADER Header,
- IN KSTARGET_STATE TargetState)
-{
- UNIMPLEMENTED;
-}
-
-NTSTATUS
+PUNKNOWN
NTAPI
-CompletionRoutine(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context)
+KsGetOuterUnknown(
+ IN PVOID Object)
{
- PIO_STATUS_BLOCK IoStatusBlock = (PIO_STATUS_BLOCK)Context;
+ UNIMPLEMENTED
+ return NULL;
- IoStatusBlock->Information = Irp->IoStatus.Information;
- IoStatusBlock->Status = Irp->IoStatus.Status;
-
- return STATUS_SUCCESS;
}
/*
- @implemented
+ @unimplemented
*/
KSDDKAPI
-NTSTATUS
+PVOID
NTAPI
-KsSynchronousIoControlDevice(
- IN PFILE_OBJECT FileObject,
- IN KPROCESSOR_MODE RequestorMode,
- IN ULONG IoControl,
- IN PVOID InBuffer,
- IN ULONG InSize,
- OUT PVOID OutBuffer,
- IN ULONG OutSize,
- OUT PULONG BytesReturned)
+KsGetParent(
+ IN PVOID Object)
{
- PKSIOBJECT_HEADER ObjectHeader;
- PDEVICE_OBJECT DeviceObject;
- KEVENT Event;
- PIRP Irp;
- IO_STATUS_BLOCK IoStatusBlock;
- PIO_STACK_LOCATION IoStack;
- NTSTATUS Status;
-
- /* check for valid file object */
- if (!FileObject)
- return STATUS_INVALID_PARAMETER;
-
- /* get device object to send the request to */
- DeviceObject = IoGetRelatedDeviceObject(FileObject);
- if (!DeviceObject)
- return STATUS_UNSUCCESSFUL;
-
- /* get object header */
- ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext;
- if (!ObjectHeader)
- {
- DPRINT("Expected object header\n");
- return STATUS_UNSUCCESSFUL;
- }
-
- /* check if there is fast device io function */
- if (ObjectHeader->DispatchTable.FastDeviceIoControl)
- {
- IoStatusBlock.Status = STATUS_UNSUCCESSFUL;
- IoStatusBlock.Information = 0;
-
- /* it is send the request */
- Status = ObjectHeader->DispatchTable.FastDeviceIoControl(FileObject, TRUE, InBuffer, InSize, OutBuffer, OutSize, IoControl, &IoStatusBlock, DeviceObject);
- /* check if the request was handled */
- DPRINT("Handled %u Status %x Length %u\n", Status, IoStatusBlock.Status, IoStatusBlock.Information);
- if (Status)
- {
- /* store bytes returned */
- *BytesReturned = IoStatusBlock.Information;
- /* return status */
- return IoStatusBlock.Status;
- }
- }
-
- /* initialize the event */
- KeInitializeEvent(&Event, NotificationEvent, FALSE);
-
- /* create the irp */
- Irp = IoBuildDeviceIoControlRequest(IoControl, DeviceObject, InBuffer, InSize, OutBuffer, OutSize, FALSE, &Event, &IoStatusBlock);
-
- /* HACK */
- IoStack = IoGetNextIrpStackLocation(Irp);
- IoStack->FileObject = FileObject;
-
- IoSetCompletionRoutine(Irp, CompletionRoutine, (PVOID)&IoStatusBlock, TRUE, TRUE, TRUE);
-
- Status = IoCallDriver(DeviceObject, Irp);
- if (Status == STATUS_PENDING)
- {
- KeWaitForSingleObject(&Event, Executive, RequestorMode, FALSE, NULL);
- Status = IoStatusBlock.Status;
- }
-
- *BytesReturned = IoStatusBlock.Information;
- return Status;
+ UNIMPLEMENTED
+ return NULL;
}
-/*
- @implemented
-*/
-KSDDKAPI
-VOID
-NTAPI
-KsAcquireDeviceSecurityLock(
- IN KSDEVICE_HEADER DevHeader,
- IN BOOLEAN Exclusive)
-{
- NTSTATUS Status;
- PKSIDEVICE_HEADER Header = (PKSIDEVICE_HEADER)DevHeader;
-
- KeEnterCriticalRegion();
-
- if (Exclusive)
- {
- Status = ExAcquireResourceExclusiveLite(&Header->SecurityLock, TRUE);
- }
- else
- {
- Status = ExAcquireResourceSharedLite(&Header->SecurityLock, TRUE);
- }
-}
-
-/*
- @implemented
-*/
-KSDDKAPI
-VOID
-NTAPI
-KsReleaseDeviceSecurityLock(
- IN KSDEVICE_HEADER DevHeader)
-{
- PKSIDEVICE_HEADER Header = (PKSIDEVICE_HEADER)DevHeader;
-
- ExReleaseResourceLite(&Header->SecurityLock);
- KeLeaveCriticalRegion();
-}
-
diff --git a/reactos/drivers/ksfilter/ks/pin.c b/reactos/drivers/ksfilter/ks/pin.c
new file mode 100644
index 00000000000..1a1ef8d3c07
--- /dev/null
+++ b/reactos/drivers/ksfilter/ks/pin.c
@@ -0,0 +1,521 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/worker.c
+ * PURPOSE: KS pin functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
+#include "priv.h"
+
+/*
+ @unimplemented
+*/
+VOID
+NTAPI
+KsPinAcquireProcessingMutex(
+ IN PKSPIN Pin)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+VOID
+NTAPI
+KsPinAttachAndGate(
+ IN PKSPIN Pin,
+ IN PKSGATE AndGate OPTIONAL)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+VOID
+NTAPI
+KsPinAttachOrGate(
+ IN PKSPIN Pin,
+ IN PKSGATE OrGate OPTIONAL)
+{
+ UNIMPLEMENTED
+}
+/*
+ @unimplemented
+*/
+VOID
+NTAPI
+KsPinAttemptProcessing(
+ IN PKSPIN Pin,
+ IN BOOLEAN Asynchronous)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+NTSTATUS
+NTAPI
+KsPinGetAvailableByteCount(
+ IN PKSPIN Pin,
+ OUT PLONG InputDataBytes OPTIONAL,
+ OUT PLONG OutputBufferBytes OPTIONAL)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ @unimplemented
+*/
+NTSTATUS
+NTAPI
+KsPinGetConnectedFilterInterface(
+ IN PKSPIN Pin,
+ IN const GUID* InterfaceId,
+ OUT PVOID* Interface)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ @unimplemented
+*/
+PKSGATE
+NTAPI
+KsPinGetAndGate(
+ IN PKSPIN Pin)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+PDEVICE_OBJECT
+NTAPI
+KsPinGetConnectedPinDeviceObject(
+ IN PKSPIN Pin)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+PFILE_OBJECT
+NTAPI
+KsPinGetConnectedPinFileObject(
+ IN PKSPIN Pin)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+NTSTATUS
+NTAPI
+KsPinGetConnectedPinInterface(
+ IN PKSPIN Pin,
+ IN const GUID* InterfaceId,
+ OUT PVOID* Interface)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+VOID
+NTAPI
+KsPinGetCopyRelationships(
+ IN PKSPIN Pin,
+ OUT PKSPIN* CopySource,
+ OUT PKSPIN* DelegateBranch)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+PKSPIN
+NTAPI
+KsPinGetNextSiblingPin(
+ IN PKSPIN Pin)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+PKSFILTER
+NTAPI
+KsPinGetParentFilter(
+ IN PKSPIN Pin)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+NTSTATUS
+NTAPI
+ KsPinGetReferenceClockInterface(
+ IN PKSPIN Pin,
+ OUT PIKSREFERENCECLOCK* Interface)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+VOID
+NTAPI
+KsPinRegisterFrameReturnCallback(
+ IN PKSPIN Pin,
+ IN PFNKSPINFRAMERETURN FrameReturn)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+VOID
+NTAPI
+KsPinRegisterHandshakeCallback(
+ IN PKSPIN Pin,
+ IN PFNKSPINHANDSHAKE Handshake)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+VOID
+NTAPI
+KsPinRegisterIrpCompletionCallback(
+ IN PKSPIN Pin,
+ IN PFNKSPINIRPCOMPLETION IrpCompletion)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+VOID
+NTAPI
+KsPinRegisterPowerCallbacks(
+ IN PKSPIN Pin,
+ IN PFNKSPINPOWER Sleep OPTIONAL,
+ IN PFNKSPINPOWER Wake OPTIONAL)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+VOID
+NTAPI
+KsPinReleaseProcessingMutex(
+ IN PKSPIN Pin)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+VOID
+NTAPI
+KsPinSetPinClockTime(
+ IN PKSPIN Pin,
+ IN LONGLONG Time)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+NTSTATUS
+NTAPI
+KsPinSubmitFrame(
+ IN PKSPIN Pin,
+ IN PVOID Data OPTIONAL,
+ IN ULONG Size OPTIONAL,
+ IN PKSSTREAM_HEADER StreamHeader OPTIONAL,
+ IN PVOID Context OPTIONAL)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsPinSubmitFrameMdl(
+ IN PKSPIN Pin,
+ IN PMDL Mdl OPTIONAL,
+ IN PKSSTREAM_HEADER StreamHeader OPTIONAL,
+ IN PVOID Context OPTIONAL)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+BOOLEAN
+NTAPI
+KsProcessPinUpdate(
+ IN PKSPROCESSPIN ProcessPin)
+{
+ UNIMPLEMENTED
+ return FALSE;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+PKSSTREAM_POINTER
+NTAPI
+KsPinGetLeadingEdgeStreamPointer(
+ IN PKSPIN Pin,
+ IN KSSTREAM_POINTER_STATE State)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+PKSSTREAM_POINTER
+NTAPI
+KsPinGetTrailingEdgeStreamPointer(
+ IN PKSPIN Pin,
+ IN KSSTREAM_POINTER_STATE State)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsStreamPointerSetStatusCode(
+ IN PKSSTREAM_POINTER StreamPointer,
+ IN NTSTATUS Status)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsStreamPointerLock(
+ IN PKSSTREAM_POINTER StreamPointer)
+{
+ UNIMPLEMENTED
+ return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsStreamPointerUnlock(
+ IN PKSSTREAM_POINTER StreamPointer,
+ IN BOOLEAN Eject)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsStreamPointerAdvanceOffsetsAndUnlock(
+ IN PKSSTREAM_POINTER StreamPointer,
+ IN ULONG InUsed,
+ IN ULONG OutUsed,
+ IN BOOLEAN Eject)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsStreamPointerDelete(
+ IN PKSSTREAM_POINTER StreamPointer)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsStreamPointerClone(
+ IN PKSSTREAM_POINTER StreamPointer,
+ IN PFNKSSTREAMPOINTER CancelCallback OPTIONAL,
+ IN ULONG ContextSize,
+ OUT PKSSTREAM_POINTER* CloneStreamPointer)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsStreamPointerAdvanceOffsets(
+ IN PKSSTREAM_POINTER StreamPointer,
+ IN ULONG InUsed,
+ IN ULONG OutUsed,
+ IN BOOLEAN Eject)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsStreamPointerAdvance(
+ IN PKSSTREAM_POINTER StreamPointer)
+{
+ UNIMPLEMENTED
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+PMDL
+NTAPI
+KsStreamPointerGetMdl(
+ IN PKSSTREAM_POINTER StreamPointer)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+PIRP
+NTAPI
+KsStreamPointerGetIrp(
+ IN PKSSTREAM_POINTER StreamPointer,
+ OUT PBOOLEAN FirstFrameInIrp OPTIONAL,
+ OUT PBOOLEAN LastFrameInIrp OPTIONAL)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsStreamPointerScheduleTimeout(
+ IN PKSSTREAM_POINTER StreamPointer,
+ IN PFNKSSTREAMPOINTER Callback,
+ IN ULONGLONG Interval)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsStreamPointerCancelTimeout(
+ IN PKSSTREAM_POINTER StreamPointer)
+{
+ UNIMPLEMENTED
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+PKSSTREAM_POINTER
+NTAPI
+KsPinGetFirstCloneStreamPointer(
+ IN PKSPIN Pin)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
+
+/*
+ @unimplemented
+*/
+KSDDKAPI
+PKSSTREAM_POINTER
+NTAPI
+KsStreamPointerGetNextClone(
+ IN PKSSTREAM_POINTER StreamPointer)
+{
+ UNIMPLEMENTED
+ return NULL;
+}
diff --git a/reactos/drivers/ksfilter/ks/priv.h b/reactos/drivers/ksfilter/ks/priv.h
index 44f04149b6d..3ee1033e3eb 100644
--- a/reactos/drivers/ksfilter/ks/priv.h
+++ b/reactos/drivers/ksfilter/ks/priv.h
@@ -1,6 +1,8 @@
#ifndef PRIV_H__
#define PRIV_H__
+#define _KSDDK_
+
#include
#include
#define NDEBUG
@@ -8,6 +10,8 @@
#include
#include
#include
+#include
+#include
#include "ksfunc.h"
#include "kstypes.h"
@@ -18,4 +22,22 @@
#define IOCTL_KS_OBJECT_CLASS CTL_CODE(FILE_DEVICE_KS, 0x7, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\
+ PropGeneral, PropInstances, PropIntersection)\
+DEFINE_KSPROPERTY_TABLE(PinSet) {\
+ DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
+ DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
+ DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
+ DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
+ DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
+ DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
+ DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
+ DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
+ DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
+ DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\
+ DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral),\
+ DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(PropGeneral)\
+}
+
#endif
diff --git a/reactos/drivers/ksfilter/ks/properties.c b/reactos/drivers/ksfilter/ks/property.c
similarity index 67%
rename from reactos/drivers/ksfilter/ks/properties.c
rename to reactos/drivers/ksfilter/ks/property.c
index 44ee640f536..f53329de679 100644
--- a/reactos/drivers/ksfilter/ks/properties.c
+++ b/reactos/drivers/ksfilter/ks/property.c
@@ -1,31 +1,19 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/event.c
+ * PURPOSE: KS property handling functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
#include "priv.h"
-/* ===============================================================
- Property Functions
-*/
-
/*
@unimplemented
*/
-KSDDKAPI BOOLEAN NTAPI
-KsFastPropertyHandler(
- IN PFILE_OBJECT FileObject,
- IN PKSPROPERTY UNALIGNED Property,
- IN ULONG PropertyLength,
- IN OUT PVOID UNALIGNED Data,
- IN ULONG DataLength,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN ULONG PropertySetsCount,
- IN const KSPROPERTY_SET* PropertySet)
-{
- UNIMPLEMENTED;
- return FALSE;
-}
-
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsPropertyHandler(
IN PIRP Irp,
IN ULONG PropertySetsCount,
@@ -35,10 +23,13 @@ KsPropertyHandler(
return STATUS_UNSUCCESSFUL;
}
+
/*
@unimplemented
*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsPropertyHandlerWithAllocator(
IN PIRP Irp,
IN ULONG PropertySetsCount,
@@ -53,12 +44,19 @@ KsPropertyHandlerWithAllocator(
/*
@unimplemented
*/
-KSDDKAPI NTSTATUS NTAPI
-KsUnserializeObjectPropertiesFromRegistry(
+KSDDKAPI
+BOOLEAN
+NTAPI
+KsFastPropertyHandler(
IN PFILE_OBJECT FileObject,
- IN HANDLE ParentKey OPTIONAL,
- IN PUNICODE_STRING RegistryPath OPTIONAL)
+ IN PKSPROPERTY UNALIGNED Property,
+ IN ULONG PropertyLength,
+ IN OUT PVOID UNALIGNED Data,
+ IN ULONG DataLength,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN ULONG PropertySetsCount,
+ IN const KSPROPERTY_SET* PropertySet)
{
UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ return FALSE;
}
diff --git a/reactos/drivers/ksfilter/ks/topology.c b/reactos/drivers/ksfilter/ks/topology.c
index 21404d1b34e..3b3f34020a5 100644
--- a/reactos/drivers/ksfilter/ks/topology.c
+++ b/reactos/drivers/ksfilter/ks/topology.c
@@ -1,8 +1,14 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/topoology.c
+ * PURPOSE: KS Allocator functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
#include "priv.h"
-/* ===============================================================
- Topology Functions
-*/
NTSTATUS
NTAPI
@@ -19,24 +25,33 @@ KspCreateObjectType(
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING Name;
- Name.Length = (wcslen(ObjectType) + 1) * sizeof(WCHAR) + CreateParametersSize;
+ /* calculate request length */
+ Name.Length = 0;
+ Name.MaximumLength = wcslen(ObjectType) * sizeof(WCHAR) + CreateParametersSize + 2 * sizeof(WCHAR);
Name.MaximumLength += sizeof(WCHAR);
+ /* acquire request buffer */
Name.Buffer = ExAllocatePool(NonPagedPool, Name.MaximumLength);
-
+ /* check for success */
if (!Name.Buffer)
{
+ /* insufficient resources */
return STATUS_INSUFFICIENT_RESOURCES;
}
- wcscpy(Name.Buffer, ObjectType);
- Name.Buffer[wcslen(ObjectType)] = '\\';
-
- RtlMoveMemory(Name.Buffer + wcslen(ObjectType) +1, CreateParameters, CreateParametersSize);
-
+ /* build a request which looks like \{ObjectClass}\CreateParameters
+ * For pins the parent is the reference string used in registration
+ * For clocks it is full path for pin\{ClockGuid}\ClockCreateParams
+ */
+ RtlAppendUnicodeToString(&Name, L"\\");
+ RtlAppendUnicodeToString(&Name, ObjectType);
+ RtlAppendUnicodeToString(&Name, L"\\");
+ /* append create parameters */
+ RtlMoveMemory(Name.Buffer + (Name.Length / sizeof(WCHAR)), CreateParameters, CreateParametersSize);
+ Name.Length += CreateParametersSize;
Name.Buffer[Name.Length / 2] = L'\0';
+
InitializeObjectAttributes(&ObjectAttributes, &Name, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE | OBJ_OPENIF, ParentHandle, NULL);
-
-
+ /* create the instance */
Status = IoCreateFile(NodeHandle,
DesiredAccess,
&ObjectAttributes,
@@ -45,15 +60,15 @@ KspCreateObjectType(
0,
0,
FILE_OPEN,
- FILE_SYNCHRONOUS_IO_NONALERT,
+ 0,
NULL,
0,
CreateFileTypeNone,
NULL,
IO_NO_PARAMETER_CHECKING | IO_FORCE_ACCESS_CHECK);
- // HACK HACK HACK HACK
- //ExFreePool(Name.Buffer);
+ /* free request buffer */
+ ExFreePool(Name.Buffer);
return Status;
}
@@ -69,7 +84,7 @@ KsCreateTopologyNode(
OUT PHANDLE NodeHandle)
{
return KspCreateObjectType(ParentHandle,
- L"{0621061A-EE75-11D0-B915-00A0C9223196}",
+ KSSTRING_TopologyNode,
(PVOID)NodeCreate,
sizeof(KSNODE_CREATE),
DesiredAccess,
@@ -77,16 +92,47 @@ KsCreateTopologyNode(
}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsValidateTopologyNodeCreateRequest(
IN PIRP Irp,
IN PKSTOPOLOGY Topology,
- OUT PKSNODE_CREATE* NodeCreate)
+ OUT PKSNODE_CREATE* OutNodeCreate)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ PKSNODE_CREATE NodeCreate;
+ ULONG Size;
+ NTSTATUS Status;
+
+ /* did the caller miss the topology */
+ if (!Topology)
+ return STATUS_INVALID_PARAMETER;
+
+ /* set create param size */
+ Size = sizeof(KSNODE_CREATE);
+
+ /* fetch create parameters */
+ Status = KspCopyCreateRequest(Irp,
+ KSSTRING_TopologyNode,
+ &Size,
+ (PVOID*)&NodeCreate);
+
+ if (!NT_SUCCESS(Status))
+ return Status;
+
+ if (NodeCreate->CreateFlags != 0 || (NodeCreate->Node >= Topology->TopologyNodesCount && NodeCreate->Node != (ULONG)-1))
+ {
+ /* invalid node create */
+ FreeItem(NodeCreate);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* store result */
+ *OutNodeCreate = NodeCreate;
+
+ return Status;
}
/*
@@ -259,3 +305,14 @@ KsTopologyPropertyHandler(
return Status;
}
+
+NTSTATUS
+NTAPI
+KspTopologyPropertyHandler(
+ IN PIRP Irp,
+ IN PKSIDENTIFIER Request,
+ IN OUT PVOID Data)
+{
+
+ return STATUS_NOT_IMPLEMENTED;
+}
diff --git a/reactos/drivers/ksfilter/ks/worker.c b/reactos/drivers/ksfilter/ks/worker.c
index 426859963ad..12835ac441a 100644
--- a/reactos/drivers/ksfilter/ks/worker.c
+++ b/reactos/drivers/ksfilter/ks/worker.c
@@ -1,3 +1,12 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/worker.c
+ * PURPOSE: KS Allocator functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
#include "priv.h"
/* ===============================================================
@@ -6,14 +15,64 @@
typedef struct
{
+ WORK_QUEUE_ITEM WorkItem;
+
KEVENT Event;
KSPIN_LOCK Lock;
WORK_QUEUE_TYPE Type;
LONG Counter;
+ LONG QueuedWorkItemCount;
+ LIST_ENTRY QueuedWorkItems;
+
+ PWORK_QUEUE_ITEM CountedWorkItem;
+}KSIWORKER, *PKSIWORKER;
+
+VOID
+NTAPI
+WorkItemRoutine(
+ IN PVOID Context)
+{
+ PKSIWORKER KsWorker;
+ KIRQL OldLevel;
PWORK_QUEUE_ITEM WorkItem;
- ULONG WorkItemActive;
- ULONG DeleteInProgress;
-}KS_WORKER;
+ PLIST_ENTRY Entry;
+
+
+ /* get ks worker implementation */
+ KsWorker = (PKSIWORKER)Context;
+
+ /* acquire back the lock */
+ KeAcquireSpinLock(&KsWorker->Lock, &OldLevel);
+
+ do
+ {
+ /* remove first entry */
+ Entry = RemoveHeadList(&KsWorker->QueuedWorkItems);
+ /* get offset to work item */
+ WorkItem = (PWORK_QUEUE_ITEM)CONTAINING_RECORD(Entry, WORK_QUEUE_ITEM, List);
+
+ /* release lock as the callback might call one KsWorker functions */
+ KeReleaseSpinLock(&KsWorker->Lock, OldLevel);
+
+ /* now dispatch the work */
+ WorkItem->WorkerRoutine(WorkItem->Parameter);
+
+ /* acquire back the lock */
+ KeAcquireSpinLock(&KsWorker->Lock, &OldLevel);
+
+ /* decrement queued work item count */
+ InterlockedDecrement(&KsWorker->QueuedWorkItemCount);
+
+ }while(KsWorker->QueuedWorkItemCount);
+
+ /* release the lock */
+ KeReleaseSpinLock(&KsWorker->Lock, OldLevel);
+
+ /* signal completion event */
+ KeSetEvent(&KsWorker->Event, IO_NO_INCREMENT, FALSE);
+
+}
+
/*
@implemented
@@ -25,8 +84,8 @@ KsRegisterWorker(
IN WORK_QUEUE_TYPE WorkQueueType,
OUT PKSWORKER* Worker)
{
- KS_WORKER * KsWorker;
- UNIMPLEMENTED;
+ PKSIWORKER KsWorker;
+
if (WorkQueueType != CriticalWorkQueue &&
WorkQueueType != DelayedWorkQueue &&
@@ -35,16 +94,22 @@ KsRegisterWorker(
return STATUS_INVALID_PARAMETER;
}
- KsWorker = ExAllocatePool(NonPagedPool, sizeof(KS_WORKER));
+ /* allocate worker context */
+ KsWorker = ExAllocatePool(NonPagedPool, sizeof(KSIWORKER));
if (!KsWorker)
return STATUS_INSUFFICIENT_RESOURCES;
+ /* initialze the work ctx */
+ ExInitializeWorkItem(&KsWorker->WorkItem, WorkItemRoutine, (PVOID)KsWorker);
+ /* setup type */
KsWorker->Type = WorkQueueType;
+ /* set counter to zero */
KsWorker->Counter = 0;
- KsWorker->WorkItemActive = 0;
- KsWorker->WorkItem = NULL;
- KsWorker->DeleteInProgress = FALSE;
+ /* Initialize work item queue */
+ InitializeListHead(&KsWorker->QueuedWorkItems);
+ /* initialize work item lock */
KeInitializeSpinLock(&KsWorker->Lock);
+ /* initialize event */
KeInitializeEvent(&KsWorker->Event, NotificationEvent, FALSE);
*Worker = KsWorker;
@@ -54,53 +119,68 @@ KsRegisterWorker(
/*
@implemented
*/
-KSDDKAPI VOID NTAPI
+KSDDKAPI
+VOID
+NTAPI
KsUnregisterWorker(
IN PKSWORKER Worker)
{
- KS_WORKER * KsWorker;
+ PKSIWORKER KsWorker;
KIRQL OldIrql;
if (!Worker)
return;
- KsWorker = (KS_WORKER *)Worker;
-
+ /* get ks worker implementation */
+ KsWorker = (PKSIWORKER)Worker;
+ /* acquire spinlock */
KeAcquireSpinLock(&KsWorker->Lock, &OldIrql);
-
- KsWorker->DeleteInProgress = TRUE;
-
- if (KsWorker->WorkItemActive)
+ /* fake status running to avoid work items to be queued by the counted worker */
+ KsWorker->Counter = 1;
+ /* is there currently a work item active */
+ if (KsWorker->QueuedWorkItemCount)
{
+ /* release the lock */
KeReleaseSpinLock(&KsWorker->Lock, OldIrql);
+ /* wait for the worker routine to finish */
KeWaitForSingleObject(&KsWorker->Event, Executive, KernelMode, FALSE, NULL);
}
else
{
+ /* no work item active, just release the lock */
KeReleaseSpinLock(&KsWorker->Lock, OldIrql);
}
-
- ExFreePool(KsWorker);
+ /* free worker context */
+ FreeItem(KsWorker);
}
/*
@implemented
*/
-KSDDKAPI NTSTATUS NTAPI
+KSDDKAPI
+NTSTATUS
+NTAPI
KsRegisterCountedWorker(
IN WORK_QUEUE_TYPE WorkQueueType,
IN PWORK_QUEUE_ITEM CountedWorkItem,
OUT PKSWORKER* Worker)
{
NTSTATUS Status;
- KS_WORKER * KsWorker;
+ PKSIWORKER KsWorker;
+ /* check for counted work item parameter */
+ if (!CountedWorkItem)
+ return STATUS_INVALID_PARAMETER_2;
+
+ /* create the work ctx */
Status = KsRegisterWorker(WorkQueueType, Worker);
-
+ /* check for success */
if (NT_SUCCESS(Status))
{
- KsWorker = (KS_WORKER *)Worker;
- KsWorker->WorkItem = CountedWorkItem;
+ /* get ks worker implementation */
+ KsWorker = (PKSIWORKER)Worker;
+ /* store counted work item */
+ KsWorker->CountedWorkItem = CountedWorkItem;
}
return Status;
@@ -115,21 +195,18 @@ NTAPI
KsDecrementCountedWorker(
IN PKSWORKER Worker)
{
- KS_WORKER * KsWorker;
+ PKSIWORKER KsWorker;
LONG Counter;
+ /* did the caller pass a work ctx */
if (!Worker)
return STATUS_INVALID_PARAMETER;
- KsWorker = (KS_WORKER *)Worker;
+ /* get ks worker implementation */
+ KsWorker = (PKSIWORKER)Worker;
+ /* decrement counter */
Counter = InterlockedDecrement(&KsWorker->Counter);
-
- if (KsWorker->DeleteInProgress)
- {
- /* signal that we are done */
- KeSetEvent(&KsWorker->Event, 0, 0);
- }
-
+ /* return result */
return Counter;
}
@@ -142,19 +219,24 @@ NTAPI
KsIncrementCountedWorker(
IN PKSWORKER Worker)
{
- KS_WORKER * KsWorker;
+ PKSIWORKER KsWorker;
LONG Counter;
+ /* did the caller pass a work ctx */
if (!Worker)
return STATUS_INVALID_PARAMETER;
- KsWorker = (KS_WORKER *)Worker;
-
+ /* get ks worker implementation */
+ KsWorker = (PKSIWORKER)Worker;
+ /* increment counter */
Counter = InterlockedIncrement(&KsWorker->Counter);
if (Counter == 1)
{
- KsQueueWorkItem(Worker, KsWorker->WorkItem);
+ /* this is the first work item in list, so queue a real work item */
+ KsQueueWorkItem(Worker, KsWorker->CountedWorkItem);
}
+
+ /* return current counter */
return Counter;
}
@@ -168,25 +250,31 @@ KsQueueWorkItem(
IN PKSWORKER Worker,
IN PWORK_QUEUE_ITEM WorkItem)
{
- KS_WORKER * KsWorker;
+ PKSIWORKER KsWorker;
KIRQL OldIrql;
- NTSTATUS Status = STATUS_SUCCESS;
+ /* check for all parameters */
if (!Worker || !WorkItem)
return STATUS_INVALID_PARAMETER;
- KsWorker = (KS_WORKER *)Worker;
+ /* get ks worker implementation */
+ KsWorker = (PKSIWORKER)Worker;
+ /* lock the work queue */
KeAcquireSpinLock(&KsWorker->Lock, &OldIrql);
-
- if (!KsWorker->DeleteInProgress)
+ /* insert work item to list */
+ InsertTailList(&KsWorker->QueuedWorkItems, &WorkItem->List);
+ /* increment active count */
+ InterlockedIncrement(&KsWorker->QueuedWorkItemCount);
+ /* is this the first work item */
+ if (KsWorker->QueuedWorkItemCount == 1)
{
+ /* clear event */
+ KeClearEvent(&KsWorker->Event);
+ /* it is, queue it */
ExQueueWorkItem(WorkItem, KsWorker->Type);
}
- else
- {
- Status = STATUS_UNSUCCESSFUL;
- }
-
+ /* release lock */
KeReleaseSpinLock(&KsWorker->Lock, OldIrql);
- return Status;
+
+ return STATUS_SUCCESS;
}
diff --git a/reactos/drivers/network/afd/afd/info.c b/reactos/drivers/network/afd/afd/info.c
index 561235634d3..4af2d8595e3 100644
--- a/reactos/drivers/network/afd/afd/info.c
+++ b/reactos/drivers/network/afd/afd/info.c
@@ -69,6 +69,35 @@ AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
}
+NTSTATUS NTAPI
+AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
+ PIO_STACK_LOCATION IrpSp ) {
+ NTSTATUS Status = STATUS_SUCCESS;
+ PAFD_INFO InfoReq = IrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
+ PFILE_OBJECT FileObject = IrpSp->FileObject;
+ PAFD_FCB FCB = FileObject->FsContext;
+
+ if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
+
+ _SEH2_TRY {
+ switch (InfoReq->InformationClass) {
+ case AFD_INFO_BLOCKING_MODE:
+ AFD_DbgPrint(MID_TRACE,("Blocking mode set to %d\n", InfoReq->Information.Ulong));
+ FCB->BlockingMode = InfoReq->Information.Ulong;
+ break;
+ default:
+ AFD_DbgPrint(MIN_TRACE,("Unknown request %d\n", InfoReq->InformationClass));
+ break;
+ }
+ } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
+ Status = STATUS_INVALID_PARAMETER;
+ } _SEH2_END;
+
+ AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
+
+ return UnlockAndMaybeComplete(FCB, Status, Irp, 0);
+}
+
NTSTATUS NTAPI
AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp ) {
diff --git a/reactos/drivers/network/afd/afd/lock.c b/reactos/drivers/network/afd/afd/lock.c
index 80ce7aed975..b8e66d28638 100644
--- a/reactos/drivers/network/afd/afd/lock.c
+++ b/reactos/drivers/network/afd/afd/lock.c
@@ -73,13 +73,14 @@ PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
UINT Size = sizeof(AFD_WSABUF) * (Count + Lock);
PAFD_WSABUF NewBuf = ExAllocatePool( PagedPool, Size * 2 );
BOOLEAN LockFailed = FALSE;
+ PAFD_MAPBUF MapBuf;
AFD_DbgPrint(MID_TRACE,("Called(%08x)\n", NewBuf));
if( NewBuf ) {
RtlZeroMemory(NewBuf, Size * 2);
- PAFD_MAPBUF MapBuf = (PAFD_MAPBUF)(NewBuf + Count + Lock);
+ MapBuf = (PAFD_MAPBUF)(NewBuf + Count + Lock);
_SEH2_TRY {
RtlCopyMemory( NewBuf, Buf, sizeof(AFD_WSABUF) * Count );
diff --git a/reactos/drivers/network/afd/afd/main.c b/reactos/drivers/network/afd/afd/main.c
index 6ae20cae1fd..fd8d2b6eb5d 100644
--- a/reactos/drivers/network/afd/afd/main.c
+++ b/reactos/drivers/network/afd/afd/main.c
@@ -422,6 +422,9 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
case IOCTL_AFD_GET_INFO:
return AfdGetInfo( DeviceObject, Irp, IrpSp );
+ case IOCTL_AFD_SET_INFO:
+ return AfdSetInfo( DeviceObject, Irp, IrpSp );
+
case IOCTL_AFD_GET_CONTEXT:
return AfdGetContext( DeviceObject, Irp, IrpSp );
@@ -447,10 +450,6 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_TDI_HANDLES\n"));
break;
- case IOCTL_AFD_SET_INFO:
- AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_INFO\n"));
- break;
-
case IOCTL_AFD_SET_CONNECT_DATA:
AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_DATA\n"));
break;
diff --git a/reactos/drivers/network/afd/include/afd.h b/reactos/drivers/network/afd/include/afd.h
index f0f806d2811..fd707b9ce26 100644
--- a/reactos/drivers/network/afd/include/afd.h
+++ b/reactos/drivers/network/afd/include/afd.h
@@ -178,7 +178,7 @@ typedef struct _AFD_STORED_DATAGRAM {
typedef struct _AFD_FCB {
BOOLEAN Locked, Critical, Overread;
- UINT State, Flags;
+ UINT State, Flags, BlockingMode;
KIRQL OldIrql;
UINT LockCount;
PVOID CurrentThread;
@@ -236,6 +236,10 @@ NTSTATUS NTAPI
AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
+NTSTATUS NTAPI
+AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
+ PIO_STACK_LOCATION IrpSp );
+
NTSTATUS NTAPI
AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp );
diff --git a/reactos/drivers/network/dd/ne2000/ne2000/8390.c b/reactos/drivers/network/dd/ne2000/ne2000/8390.c
index 69eb7f49b08..f5e33b9de39 100644
--- a/reactos/drivers/network/dd/ne2000/ne2000/8390.c
+++ b/reactos/drivers/network/dd/ne2000/ne2000/8390.c
@@ -266,9 +266,9 @@ static BOOLEAN NICReadSAPROM(
for (i = 0; i < 16; i++)
Adapter->SAPROM[i] = Buffer[i * 2];
- /* Copy the station address */
+ /* Copy the permanent address */
NdisMoveMemory(
- (PVOID)&Adapter->StationAddress,
+ (PVOID)&Adapter->PermanentAddress,
(PVOID)&Adapter->SAPROM,
DRIVER_LENGTH_OF_ADDRESS);
diff --git a/reactos/drivers/network/dd/ne2000/ne2000/main.c b/reactos/drivers/network/dd/ne2000/ne2000/main.c
index 800274e1d43..295b797a4da 100644
--- a/reactos/drivers/network/dd/ne2000/ne2000/main.c
+++ b/reactos/drivers/network/dd/ne2000/ne2000/main.c
@@ -373,7 +373,7 @@ static NDIS_STATUS NTAPI MiniportInitialize(
NdisCloseConfiguration(ConfigurationHandle);
}
- if (Status != NDIS_STATUS_SUCCESS)
+ if (Status != NDIS_STATUS_SUCCESS || RegNetworkAddressLength != DRIVER_LENGTH_OF_ADDRESS)
{
int i;
for (i = 0; i < DRIVER_LENGTH_OF_ADDRESS; i++)
diff --git a/reactos/drivers/network/dd/pcnet/pcnet.c b/reactos/drivers/network/dd/pcnet/pcnet.c
index ee8a0f72fb3..a89d45ecbc2 100644
--- a/reactos/drivers/network/dd/pcnet/pcnet.c
+++ b/reactos/drivers/network/dd/pcnet/pcnet.c
@@ -607,12 +607,18 @@ MiSyncMediaDetection(
{
PADAPTER Adapter = (PADAPTER)SynchronizeContext;
NDIS_MEDIA_STATE MediaState = MiGetMediaState(Adapter);
+ UINT MediaSpeed = MiGetMediaSpeed(Adapter);
+ BOOLEAN FullDuplex = MiGetMediaDuplex(Adapter);
DPRINT("Called\n");
DPRINT("MediaState: %d\n", MediaState);
- if (MediaState != Adapter->MediaState)
+ if (MediaState != Adapter->MediaState ||
+ MediaSpeed != Adapter->MediaSpeed ||
+ FullDuplex != Adapter->FullDuplex)
{
Adapter->MediaState = MediaState;
+ Adapter->MediaSpeed = MediaSpeed;
+ Adapter->FullDuplex = FullDuplex;
return TRUE;
}
return FALSE;
@@ -721,10 +727,29 @@ MiInitChip(
NdisRawWritePortUshort(Adapter->PortOffset + RAP, CSR0);
NdisRawWritePortUshort(Adapter->PortOffset + RDP, CSR0_STRT|CSR0_INIT|CSR0_IENA);
- /* detect the media state */
+ /* Allow LED programming */
+ NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR2);
+ NdisRawWritePortUshort(Adapter->PortOffset + BDP, BCR2_LEDPE);
+
+ /* LED0 is configured for link status (on = up, off = down) */
NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR4);
- NdisRawWritePortUshort(Adapter->PortOffset + BDP, BCR4_LNKSTE|BCR4_FDLSE);
+ NdisRawWritePortUshort(Adapter->PortOffset + BDP, BCR4_LNKSTE | BCR4_PSE);
+
+ /* LED1 is configured for link duplex (on = full, off = half) */
+ NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR5);
+ NdisRawWritePortUshort(Adapter->PortOffset + BDP, BCR5_FDLSE | BCR5_PSE);
+
+ /* LED2 is configured for link speed (on = 100M, off = 10M) */
+ NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR6);
+ NdisRawWritePortUshort(Adapter->PortOffset + BDP, BCR6_E100 | BCR6_PSE);
+
+ /* LED3 is configured for trasmit/receive activity */
+ NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR7);
+ NdisRawWritePortUshort(Adapter->PortOffset + BDP, BCR7_XMTE | BCR7_RCVE | BCR7_PSE);
+
Adapter->MediaState = MiGetMediaState(Adapter);
+ Adapter->FullDuplex = MiGetMediaDuplex(Adapter);
+ Adapter->MediaSpeed = MiGetMediaSpeed(Adapter);
DPRINT("card started\n");
@@ -1240,6 +1265,30 @@ MiSetMulticast(
return NDIS_STATUS_SUCCESS;
}
+BOOLEAN
+NTAPI
+MiGetMediaDuplex(PADAPTER Adapter)
+{
+ ULONG Data;
+
+ NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR5);
+ NdisRawReadPortUshort(Adapter->PortOffset + BDP, &Data);
+
+ return Data & BCR5_LEDOUT;
+}
+
+UINT
+NTAPI
+MiGetMediaSpeed(PADAPTER Adapter)
+{
+ ULONG Data;
+
+ NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR4);
+ NdisRawReadPortUshort(Adapter->PortOffset + BDP, &Data);
+
+ return Data & BCR6_LEDOUT ? 100 : 10;
+}
+
NDIS_MEDIA_STATE
NTAPI
MiGetMediaState(PADAPTER Adapter)
diff --git a/reactos/drivers/network/dd/pcnet/pcnet.h b/reactos/drivers/network/dd/pcnet/pcnet.h
index 54abdfa9ea9..818b055cb04 100644
--- a/reactos/drivers/network/dd/pcnet/pcnet.h
+++ b/reactos/drivers/network/dd/pcnet/pcnet.h
@@ -60,6 +60,8 @@ typedef struct _ADAPTER
ULONG_PTR PortOffset;
NDIS_MINIPORT_INTERRUPT InterruptObject;
NDIS_MEDIA_STATE MediaState;
+ UINT MediaSpeed;
+ BOOLEAN FullDuplex;
NDIS_MINIPORT_TIMER MediaDetectionTimer;
ULONG CurrentReceiveDescriptorIndex;
ULONG CurrentPacketFilter;
@@ -129,6 +131,14 @@ NDIS_MEDIA_STATE
NTAPI
MiGetMediaState(PADAPTER Adapter);
+UINT
+NTAPI
+MiGetMediaSpeed(PADAPTER Adapter);
+
+BOOLEAN
+NTAPI
+MiGetMediaDuplex(PADAPTER Adapter);
+
/* operational constants */
#define NUMBER_OF_BUFFERS 0x20
#define LOG_NUMBER_OF_BUFFERS 5 /* log2(NUMBER_OF_BUFFERS) */
diff --git a/reactos/drivers/network/dd/pcnet/pcnethw.h b/reactos/drivers/network/dd/pcnet/pcnethw.h
index d961ad2996a..7fe4d10b6d4 100644
--- a/reactos/drivers/network/dd/pcnet/pcnethw.h
+++ b/reactos/drivers/network/dd/pcnet/pcnethw.h
@@ -250,6 +250,7 @@
#define BCR2_DXCVRCTL 0x20 /* dxcvr control */
#define BCR2_INTLEVEL 0x80 /* interrupt level/edge */
#define BCR2_APROMWE 0x100 /* address prom write enable */
+#define BCR2_LEDPE 0x1000 /* LED programming enable */
#define BCR2_TMAULOOP 0x4000 /* t-mau transmit on loopback */
/* BCR4 bits */
@@ -263,6 +264,7 @@
#define BCR4_PSE 0x80 /* pulse stretcher enable */
#define BCR4_FDLSE 0x100 /* full-duplex link status enable */
#define BCR4_MPSE 0x200 /* magic packet status enable */
+#define BCR4_E100 0x1000 /* link speed */
#define BCR4_LEDDIS 0x2000 /* led disable */
#define BCR4_LEDPOL 0x4000 /* led polarity */
#define BCR4_LEDOUT 0x8000 /* led output pin value */
@@ -278,6 +280,7 @@
#define BCR5_PSE 0x80 /* pulse stretcher enable */
#define BCR5_FDLSE 0x100 /* full-duplex link status enable */
#define BCR5_MPSE 0x200 /* magic packet status enable */
+#define BCR5_E100 0x1000 /* link speed */
#define BCR5_LEDDIS 0x2000 /* led disable */
#define BCR5_LEDPOL 0x4000 /* led polarity */
#define BCR5_LEDOUT 0x8000 /* led output pin value */
@@ -293,6 +296,7 @@
#define BCR6_PSE 0x80 /* pulse stretcher enable */
#define BCR6_FDLSE 0x100 /* full-duplex link status enable */
#define BCR6_MPSE 0x200 /* magic packet status enable */
+#define BCR6_E100 0x1000 /* link speed */
#define BCR6_LEDDIS 0x2000 /* led disable */
#define BCR6_LEDPOL 0x4000 /* led polarity */
#define BCR6_LEDOUT 0x8000 /* led output pin value */
@@ -308,6 +312,7 @@
#define BCR7_PSE 0x80 /* pulse stretcher enable */
#define BCR7_FDLSE 0x100 /* full-duplex link status enable */
#define BCR7_MPSE 0x200 /* magic packet status enable */
+#define BCR7_E100 0x1000 /* link speed */
#define BCR7_LEDDIS 0x2000 /* led disable */
#define BCR7_LEDPOL 0x4000 /* led polarity */
#define BCR7_LEDOUT 0x8000 /* led output pin value */
diff --git a/reactos/drivers/network/dd/pcnet/requests.c b/reactos/drivers/network/dd/pcnet/requests.c
index 6ff06ae9dd3..57810142798 100644
--- a/reactos/drivers/network/dd/pcnet/requests.c
+++ b/reactos/drivers/network/dd/pcnet/requests.c
@@ -139,8 +139,7 @@ MiniportQueryInformation(
case OID_GEN_HARDWARE_STATUS:
{
- /* TODO: implement this... */
- GenericULONG = (ULONG)NdisHardwareStatusReady;
+ GenericULONG = (ULONG)((Adapter->MediaState == NdisMediaStateConnected) ? NdisHardwareStatusReady : NdisHardwareStatusNotReady);
break;
}
@@ -173,7 +172,7 @@ MiniportQueryInformation(
case OID_GEN_LINK_SPEED:
{
- GenericULONG = 100000; /* 10Mbps */
+ GenericULONG = Adapter->MediaSpeed * 10000;
break;
}
diff --git a/reactos/drivers/network/ndis/include/miniport.h b/reactos/drivers/network/ndis/include/miniport.h
index 6461b6b0337..c2d6a4cc98d 100644
--- a/reactos/drivers/network/ndis/include/miniport.h
+++ b/reactos/drivers/network/ndis/include/miniport.h
@@ -188,6 +188,14 @@ MiniIsBusy(
PLOGICAL_ADAPTER Adapter,
NDIS_WORK_ITEM_TYPE Type);
+NDIS_STATUS
+MiniReset(
+ PLOGICAL_ADAPTER Adapter);
+
+VOID
+MiniDoAddressingReset(
+ PLOGICAL_ADAPTER Adapter);
+
#endif /* __MINIPORT_H */
/* EOF */
diff --git a/reactos/drivers/network/ndis/include/ndissys.h b/reactos/drivers/network/ndis/include/ndissys.h
index c02ee26be79..777564569a3 100644
--- a/reactos/drivers/network/ndis/include/ndissys.h
+++ b/reactos/drivers/network/ndis/include/ndissys.h
@@ -28,6 +28,9 @@
#define EXPORT NTAPI
#endif
+/* the version of NDIS we claim to be */
+#define NDIS_VERSION 0x00050000
+
#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
#define NDIS_TAG 0x4e4d4953
diff --git a/reactos/drivers/network/ndis/ndis/config.c b/reactos/drivers/network/ndis/ndis/config.c
index 916c59bb099..f83be9ea291 100644
--- a/reactos/drivers/network/ndis/ndis/config.c
+++ b/reactos/drivers/network/ndis/ndis/config.c
@@ -33,7 +33,6 @@
#include "ndissys.h"
-#define NDIS_VERSION 0x00050001 /* the version of NDIS we claim to be to miniport drivers */
#define PARAMETERS_KEY L"Parameters" /* The parameters subkey under the device-specific key */
/*
@@ -63,15 +62,15 @@ NdisWriteConfiguration(
* I don't know why tho so i free everything before return. comments welcome.
*/
{
- ULONG ParameterType = ParameterValue->ParameterType;
+ ULONG ParameterType;
ULONG DataSize;
PVOID Data;
- WCHAR Buff[25];
+ WCHAR Buff[11];
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
/* reset parameter type to standard reg types */
- switch(ParameterType)
+ switch(ParameterValue->ParameterType)
{
case NdisParameterHexInteger:
case NdisParameterInteger:
@@ -85,8 +84,9 @@ NdisWriteConfiguration(
ParameterType = REG_SZ;
if (!NT_SUCCESS(RtlIntegerToUnicodeString(
ParameterValue->ParameterData.IntegerData,
- (ParameterType == NdisParameterInteger) ? 10 : 16, &Str)))
+ (ParameterValue->ParameterType == NdisParameterInteger) ? 10 : 16, &Str)))
{
+ NDIS_DbgPrint(MIN_TRACE, ("RtlIntegerToUnicodeString failed (%x)\n", *Status));
*Status = NDIS_STATUS_FAILURE;
return;
}
@@ -96,7 +96,7 @@ NdisWriteConfiguration(
break;
case NdisParameterString:
case NdisParameterMultiString:
- ParameterType = REG_SZ;
+ ParameterType = (ParameterValue->ParameterType == NdisParameterString) ? REG_SZ : REG_MULTI_SZ;
Data = ParameterValue->ParameterData.StringData.Buffer;
DataSize = ParameterValue->ParameterData.StringData.Length;
break;
@@ -323,22 +323,11 @@ NdisReadConfiguration(
ULONG KeyDataLength;
PMINIPORT_RESOURCE MiniportResource;
PMINIPORT_CONFIGURATION_CONTEXT ConfigurationContext = (PMINIPORT_CONFIGURATION_CONTEXT)ConfigurationHandle;
+ PVOID Buffer;
*ParameterValue = NULL;
*Status = NDIS_STATUS_FAILURE;
- if(ParameterType != NdisParameterInteger &&
- ParameterType != NdisParameterHexInteger &&
- ParameterType != NdisParameterString &&
- ParameterType != NdisParameterMultiString &&
- ParameterType != NdisParameterBinary
- )
- {
- NDIS_DbgPrint(MIN_TRACE,("unsupported parameter type\n"));
- *Status = NDIS_STATUS_NOT_SUPPORTED;
- return;
- }
-
NDIS_DbgPrint(MAX_TRACE,("requested read of %wZ\n", Keyword));
if (ConfigurationContext == NULL)
@@ -498,152 +487,105 @@ NdisReadConfiguration(
return;
}
- switch(ParameterType)
+ *ParameterValue = ExAllocatePool(PagedPool, sizeof(NDIS_CONFIGURATION_PARAMETER));
+ if (!*ParameterValue)
{
- case NdisParameterInteger:
- case NdisParameterHexInteger:
- {
- UNICODE_STRING str;
-
- *ParameterValue = ExAllocatePool(PagedPool, sizeof(NDIS_CONFIGURATION_PARAMETER));
- if(!*ParameterValue)
- {
- NDIS_DbgPrint(MIN_TRACE,("Insufficient resources.\n"));
- ExFreePool(KeyInformation);
- *Status = NDIS_STATUS_RESOURCES;
- return;
- }
-
- str.Length = str.MaximumLength = (USHORT)KeyInformation->DataLength;
- str.Buffer = (PWCHAR)KeyInformation->Data;
-
- (*ParameterValue)->ParameterType = ParameterType;
-
- /*
- If ParameterType is NdisParameterInteger then the base of str is decimal.
- If ParameterType is NdisParameterHexInteger then the base of str is hexadecimal.
- */
- if (ParameterType == NdisParameterInteger)
- *Status = RtlUnicodeStringToInteger(&str, 10, &(*ParameterValue)->ParameterData.IntegerData);
- else if (ParameterType == NdisParameterHexInteger)
- *Status = RtlUnicodeStringToInteger(&str, 16, &(*ParameterValue)->ParameterData.IntegerData);
-
-
- ExFreePool(KeyInformation);
-
- if(*Status != STATUS_SUCCESS) {
- ExFreePool(*ParameterValue);
- *ParameterValue = NULL;
- *Status = NDIS_STATUS_FAILURE;
- return;
- }
-
- MiniportResource->ResourceType = 0;
- MiniportResource->Resource = *ParameterValue;
- NDIS_DbgPrint(MID_TRACE,("inserting 0x%x into the resource list\n", MiniportResource->Resource));
- ExInterlockedInsertTailList(&ConfigurationContext->ResourceListHead, &MiniportResource->ListEntry, &ConfigurationContext->ResourceLock);
-
- *Status = NDIS_STATUS_SUCCESS;
-
- return;
- }
-
- case NdisParameterString:
- case NdisParameterMultiString:
- {
- PWCHAR RegData = 0;
-
- if(KeyInformation->Type != REG_SZ && KeyInformation->Type != REG_MULTI_SZ)
- {
- NDIS_DbgPrint(MIN_TRACE,("requested type does not match actual value type\n"));
- ExFreePool(KeyInformation);
- *ParameterValue = NULL;
- *Status = NDIS_STATUS_FAILURE;
- return;
- }
-
- *ParameterValue = ExAllocatePool(PagedPool, sizeof(NDIS_CONFIGURATION_PARAMETER));
- if(!*ParameterValue)
- {
- NDIS_DbgPrint(MIN_TRACE,("Insufficient resources.\n"));
- ExFreePool(KeyInformation);
- *Status = NDIS_STATUS_RESOURCES;
- return;
- }
-
- RegData = ExAllocatePool(PagedPool, KeyInformation->DataLength);
- if(!RegData)
- {
- NDIS_DbgPrint(MIN_TRACE,("Insufficient resources.\n"));
- ExFreePool(KeyInformation);
- ExFreePool(*ParameterValue);
- *ParameterValue = NULL;
- *Status = NDIS_STATUS_FAILURE;
- return;
- }
-
- MiniportResource->ResourceType = 0;
- MiniportResource->Resource = *ParameterValue;
- NDIS_DbgPrint(MID_TRACE,("inserting 0x%x into the resource list\n", MiniportResource->Resource));
- ExInterlockedInsertTailList(&ConfigurationContext->ResourceListHead, &MiniportResource->ListEntry, &ConfigurationContext->ResourceLock);
-
- memcpy(RegData, KeyInformation->Data, KeyInformation->DataLength);
-
- (*ParameterValue)->ParameterType = ParameterType;
- (*ParameterValue)->ParameterData.StringData.Length = (USHORT)KeyInformation->DataLength;
- (*ParameterValue)->ParameterData.StringData.Buffer = RegData;
-
- ExFreePool(KeyInformation);
-
- *Status = NDIS_STATUS_SUCCESS;
-
- return;
- }
-
- case NdisParameterBinary:
- {
- if(KeyInformation->Type != REG_BINARY)
- {
- NDIS_DbgPrint(MIN_TRACE,("requested type does not match actual value type\n"));
- *Status = NDIS_STATUS_FAILURE;
- ExFreePool(KeyInformation);
- return;
- }
-
- *ParameterValue = ExAllocatePool(PagedPool, sizeof(NDIS_CONFIGURATION_PARAMETER) + KeyInformation->DataLength);
- if(!*ParameterValue)
- {
- NDIS_DbgPrint(MIN_TRACE,("Insufficient resources.\n"));
- ExFreePool(KeyInformation);
- *Status = NDIS_STATUS_RESOURCES;
- return;
- }
-
- (*ParameterValue)->ParameterData.BinaryData.Buffer = ExAllocatePool(PagedPool, KeyInformation->DataLength);
- if (!(*ParameterValue)->ParameterData.BinaryData.Buffer)
- {
- NDIS_DbgPrint(MIN_TRACE,("Insufficient resources.\n"));
- ExFreePool(KeyInformation);
- *Status = NDIS_STATUS_RESOURCES;
- return;
- }
-
- (*ParameterValue)->ParameterType = ParameterType;
- (*ParameterValue)->ParameterData.BinaryData.Length = KeyInformation->DataLength;
- memcpy((*ParameterValue)->ParameterData.BinaryData.Buffer, KeyInformation->Data, KeyInformation->DataLength);
-
- MiniportResource->ResourceType = 0;
- MiniportResource->Resource = *ParameterValue;
- NDIS_DbgPrint(MID_TRACE,("inserting 0x%x into the resource list\n", MiniportResource->Resource));
- ExInterlockedInsertTailList(&ConfigurationContext->ResourceListHead, &MiniportResource->ListEntry, &ConfigurationContext->ResourceLock);
-
- ExFreePool(KeyInformation);
-
- *Status = NDIS_STATUS_SUCCESS;
-
- return;
- }
+ NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
+ ExFreePool(MiniportResource);
+ ExFreePool(KeyInformation);
+ *Status = NDIS_STATUS_RESOURCES;
+ return;
}
+
+ RtlZeroMemory(*ParameterValue, sizeof(NDIS_CONFIGURATION_PARAMETER));
+
+ if (KeyInformation->Type == REG_BINARY)
+ {
+ NDIS_DbgPrint(MAX_TRACE, ("NdisParameterBinary\n"));
+
+ (*ParameterValue)->ParameterType = NdisParameterBinary;
+
+ Buffer = ExAllocatePool(NonPagedPool, KeyInformation->DataLength);
+ if (!Buffer)
+ {
+ NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
+ ExFreePool(MiniportResource);
+ ExFreePool(KeyInformation);
+ *Status = NDIS_STATUS_RESOURCES;
+ return;
+ }
+
+ RtlCopyMemory(Buffer, KeyInformation->Data, KeyInformation->DataLength);
+
+ (*ParameterValue)->ParameterData.BinaryData.Buffer = Buffer;
+ (*ParameterValue)->ParameterData.BinaryData.Length = KeyInformation->DataLength;
+ }
+ else if (KeyInformation->Type == REG_MULTI_SZ)
+ {
+ NDIS_DbgPrint(MAX_TRACE, ("NdisParameterMultiString\n"));
+
+ (*ParameterValue)->ParameterType = NdisParameterMultiString;
+
+ Buffer = ExAllocatePool(NonPagedPool, KeyInformation->DataLength);
+ if (!Buffer)
+ {
+ NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
+ ExFreePool(MiniportResource);
+ ExFreePool(KeyInformation);
+ *Status = NDIS_STATUS_RESOURCES;
+ return;
+ }
+
+ RtlCopyMemory(Buffer, KeyInformation->Data, KeyInformation->DataLength);
+
+ (*ParameterValue)->ParameterData.StringData.Buffer = Buffer;
+ (*ParameterValue)->ParameterData.StringData.Length = KeyInformation->DataLength;
+ }
+ else
+ {
+ UNICODE_STRING str;
+
+ str.Length = str.MaximumLength = (USHORT)KeyInformation->DataLength;
+ str.Buffer = (PWCHAR)KeyInformation->Data;
+
+ if ((*Status = RtlUnicodeStringToInteger(&str, 0,
+ &(*ParameterValue)->ParameterData.IntegerData)) == STATUS_SUCCESS)
+ {
+ NDIS_DbgPrint(MAX_TRACE, ("NdisParameterInteger\n"));
+
+ (*ParameterValue)->ParameterType = NdisParameterInteger;
+ }
+ else
+ {
+ NDIS_DbgPrint(MAX_TRACE, ("NdisParameterString\n"));
+
+ (*ParameterValue)->ParameterType = NdisParameterString;
+
+ Buffer = ExAllocatePool(NonPagedPool, KeyInformation->DataLength);
+ if (!Buffer)
+ {
+ NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
+ ExFreePool(MiniportResource);
+ ExFreePool(KeyInformation);
+ *Status = NDIS_STATUS_RESOURCES;
+ return;
+ }
+
+ RtlCopyMemory(Buffer, KeyInformation->Data, KeyInformation->DataLength);
+
+ (*ParameterValue)->ParameterData.StringData.Buffer = Buffer;
+ (*ParameterValue)->ParameterData.StringData.Length = KeyInformation->DataLength;
+ }
+ }
+
+ MiniportResource->ResourceType = MINIPORT_RESOURCE_TYPE_MEMORY;
+ MiniportResource->Resource = *ParameterValue;
+
+ ExInterlockedInsertTailList(&ConfigurationContext->ResourceListHead, &MiniportResource->ListEntry, &ConfigurationContext->ResourceLock);
+
+ ExFreePool(KeyInformation);
+
+ *Status = NDIS_STATUS_SUCCESS;
}
@@ -720,6 +662,7 @@ NdisReadNetworkAddress(
NDIS_STRING Keyword;
UINT *IntArray = 0;
UINT i,j = 0;
+ NDIS_STRING str;
NdisInitUnicodeString(&Keyword, L"NetworkAddress");
NdisReadConfiguration(Status, &ParameterValue, ConfigurationHandle, &Keyword, NdisParameterString);
@@ -730,11 +673,41 @@ NdisReadNetworkAddress(
return;
}
- while (ParameterValue->ParameterData.StringData.Buffer[j] != '\0') j++;
+ if (ParameterValue->ParameterType == NdisParameterInteger)
+ {
+ WCHAR Buff[11];
+ NDIS_DbgPrint(MAX_TRACE, ("Read integer data %lx\n",
+ ParameterValue->ParameterData.IntegerData));
+
+ str.Buffer = Buff;
+ str.MaximumLength = (USHORT)sizeof(Buff);
+ str.Length = 0;
+
+ *Status = RtlIntegerToUnicodeString(ParameterValue->ParameterData.IntegerData,
+ 10,
+ &str);
+
+ if (*Status != NDIS_STATUS_SUCCESS)
+ {
+ NDIS_DbgPrint(MIN_TRACE, ("RtlIntegerToUnicodeString failed (%x)\n", *Status));
+ *Status = NDIS_STATUS_FAILURE;
+ return;
+ }
+
+ NDIS_DbgPrint(MAX_TRACE, ("Converted integer data into %wZ\n", &str));
+ }
+ else
+ {
+ ASSERT(ParameterValue->ParameterType == NdisParameterString);
+ str = ParameterValue->ParameterData.StringData;
+ }
+
+ while (j < str.Length && str.Buffer[j] != '\0') j++;
+
*NetworkAddressLength = (UINT)((j/2)+0.5);
- if (j == 0)
+ if ((*NetworkAddressLength) == 0)
{
NDIS_DbgPrint(MIN_TRACE,("Empty NetworkAddress registry entry.\n"));
*Status = NDIS_STATUS_FAILURE;
@@ -766,8 +739,8 @@ NdisReadNetworkAddress(
/* convert from string to bytes */
for(i=0; i<(*NetworkAddressLength); i++)
{
- IntArray[i] = (UnicodeToHexByte((ParameterValue->ParameterData.StringData.Buffer)[2*i]) << 4) +
- UnicodeToHexByte((ParameterValue->ParameterData.StringData.Buffer)[2*i+1]);
+ IntArray[i] = (UnicodeToHexByte((str.Buffer)[2*i]) << 4) +
+ UnicodeToHexByte((str.Buffer)[2*i+1]);
}
*NetworkAddress = IntArray;
diff --git a/reactos/drivers/network/ndis/ndis/control.c b/reactos/drivers/network/ndis/ndis/control.c
index 572fd89b3f2..2a5bbc56431 100644
--- a/reactos/drivers/network/ndis/ndis/control.c
+++ b/reactos/drivers/network/ndis/ndis/control.c
@@ -83,9 +83,9 @@ NdisAcquireReadWriteLock(
if (Lock->Context != PsGetCurrentThread()) {
/* Wait for the exclusive lock to be released. */
Lock->RefCount[KeGetCurrentProcessorNumber()].RefCount--;
- KefAcquireSpinLockAtDpcLevel(&Lock->SpinLock);
+ KeAcquireSpinLockAtDpcLevel(&Lock->SpinLock);
Lock->RefCount[KeGetCurrentProcessorNumber()].RefCount++;
- KefReleaseSpinLockFromDpcLevel(&Lock->SpinLock);
+ KeReleaseSpinLockFromDpcLevel(&Lock->SpinLock);
}
}
}
@@ -124,7 +124,7 @@ NdisReleaseReadWriteLock(
case 4: /* Exclusive write lock */
Lock->Context = NULL;
LockState->LockState = -1;
- KfReleaseSpinLock(&Lock->SpinLock, LockState->OldIrql);
+ KeReleaseSpinLock(&Lock->SpinLock, LockState->OldIrql);
return;
}
}
diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c
index e2872efe767..8de01b9a297 100644
--- a/reactos/drivers/network/ndis/ndis/miniport.c
+++ b/reactos/drivers/network/ndis/ndis/miniport.c
@@ -357,6 +357,9 @@ MiniResetComplete(
PADAPTER_BINDING AdapterBinding;
KIRQL OldIrql;
+ if (AddressingReset)
+ MiniDoAddressingReset(Adapter);
+
NdisMIndicateStatus(Adapter, NDIS_STATUS_RESET_END, NULL, 0);
NdisMIndicateStatusComplete(Adapter);
@@ -638,7 +641,45 @@ MiniLocateDevice(
return Adapter;
}
-
+NDIS_STATUS
+MiniSetInformation(
+ PLOGICAL_ADAPTER Adapter,
+ NDIS_OID Oid,
+ ULONG Size,
+ PVOID Buffer,
+ PULONG BytesRead)
+{
+ NDIS_STATUS NdisStatus;
+ PNDIS_REQUEST NdisRequest;
+
+ NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
+
+ NdisRequest = ExAllocatePool(NonPagedPool, sizeof(NDIS_REQUEST));
+ if (!NdisRequest) {
+ NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
+ return NDIS_STATUS_RESOURCES;
+ }
+
+ RtlZeroMemory(NdisRequest, sizeof(NDIS_REQUEST));
+
+ NdisRequest->RequestType = NdisRequestSetInformation;
+ NdisRequest->DATA.SET_INFORMATION.Oid = Oid;
+ NdisRequest->DATA.SET_INFORMATION.InformationBuffer = Buffer;
+ NdisRequest->DATA.SET_INFORMATION.InformationBufferLength = Size;
+
+ NdisStatus = MiniDoRequest(Adapter, NdisRequest);
+
+ /* FIXME: Wait in pending case! */
+
+ ASSERT(NdisStatus != NDIS_STATUS_PENDING);
+
+ *BytesRead = NdisRequest->DATA.SET_INFORMATION.BytesRead;
+
+ ExFreePool(NdisRequest);
+
+ return NdisStatus;
+}
+
NDIS_STATUS
MiniQueryInformation(
PLOGICAL_ADAPTER Adapter,
@@ -712,21 +753,34 @@ MiniCheckForHang( PLOGICAL_ADAPTER Adapter )
return Ret;
}
+VOID
+MiniDoAddressingReset(PLOGICAL_ADAPTER Adapter)
+{
+ ULONG BytesRead;
+
+ MiniSetInformation(Adapter,
+ OID_GEN_CURRENT_LOOKAHEAD,
+ sizeof(ULONG),
+ &Adapter->NdisMiniportBlock.CurrentLookahead,
+ &BytesRead);
+
+ /* FIXME: Set more stuff */
+}
+
NDIS_STATUS
MiniReset(
- PLOGICAL_ADAPTER Adapter,
- PBOOLEAN AddressingReset)
+ PLOGICAL_ADAPTER Adapter)
/*
* FUNCTION: Resets the miniport
* ARGUMENTS:
* Adapter = Pointer to the logical adapter object
- * AddressingReset = Set to TRUE if we need to call MiniportSetInformation later
* RETURNS:
* Status of the operation
*/
{
NDIS_STATUS Status;
KIRQL OldIrql;
+ BOOLEAN AddressingReset = TRUE;
if (MiniIsBusy(Adapter, NdisWorkItemResetRequested)) {
MiniQueueWorkItem(Adapter, NdisWorkItemResetRequested, NULL, FALSE);
@@ -739,7 +793,7 @@ MiniReset(
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
Adapter->NdisMiniportBlock.MiniportAdapterContext,
- AddressingReset);
+ &AddressingReset);
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
Adapter->NdisMiniportBlock.ResetStatus = Status;
@@ -748,6 +802,9 @@ MiniReset(
KeLowerIrql(OldIrql);
if (Status != NDIS_STATUS_PENDING) {
+ if (AddressingReset)
+ MiniDoAddressingReset(Adapter);
+
NdisMIndicateStatus(Adapter, NDIS_STATUS_RESET_END, NULL, 0);
NdisMIndicateStatusComplete(Adapter);
}
@@ -763,15 +820,11 @@ MiniportHangDpc(
PVOID SystemArgument2)
{
PLOGICAL_ADAPTER Adapter = DeferredContext;
- BOOLEAN AddressingReset = FALSE;
-
if (MiniCheckForHang(Adapter)) {
NDIS_DbgPrint(MIN_TRACE, ("Miniport detected adapter hang\n"));
- MiniReset(Adapter, &AddressingReset);
+ MiniReset(Adapter);
}
-
- /* FIXME: We should call MiniportSetInformation if AddressingReset is TRUE */
}
@@ -1133,12 +1186,9 @@ MiniportWorker(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
Adapter->NdisMiniportBlock.MiniportAdapterContext,
&AddressingReset);
- if (NdisStatus == NDIS_STATUS_PENDING)
- {
- KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
- Adapter->NdisMiniportBlock.ResetStatus = NDIS_STATUS_PENDING;
- KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
- }
+ KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
+ Adapter->NdisMiniportBlock.ResetStatus = NdisStatus;
+ KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
KeLowerIrql(OldIrql);
diff --git a/reactos/drivers/network/ndis/ndis/misc.c b/reactos/drivers/network/ndis/ndis/misc.c
index 032536e7b4d..418f6ed0f1c 100644
--- a/reactos/drivers/network/ndis/ndis/misc.c
+++ b/reactos/drivers/network/ndis/ndis/misc.c
@@ -462,8 +462,8 @@ ndisProcWorkItemHandler(PVOID pContext)
pNdisItem->Routine(pNdisItem, pNdisItem->Context);
}
-EXPORT
NDIS_STATUS
+EXPORT
NdisScheduleWorkItem(
IN PNDIS_WORK_ITEM pWorkItem)
{
@@ -515,7 +515,7 @@ NdisGetVersion(VOID)
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
- return (UINT) 0x501;
+ return NDIS_VERSION;
}
/*
diff --git a/reactos/drivers/network/ndis/ndis/protocol.c b/reactos/drivers/network/ndis/ndis/protocol.c
index 741156309df..08f794e38fc 100644
--- a/reactos/drivers/network/ndis/ndis/protocol.c
+++ b/reactos/drivers/network/ndis/ndis/protocol.c
@@ -341,14 +341,16 @@ ProRequest(
#endif
}
-
+
NDIS_STATUS NTAPI
ProReset(
IN NDIS_HANDLE MacBindingHandle)
{
- UNIMPLEMENTED
+ PADAPTER_BINDING AdapterBinding = MacBindingHandle;
- return NDIS_STATUS_FAILURE;
+ /* FIXME: Wait for all packets to be sent */
+
+ return MiniReset(AdapterBinding->Adapter);
}
VOID NTAPI
@@ -507,7 +509,7 @@ ProSend(
} else {
if (Adapter->NdisMiniportBlock.ScatterGatherListSize != 0)
{
- NDIS_DbgPrint(MAX_TRACE, ("Using Scatter/Gather DMA\n"));
+ NDIS_DbgPrint(MIN_TRACE, ("Using Scatter/Gather DMA\n"));
NdisQueryPacket(Packet,
NULL,
diff --git a/reactos/drivers/network/tcpip/include/address.h b/reactos/drivers/network/tcpip/include/address.h
index 65abace2ad7..73d5dbbc535 100644
--- a/reactos/drivers/network/tcpip/include/address.h
+++ b/reactos/drivers/network/tcpip/include/address.h
@@ -58,8 +58,6 @@ BOOLEAN AddrIsEqualIPv4(
BOOLEAN AddrLocateADEv4(
IPv4_RAW_ADDRESS MatchAddress, PIP_ADDRESS Address);
-BOOLEAN IPGetDefaultAddress( PIP_ADDRESS Address );
-
PADDRESS_FILE AddrSearchFirst(
PIP_ADDRESS Address,
USHORT Port,
diff --git a/reactos/drivers/network/tcpip/include/dispatch.h b/reactos/drivers/network/tcpip/include/dispatch.h
index bd559517b11..b6aada9058a 100644
--- a/reactos/drivers/network/tcpip/include/dispatch.h
+++ b/reactos/drivers/network/tcpip/include/dispatch.h
@@ -7,6 +7,12 @@
#ifndef __DISPATCH_H
#define __DISPATCH_H
+typedef struct _DISCONNECT_TYPE {
+ UINT Type;
+ PVOID Context;
+ PIRP Irp;
+ PFILE_OBJECT FileObject;
+} DISCONNECT_TYPE, *PDISCONNECT_TYPE;
NTSTATUS DispTdiAccept(
PIRP Irp);
@@ -64,6 +70,9 @@ NTSTATUS DispTdiDeleteIPAddress(
PIRP Irp,
PIO_STACK_LOCATION IrpSp);
+VOID DispDoDisconnect(
+ PVOID Data);
+
#endif /* __DISPATCH_H */
/* EOF */
diff --git a/reactos/drivers/network/tcpip/include/icmp.h b/reactos/drivers/network/tcpip/include/icmp.h
index 8351942831a..bb0e28a890a 100644
--- a/reactos/drivers/network/tcpip/include/icmp.h
+++ b/reactos/drivers/network/tcpip/include/icmp.h
@@ -48,6 +48,16 @@ typedef struct ICMP_HEADER {
/* ICMP codes for ICMP_TYPE_PARAMETER */
#define ICMP_CODE_TP_POINTER 1 /* Pointer indicates the error */
+NTSTATUS ICMPSendDatagram(
+ PADDRESS_FILE AddrFile,
+ PTDI_CONNECTION_INFORMATION ConnInfo,
+ PCHAR BufferData,
+ ULONG DataSize,
+ PULONG DataUsed );
+
+NTSTATUS ICMPStartup();
+
+NTSTATUS ICMPShutdown();
VOID ICMPReceive(
PIP_INTERFACE Interface,
diff --git a/reactos/drivers/network/tcpip/include/ip.h b/reactos/drivers/network/tcpip/include/ip.h
index a172eb3bc06..47f9771f0d9 100644
--- a/reactos/drivers/network/tcpip/include/ip.h
+++ b/reactos/drivers/network/tcpip/include/ip.h
@@ -134,6 +134,19 @@ typedef struct _LLIP_BIND_INFO {
LL_TRANSMIT_ROUTINE Transmit; /* Transmit function for this interface */
} LLIP_BIND_INFO, *PLLIP_BIND_INFO;
+typedef struct _SEND_RECV_STATS {
+ UINT InBytes;
+ UINT InUnicast;
+ UINT InNUnicast;
+ UINT InDiscarded;
+ UINT InErrors;
+ UINT InDiscardedUnknownProto;
+ UINT OutBytes;
+ UINT OutUnicast;
+ UINT OutNUnicast;
+ UINT OutDiscarded;
+ UINT OutErrors;
+} SEND_RECV_STATS, *PSEND_RECV_STATS;
/* Information about an IP interface */
typedef struct _IP_INTERFACE {
@@ -157,6 +170,7 @@ typedef struct _IP_INTERFACE {
UINT Index; /* Index of adapter (used to add ip addr) */
LL_TRANSMIT_ROUTINE Transmit; /* Pointer to transmit function */
PVOID TCPContext; /* TCP Content for this interface */
+ SEND_RECV_STATS Stats; /* Send/Receive statistics */
} IP_INTERFACE, *PIP_INTERFACE;
typedef struct _IP_SET_ADDRESS {
diff --git a/reactos/drivers/network/tcpip/include/memtrack.h b/reactos/drivers/network/tcpip/include/memtrack.h
index b23ca07bc37..778d7b75cc4 100644
--- a/reactos/drivers/network/tcpip/include/memtrack.h
+++ b/reactos/drivers/network/tcpip/include/memtrack.h
@@ -38,7 +38,6 @@ VOID UntrackFL( PCHAR File, ULONG Line, PVOID Thing, ULONG Tag );
#define Untrack(Thing) UntrackFL(__FILE__,__LINE__,Thing)
VOID TrackDumpFL( PCHAR File, ULONG Line );
#define TrackDump() TrackDumpFL(__FILE__,__LINE__)
-VOID TrackTag( ULONG Tag );
static __inline PVOID ExAllocateFromNPagedLookasideListX( PNPAGED_LOOKASIDE_LIST List, PCHAR File, ULONG Line ) {
PVOID Out = ExAllocateFromNPagedLookasideList( List );
@@ -62,14 +61,12 @@ static __inline VOID ExFreePoolX( PVOID Data, PCHAR File, ULONG Line ) {
ExFreePool( Data );
}
-#define MEMTRACK_MAX_TAGS_TO_TRACK 64
#else
#define MTMARK()
#define Track(x,y)
#define TrackingInit()
#define TrackDump()
#define Untrack(x)
-#define TrackTag(x)
#define exAllocatePoolWithTag(x,y,z) ExAllocatePoolWithTag(x,y,z)
#define exAllocatePool(x,y) ExAllocatePool(x,y)
#define exFreePool(x) ExFreePool(x)
diff --git a/reactos/drivers/network/tcpip/include/rawip.h b/reactos/drivers/network/tcpip/include/rawip.h
index 5bf5e8b73cd..85fa0bdf94b 100644
--- a/reactos/drivers/network/tcpip/include/rawip.h
+++ b/reactos/drivers/network/tcpip/include/rawip.h
@@ -14,7 +14,7 @@ NTSTATUS RawIPSendDatagram(
ULONG DataSize,
PULONG DataUsed);
-VOID RawIPReceive(
+VOID RawIpReceive(
PIP_INTERFACE Interface,
PIP_PACKET IPPacket);
diff --git a/reactos/drivers/network/tcpip/include/tcp.h b/reactos/drivers/network/tcpip/include/tcp.h
index a43e2282d49..5caa86e7637 100644
--- a/reactos/drivers/network/tcpip/include/tcp.h
+++ b/reactos/drivers/network/tcpip/include/tcp.h
@@ -84,7 +84,8 @@ typedef struct _SLEEPING_THREAD {
#define SRF_FIN TCP_FIN
extern LONG TCP_IPIdentification;
-extern LIST_ENTRY SignalledConnections;
+extern LIST_ENTRY SignalledConnectionsList;
+extern KSPIN_LOCK SignalledConnectionsLock;
extern LIST_ENTRY SleepingThreadsList;
extern FAST_MUTEX SleepingThreadsLock;
extern RECURSIVE_MUTEX TCPLock;
diff --git a/reactos/drivers/network/tcpip/recmutex/recmutex.c b/reactos/drivers/network/tcpip/recmutex/recmutex.c
index 0427a29664b..72e889fbd77 100644
--- a/reactos/drivers/network/tcpip/recmutex/recmutex.c
+++ b/reactos/drivers/network/tcpip/recmutex/recmutex.c
@@ -6,77 +6,81 @@ VOID RecursiveMutexInit( PRECURSIVE_MUTEX RecMutex ) {
KeInitializeSpinLock( &RecMutex->SpinLock );
ExInitializeFastMutex( &RecMutex->Mutex );
KeInitializeEvent( &RecMutex->StateLockedEvent,
- NotificationEvent, FALSE );
+ NotificationEvent, FALSE );
}
/* NOTE: When we leave, the FAST_MUTEX must have been released. The result
- * is that we always exit in the same irql as entering */
+* is that we always exit in the same irql as entering */
SIZE_T RecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToWrite ) {
NTSTATUS Status = STATUS_SUCCESS;
PVOID CurrentThread = KeGetCurrentThread();
+ KIRQL CurrentIrql;
/* Wait for the previous user to unlock the RecMutex state. There might be
- * multiple waiters waiting to change the state. We need to check each
- * time we get the event whether somebody still has the state locked */
+ * multiple waiters waiting to change the state. We need to check each
+ * time we get the event whether somebody still has the state locked */
if( !RecMutex ) return FALSE;
if( CurrentThread == RecMutex->CurrentThread ||
- (!ToWrite && !RecMutex->Writer) ) {
- RecMutex->LockCount++;
- return TRUE;
+ (!ToWrite && !RecMutex->Writer) ) {
+ RecMutex->LockCount++;
+ return TRUE;
}
- if( KeGetCurrentIrql() == PASSIVE_LEVEL ) {
- ExAcquireFastMutex( &RecMutex->Mutex );
- RecMutex->OldIrql = PASSIVE_LEVEL;
- while( RecMutex->Locked ) {
- ExReleaseFastMutex( &RecMutex->Mutex );
- Status = KeWaitForSingleObject( &RecMutex->StateLockedEvent,
- UserRequest,
- KernelMode,
- FALSE,
- NULL );
- ExAcquireFastMutex( &RecMutex->Mutex );
- }
- RecMutex->Locked = TRUE;
- RecMutex->Writer = ToWrite;
- RecMutex->CurrentThread = CurrentThread;
- RecMutex->LockCount++;
- ExReleaseFastMutex( &RecMutex->Mutex );
+ CurrentIrql = KeGetCurrentIrql();
+
+ ASSERT(CurrentIrql <= DISPATCH_LEVEL);
+
+ if( CurrentIrql <= APC_LEVEL ) {
+ ExAcquireFastMutex( &RecMutex->Mutex );
+ while( RecMutex->Locked ) {
+ ExReleaseFastMutex( &RecMutex->Mutex );
+ Status = KeWaitForSingleObject( &RecMutex->StateLockedEvent,
+ UserRequest,
+ KernelMode,
+ FALSE,
+ NULL );
+ ExAcquireFastMutex( &RecMutex->Mutex );
+ }
+ RecMutex->OldIrql = CurrentIrql;
+ RecMutex->Locked = TRUE;
+ RecMutex->Writer = ToWrite;
+ RecMutex->CurrentThread = CurrentThread;
+ RecMutex->LockCount++;
+ ExReleaseFastMutex( &RecMutex->Mutex );
} else {
- KeAcquireSpinLock( &RecMutex->SpinLock, &RecMutex->OldIrql );
- RecMutex->Locked = TRUE;
- RecMutex->Writer = ToWrite;
- RecMutex->CurrentThread = CurrentThread;
- RecMutex->LockCount++;
+ KeAcquireSpinLockAtDpcLevel( &RecMutex->SpinLock );
+ RecMutex->OldIrql = DISPATCH_LEVEL;
+ RecMutex->Locked = TRUE;
+ RecMutex->Writer = ToWrite;
+ RecMutex->CurrentThread = CurrentThread;
+ RecMutex->LockCount++;
}
return TRUE;
}
VOID RecursiveMutexLeave( PRECURSIVE_MUTEX RecMutex ) {
- if( RecMutex->LockCount == 0 ) {
- return;
- } else
- RecMutex->LockCount--;
+
+ ASSERT(RecMutex->LockCount > 0);
+ RecMutex->LockCount--;
if( !RecMutex->LockCount ) {
- RecMutex->CurrentThread = NULL;
- if( RecMutex->OldIrql == PASSIVE_LEVEL ) {
- ExAcquireFastMutex( &RecMutex->Mutex );
- RecMutex->Locked = FALSE;
- RecMutex->Writer = FALSE;
- ExReleaseFastMutex( &RecMutex->Mutex );
- } else {
- RecMutex->Locked = FALSE;
- RecMutex->Writer = FALSE;
- KeReleaseSpinLock( &RecMutex->SpinLock, RecMutex->OldIrql );
- }
+ RecMutex->CurrentThread = NULL;
+ if( RecMutex->OldIrql <= APC_LEVEL ) {
+ ExAcquireFastMutex( &RecMutex->Mutex );
+ RecMutex->Locked = FALSE;
+ RecMutex->Writer = FALSE;
+ ExReleaseFastMutex( &RecMutex->Mutex );
+ } else {
+ RecMutex->Locked = FALSE;
+ RecMutex->Writer = FALSE;
+ KeReleaseSpinLockFromDpcLevel( &RecMutex->SpinLock );
+ }
- RecMutex->OldIrql = PASSIVE_LEVEL;
- KePulseEvent( &RecMutex->StateLockedEvent, IO_NETWORK_INCREMENT,
- FALSE );
+ KePulseEvent( &RecMutex->StateLockedEvent, IO_NETWORK_INCREMENT,
+ FALSE );
}
}
diff --git a/reactos/drivers/network/tcpip/recmutex/recmutex.h b/reactos/drivers/network/tcpip/recmutex/recmutex.h
index a45ae1b87ad..b4e068a1606 100644
--- a/reactos/drivers/network/tcpip/recmutex/recmutex.h
+++ b/reactos/drivers/network/tcpip/recmutex/recmutex.h
@@ -24,4 +24,6 @@ extern VOID RecursiveMutexInit( PRECURSIVE_MUTEX RecMutex );
extern SIZE_T RecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToRead );
extern VOID RecursiveMutexLeave( PRECURSIVE_MUTEX RecMutex );
+#define ASSERT_LOCKED(x) ASSERT((x)->Locked)
+
#endif/*_ROSRTL_RECMUTEX_H*/
diff --git a/reactos/drivers/network/tcpip/tcpip/dispatch.c b/reactos/drivers/network/tcpip/tcpip/dispatch.c
index 41ba5c5bcbb..304657b8bbc 100644
--- a/reactos/drivers/network/tcpip/tcpip/dispatch.c
+++ b/reactos/drivers/network/tcpip/tcpip/dispatch.c
@@ -86,15 +86,6 @@ VOID DispDataRequestComplete(
(void)IoSetCancelRoutine(Irp, NULL);
- if (Irp->Cancel || TranContext->CancelIrps) {
- /* The IRP has been cancelled */
-
- TI_DbgPrint(DEBUG_IRP, ("IRP is cancelled.\n"));
-
- Status = STATUS_CANCELLED;
- Count = 0;
- }
-
IoReleaseCancelSpinLock(OldIrql);
Irp->IoStatus.Status = Status;
@@ -111,17 +102,11 @@ VOID DispDataRequestComplete(
TI_DbgPrint(DEBUG_IRP, ("Done Completing IRP\n"));
}
-typedef struct _DISCONNECT_TYPE {
- UINT Type;
- PVOID Context;
- PIRP Irp;
- PFILE_OBJECT FileObject;
-} DISCONNECT_TYPE, *PDISCONNECT_TYPE;
-
VOID DispDoDisconnect( PVOID Data ) {
PDISCONNECT_TYPE DisType = (PDISCONNECT_TYPE)Data;
TI_DbgPrint(DEBUG_IRP, ("PostCancel: DoDisconnect\n"));
+ TcpipRecursiveMutexEnter(&TCPLock, TRUE);
TCPDisconnect
( DisType->Context,
DisType->Type,
@@ -129,6 +114,7 @@ VOID DispDoDisconnect( PVOID Data ) {
NULL,
DispDataRequestComplete,
DisType->Irp );
+ TcpipRecursiveMutexLeave(&TCPLock);
TI_DbgPrint(DEBUG_IRP, ("PostCancel: DoDisconnect done\n"));
DispDataRequestComplete(DisType->Irp, STATUS_CANCELLED, 0);
@@ -250,6 +236,9 @@ VOID NTAPI DispCancelListenRequest(
/* Try canceling the request */
Connection = (PCONNECTION_ENDPOINT)TranContext->Handle.ConnectionContext;
+
+ TCPRemoveIRP(Connection, Irp);
+
TCPAbortListenForSocket(
Connection->AddressFile->Listener,
Connection );
@@ -418,13 +407,13 @@ NTSTATUS DispTdiConnect(
Irp );
done:
+ TcpipRecursiveMutexLeave( &TCPLock );
+
if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, 0);
} else
IoMarkIrpPending(Irp);
- TcpipRecursiveMutexLeave( &TCPLock );
-
TI_DbgPrint(MAX_TRACE, ("TCP Connect returned %08x\n", Status));
return Status;
@@ -468,6 +457,12 @@ NTSTATUS DispTdiDisassociateAddress(
return STATUS_INVALID_PARAMETER;
}
+ /* Remove this connection from the address file */
+ Connection->AddressFile->Connection = NULL;
+
+ /* Remove the address file from this connection */
+ Connection->AddressFile = NULL;
+
return STATUS_SUCCESS;
}
@@ -520,13 +515,13 @@ NTSTATUS DispTdiDisconnect(
Irp );
done:
+ TcpipRecursiveMutexLeave( &TCPLock );
+
if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, 0);
} else
IoMarkIrpPending(Irp);
- TcpipRecursiveMutexLeave( &TCPLock );
-
TI_DbgPrint(MAX_TRACE, ("TCP Disconnect returned %08x\n", Status));
return Status;
@@ -625,13 +620,13 @@ NTSTATUS DispTdiListen(
}
done:
+ TcpipRecursiveMutexLeave( &TCPLock );
+
if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, 0);
} else
IoMarkIrpPending(Irp);
- TcpipRecursiveMutexLeave( &TCPLock );
-
TI_DbgPrint(MID_TRACE,("Leaving %x\n", Status));
return Status;
@@ -653,15 +648,19 @@ NTSTATUS DispTdiQueryInformation(
PTDI_REQUEST_KERNEL_QUERY_INFORMATION Parameters;
PTRANSPORT_CONTEXT TranContext;
PIO_STACK_LOCATION IrpSp;
+ NTSTATUS Status;
TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
IrpSp = IoGetCurrentIrpStackLocation(Irp);
Parameters = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&IrpSp->Parameters;
+ TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+
TranContext = IrpSp->FileObject->FsContext;
if (!TranContext) {
TI_DbgPrint(MID_TRACE, ("Bad transport context.\n"));
+ TcpipRecursiveMutexLeave(&TCPLock);
return STATUS_INVALID_PARAMETER;
}
@@ -679,6 +678,7 @@ NTSTATUS DispTdiQueryInformation(
(FIELD_OFFSET(TDI_ADDRESS_INFO, Address.Address[0].Address) +
sizeof(TDI_ADDRESS_IP))) {
TI_DbgPrint(MID_TRACE, ("MDL buffer too small.\n"));
+ TcpipRecursiveMutexLeave(&TCPLock);
return STATUS_BUFFER_TOO_SMALL;
}
@@ -697,6 +697,7 @@ NTSTATUS DispTdiQueryInformation(
RtlZeroMemory(
&Address->Address[0].Address[0].sin_zero,
sizeof(Address->Address[0].Address[0].sin_zero));
+ TcpipRecursiveMutexLeave(&TCPLock);
return STATUS_SUCCESS;
case TDI_CONNECTION_FILE:
@@ -707,18 +708,22 @@ NTSTATUS DispTdiQueryInformation(
RtlZeroMemory(
&Address->Address[0].Address[0].sin_zero,
sizeof(Address->Address[0].Address[0].sin_zero));
+ TcpipRecursiveMutexLeave(&TCPLock);
return STATUS_SUCCESS;
default:
TI_DbgPrint(MIN_TRACE, ("Invalid transport context\n"));
+ TcpipRecursiveMutexLeave(&TCPLock);
return STATUS_INVALID_PARAMETER;
}
if (!AddrFile) {
TI_DbgPrint(MID_TRACE, ("No address file object.\n"));
+ TcpipRecursiveMutexLeave(&TCPLock);
return STATUS_INVALID_PARAMETER;
}
+ TcpipRecursiveMutexLeave(&TCPLock);
return STATUS_SUCCESS;
}
@@ -732,6 +737,7 @@ NTSTATUS DispTdiQueryInformation(
(FIELD_OFFSET(TDI_CONNECTION_INFORMATION, RemoteAddress) +
sizeof(PVOID))) {
TI_DbgPrint(MID_TRACE, ("MDL buffer too small (ptr).\n"));
+ TcpipRecursiveMutexLeave(&TCPLock);
return STATUS_BUFFER_TOO_SMALL;
}
@@ -750,18 +756,24 @@ NTSTATUS DispTdiQueryInformation(
default:
TI_DbgPrint(MIN_TRACE, ("Invalid transport context\n"));
+ TcpipRecursiveMutexLeave(&TCPLock);
return STATUS_INVALID_PARAMETER;
}
if (!Endpoint) {
TI_DbgPrint(MID_TRACE, ("No connection object.\n"));
+ TcpipRecursiveMutexLeave(&TCPLock);
return STATUS_INVALID_PARAMETER;
}
- return TCPGetSockAddress( Endpoint, AddressInfo->RemoteAddress, TRUE );
+ Status = TCPGetSockAddress( Endpoint, AddressInfo->RemoteAddress, TRUE );
+
+ TcpipRecursiveMutexLeave(&TCPLock);
+ return Status;
}
}
+ TcpipRecursiveMutexLeave(&TCPLock);
return STATUS_NOT_IMPLEMENTED;
}
@@ -824,13 +836,13 @@ NTSTATUS DispTdiReceive(
}
done:
+ TcpipRecursiveMutexLeave( &TCPLock );
+
if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, BytesReceived);
} else
IoMarkIrpPending(Irp);
- TcpipRecursiveMutexLeave( &TCPLock );
-
TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status));
return Status;
@@ -902,13 +914,13 @@ NTSTATUS DispTdiReceiveDatagram(
}
done:
+ TcpipRecursiveMutexLeave( &TCPLock );
+
if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, BytesReceived);
} else
IoMarkIrpPending(Irp);
- TcpipRecursiveMutexLeave( &TCPLock );
-
TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status));
return Status;
@@ -978,13 +990,13 @@ NTSTATUS DispTdiSend(
}
done:
+ TcpipRecursiveMutexLeave( &TCPLock );
+
if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, BytesSent);
} else
IoMarkIrpPending(Irp);
- TcpipRecursiveMutexLeave( &TCPLock );
-
TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status));
return Status;
@@ -1064,13 +1076,13 @@ NTSTATUS DispTdiSendDatagram(
}
done:
+ TcpipRecursiveMutexLeave( &TCPLock );
+
if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, Irp->IoStatus.Information);
} else
IoMarkIrpPending(Irp);
- TcpipRecursiveMutexLeave( &TCPLock );
-
TI_DbgPrint(DEBUG_IRP, ("Leaving.\n"));
return Status;
diff --git a/reactos/drivers/network/tcpip/tcpip/fileobjs.c b/reactos/drivers/network/tcpip/tcpip/fileobjs.c
index ff1b591ac45..bcb20844c92 100644
--- a/reactos/drivers/network/tcpip/tcpip/fileobjs.c
+++ b/reactos/drivers/network/tcpip/tcpip/fileobjs.c
@@ -291,6 +291,11 @@ NTSTATUS FileOpenAddress(
AddrFile->Send = UDPSendDatagram;
break;
+ case IPPROTO_ICMP:
+ AddrFile->Port = 0;
+ AddrFile->Send = ICMPSendDatagram;
+ break;
+
default:
/* Use raw IP for all other protocols */
AddrFile->Port = 0;
@@ -363,7 +368,9 @@ NTSTATUS FileCloseAddress(
case IPPROTO_TCP:
TCPFreePort( AddrFile->Port );
if( AddrFile->Listener ) {
+ TcpipRecursiveMutexEnter(&TCPLock, TRUE);
TCPClose( AddrFile->Listener );
+ TcpipRecursiveMutexLeave(&TCPLock);
exFreePool( AddrFile->Listener );
}
break;
@@ -425,7 +432,9 @@ NTSTATUS FileOpenConnection(
if( !Connection ) return STATUS_NO_MEMORY;
+ TcpipRecursiveMutexEnter(&TCPLock, TRUE);
Status = TCPSocket( Connection, AF_INET, SOCK_STREAM, IPPROTO_TCP );
+ TcpipRecursiveMutexLeave(&TCPLock);
if( !NT_SUCCESS(Status) ) {
TCPFreeConnectionEndpoint( Connection );
diff --git a/reactos/drivers/network/tcpip/tcpip/iinfo.c b/reactos/drivers/network/tcpip/tcpip/iinfo.c
index 2da0df136c0..21ac96166e8 100644
--- a/reactos/drivers/network/tcpip/tcpip/iinfo.c
+++ b/reactos/drivers/network/tcpip/tcpip/iinfo.c
@@ -20,6 +20,7 @@ TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID *ID,
PCHAR IFDescr;
ULONG Size;
UINT DescrLenMax = MAX_IFDESCR_LEN - 1;
+ NDIS_STATUS NdisStatus;
TI_DbgPrint(DEBUG_INFO,
("Getting IFEntry MIB (IF %08x LA %08x) (%04x:%d)\n",
@@ -57,6 +58,28 @@ TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID *ID,
("IF Speed = %d * 100bps\n", OutData->Speed));
memcpy(OutData->PhysAddr,Interface->Address,Interface->AddressLength);
TI_DbgPrint(DEBUG_INFO, ("Got HWAddr\n"));
+
+ memcpy(&OutData->InOctets, &Interface->Stats, sizeof(SEND_RECV_STATS));
+
+ NdisStatus = NDISCall(IF,
+ NdisRequestQueryInformation,
+ OID_GEN_XMIT_ERROR,
+ &OutData->OutErrors,
+ sizeof(ULONG));
+ if (NdisStatus != NDIS_STATUS_SUCCESS)
+ OutData->OutErrors = 0;
+
+ TI_DbgPrint(DEBUG_INFO, ("OutErrors = %d\n", OutData->OutErrors));
+
+ NdisStatus = NDISCall(IF,
+ NdisRequestQueryInformation,
+ OID_GEN_RCV_ERROR,
+ &OutData->InErrors,
+ sizeof(ULONG));
+ if (NdisStatus != NDIS_STATUS_SUCCESS)
+ OutData->InErrors = 0;
+
+ TI_DbgPrint(DEBUG_INFO, ("InErrors = %d\n", OutData->InErrors));
}
GetInterfaceName( Interface, IFDescr, MAX_IFDESCR_LEN - 1 );
diff --git a/reactos/drivers/network/tcpip/tcpip/irp.c b/reactos/drivers/network/tcpip/tcpip/irp.c
index 104818f6aec..f2fc589d19b 100644
--- a/reactos/drivers/network/tcpip/tcpip/irp.c
+++ b/reactos/drivers/network/tcpip/tcpip/irp.c
@@ -16,10 +16,7 @@ VOID IRPRemember( PIRP Irp, PCHAR File, UINT Line ) {
}
NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) {
- KIRQL Irql;
- PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
-
- //DbgPrint("Called: Irp %x, Status %x Event %x\n", Irp, Status, Irp->UserEvent);
+ KIRQL OldIrql;
UntrackFL( __FILE__, __LINE__, Irp, IRP_TAG );
@@ -28,15 +25,11 @@ NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) {
if( Status == STATUS_PENDING )
IoMarkIrpPending( Irp );
else {
- Irql = KeGetCurrentIrql();
-
+ IoAcquireCancelSpinLock(&OldIrql);
(void)IoSetCancelRoutine( Irp, NULL );
+ IoReleaseCancelSpinLock(OldIrql);
+
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
- if (KeGetCurrentIrql() != Irql) {
- DbgPrint("WARNING: IO COMPLETION RETURNED AT WRONG IRQL:\n");
- DbgPrint("WARNING: IRP TYPE WAS %d\n", IrpSp->MajorFunction);
- }
- ASSERT(KeGetCurrentIrql() == Irql);
}
return Status;
diff --git a/reactos/drivers/network/tcpip/tcpip/main.c b/reactos/drivers/network/tcpip/tcpip/main.c
index 4ec072ef1f4..9f4f6be431c 100644
--- a/reactos/drivers/network/tcpip/tcpip/main.c
+++ b/reactos/drivers/network/tcpip/tcpip/main.c
@@ -646,6 +646,7 @@ VOID NTAPI TiUnload(
TCPShutdown();
UDPShutdown();
RawIPShutdown();
+ ICMPShutdown();
/* Shutdown network level protocol subsystem */
IPShutdown();
@@ -725,10 +726,6 @@ DriverEntry(
TI_DbgPrint(MAX_TRACE, ("Called.\n"));
TrackingInit();
- TrackTag(NDIS_BUFFER_TAG);
- TrackTag(NDIS_PACKET_TAG);
- TrackTag(FBSD_MALLOC);
- TrackTag(EXALLOC_TAG);
/* TdiInitialize() ? */
@@ -889,52 +886,21 @@ DriverEntry(
return Status;
}
- /* Register protocol with NDIS */
- /* This used to be IP_DEVICE_NAME but the DDK says it has to match your entry in the SCM */
- Status = LANRegisterProtocol(&strNdisDeviceName);
- if (!NT_SUCCESS(Status)) {
- TI_DbgPrint(MIN_TRACE,("Failed to register protocol with NDIS; status 0x%x\n", Status));
- TiWriteErrorLog(
- DriverObject,
- EVENT_TRANSPORT_REGISTER_FAILED,
- TI_ERROR_DRIVERENTRY,
- Status,
- NULL,
- 0,
- NULL);
- TCPShutdown();
- UDPShutdown();
- RawIPShutdown();
- IPShutdown();
- ChewShutdown();
- IoDeleteDevice(IPDeviceObject);
- IoDeleteDevice(RawIPDeviceObject);
- IoDeleteDevice(UDPDeviceObject);
- IoDeleteDevice(TCPDeviceObject);
- exFreePool(EntityList);
- NdisFreePacketPool(GlobalPacketPool);
- NdisFreeBufferPool(GlobalBufferPool);
- return Status;
- }
-
- /* Open loopback adapter */
- Status = LoopRegisterAdapter(NULL, NULL);
- if (!NT_SUCCESS(Status)) {
- TI_DbgPrint(MIN_TRACE, ("Failed to create loopback adapter. Status (0x%X).\n", Status));
- TCPShutdown();
- UDPShutdown();
- RawIPShutdown();
- IPShutdown();
- ChewShutdown();
- IoDeleteDevice(IPDeviceObject);
- IoDeleteDevice(RawIPDeviceObject);
- IoDeleteDevice(UDPDeviceObject);
- IoDeleteDevice(TCPDeviceObject);
- exFreePool(EntityList);
- NdisFreePacketPool(GlobalPacketPool);
- NdisFreeBufferPool(GlobalBufferPool);
- LANUnregisterProtocol();
- return Status;
+ Status = ICMPStartup();
+ if( !NT_SUCCESS(Status) ) {
+ TCPShutdown();
+ UDPShutdown();
+ RawIPShutdown();
+ IPShutdown();
+ ChewShutdown();
+ IoDeleteDevice(IPDeviceObject);
+ IoDeleteDevice(RawIPDeviceObject);
+ IoDeleteDevice(UDPDeviceObject);
+ IoDeleteDevice(TCPDeviceObject);
+ exFreePool(EntityList);
+ NdisFreePacketPool(GlobalPacketPool);
+ NdisFreeBufferPool(GlobalBufferPool);
+ return Status;
}
/* Use direct I/O */
@@ -963,6 +929,53 @@ DriverEntry(
DueTime.QuadPart = -(LONGLONG)IP_TIMEOUT * 10000;
KeSetTimerEx(&IPTimer, DueTime, IP_TIMEOUT, &IPTimeoutDpc);
+ /* Open loopback adapter */
+ Status = LoopRegisterAdapter(NULL, NULL);
+ if (!NT_SUCCESS(Status)) {
+ TI_DbgPrint(MIN_TRACE, ("Failed to create loopback adapter. Status (0x%X).\n", Status));
+ TCPShutdown();
+ UDPShutdown();
+ RawIPShutdown();
+ IPShutdown();
+ ChewShutdown();
+ IoDeleteDevice(IPDeviceObject);
+ IoDeleteDevice(RawIPDeviceObject);
+ IoDeleteDevice(UDPDeviceObject);
+ IoDeleteDevice(TCPDeviceObject);
+ exFreePool(EntityList);
+ NdisFreePacketPool(GlobalPacketPool);
+ NdisFreeBufferPool(GlobalBufferPool);
+ return Status;
+ }
+
+ /* Register protocol with NDIS */
+ /* This used to be IP_DEVICE_NAME but the DDK says it has to match your entry in the SCM */
+ Status = LANRegisterProtocol(&strNdisDeviceName);
+ if (!NT_SUCCESS(Status)) {
+ TI_DbgPrint(MIN_TRACE,("Failed to register protocol with NDIS; status 0x%x\n", Status));
+ TiWriteErrorLog(
+ DriverObject,
+ EVENT_TRANSPORT_REGISTER_FAILED,
+ TI_ERROR_DRIVERENTRY,
+ Status,
+ NULL,
+ 0,
+ NULL);
+ TCPShutdown();
+ UDPShutdown();
+ RawIPShutdown();
+ IPShutdown();
+ ChewShutdown();
+ IoDeleteDevice(IPDeviceObject);
+ IoDeleteDevice(RawIPDeviceObject);
+ IoDeleteDevice(UDPDeviceObject);
+ IoDeleteDevice(TCPDeviceObject);
+ exFreePool(EntityList);
+ NdisFreePacketPool(GlobalPacketPool);
+ NdisFreeBufferPool(GlobalBufferPool);
+ return Status;
+ }
+
return STATUS_SUCCESS;
}
diff --git a/reactos/drivers/storage/class/ramdisk/ramdisk.c b/reactos/drivers/storage/class/ramdisk/ramdisk.c
index 9d28c4c39a2..9cf36bd2500 100644
--- a/reactos/drivers/storage/class/ramdisk/ramdisk.c
+++ b/reactos/drivers/storage/class/ramdisk/ramdisk.c
@@ -1012,7 +1012,8 @@ RamdiskWorkerThread(IN PDEVICE_OBJECT DeviceObject,
IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp);
Irp->IoStatus.Status = Status;
Irp->IoStatus.Information = 0;
- return IoCompleteRequest(Irp, IO_DISK_INCREMENT);
+ IoCompleteRequest(Irp, IO_DISK_INCREMENT);
+ return;
}
//
@@ -1020,7 +1021,8 @@ RamdiskWorkerThread(IN PDEVICE_OBJECT DeviceObject,
//
Irp->IoStatus.Status = Status;
Irp->IoStatus.Information = 0;
- return IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return;
}
NTSTATUS
diff --git a/reactos/drivers/storage/ide/atapi/atapi.c b/reactos/drivers/storage/ide/atapi/atapi.c
index 7d824f88e64..fe3c9808c95 100644
--- a/reactos/drivers/storage/ide/atapi/atapi.c
+++ b/reactos/drivers/storage/ide/atapi/atapi.c
@@ -5424,13 +5424,20 @@ Return Value:
// Fill in vendor identification fields.
//
- for (i = 0; i < 20; i += 2) {
+ for (i = 0; i < 8; i += 2) {
inquiryData->VendorId[i] =
((PUCHAR)identifyData->ModelNumber)[i + 1];
inquiryData->VendorId[i+1] =
((PUCHAR)identifyData->ModelNumber)[i];
}
+ for (i = 0; i < 12; i += 2) {
+ inquiryData->ProductId[i] =
+ ((PUCHAR)identifyData->ModelNumber)[i + 8 + 1];
+ inquiryData->ProductId[i+1] =
+ ((PUCHAR)identifyData->ModelNumber)[i + 8];
+ }
+
//
// Initialize unused portion of product id.
//
diff --git a/reactos/drivers/storage/ide/uniata/bm_devs.h b/reactos/drivers/storage/ide/uniata/bm_devs.h
index aa8e81a505f..a710c029a45 100644
--- a/reactos/drivers/storage/ide/uniata/bm_devs.h
+++ b/reactos/drivers/storage/ide/uniata/bm_devs.h
@@ -521,7 +521,8 @@ BUSMASTER_CONTROLLER_INFORMATION const BusMasterAdapters[] = {
PCI_DEV_HW_SPEC_BM( 438c, 1002, 0x00, ATA_UDMA6, "ATI IXP600" , 0 ),
PCI_DEV_HW_SPEC_BM( 4380, 1002, 0x00, ATA_SA150, "ATI IXP600" , UNIATA_SATA | UNIATA_AHCI ),
PCI_DEV_HW_SPEC_BM( 439c, 1002, 0x00, ATA_UDMA6, "ATI IXP700" , 0 ),
- PCI_DEV_HW_SPEC_BM( 4390, 1002, 0x00, ATA_SA150, "ATI IXP700" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 4390, 1002, 0x00, ATA_UDMA6, "ATI IXP700" , 0 ),
+ PCI_DEV_HW_SPEC_BM( 4391, 1002, 0x00, ATA_SA150, "ATI IXP700" , UNIATA_SATA | UNIATA_AHCI ),
PCI_DEV_HW_SPEC_BM( 0004, 1103, 0x05, ATA_UDMA6, "HighPoint HPT372" , HPT372 | 0x00 | UNIATA_RAID_CONTROLLER),
PCI_DEV_HW_SPEC_BM( 0004, 1103, 0x03, ATA_UDMA5, "HighPoint HPT370" , HPT370 | 0x00 | UNIATA_RAID_CONTROLLER),
@@ -557,31 +558,44 @@ BUSMASTER_CONTROLLER_INFORMATION const BusMasterAdapters[] = {
PCI_DEV_HW_SPEC_BM( 2651, 8086, 0x00, ATA_SA150, "Intel ICH6" , UNIATA_SATA | UNIATA_AHCI ),
PCI_DEV_HW_SPEC_BM( 2652, 8086, 0x00, ATA_SA150, "Intel ICH6" , UNIATA_SATA | UNIATA_AHCI ),
PCI_DEV_HW_SPEC_BM( 2653, 8086, 0x00, ATA_SA150, "Intel ICH6M" , UNIATA_SATA | UNIATA_AHCI ),
- PCI_DEV_HW_SPEC_BM( 27df, 8086, 0x00, ATA_UDMA5, "Intel ICH7" , 0 ),
- PCI_DEV_HW_SPEC_BM( 27c0, 8086, 0x00, ATA_SA300, "Intel ICH7" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 27c0, 8086, 0x00, ATA_UDMA5, "Intel ICH7" , 0 ),
PCI_DEV_HW_SPEC_BM( 27c1, 8086, 0x00, ATA_SA300, "Intel ICH7" , UNIATA_SATA | UNIATA_AHCI ),
PCI_DEV_HW_SPEC_BM( 27c3, 8086, 0x00, ATA_SA300, "Intel ICH7" , UNIATA_SATA | UNIATA_AHCI ),
- PCI_DEV_HW_SPEC_BM( 27c4, 8086, 0x00, ATA_SA300, "Intel ICH7M" , UNIATA_SATA | UNIATA_AHCI ),
- PCI_DEV_HW_SPEC_BM( 27c5, 8086, 0x00, ATA_SA300, "Intel ICH7M" , UNIATA_SATA | UNIATA_AHCI ),
- PCI_DEV_HW_SPEC_BM( 27c6, 8086, 0x00, ATA_SA300, "Intel ICH7M" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 27c4, 8086, 0x00, ATA_UDMA5, "Intel ICH7M" , 0 ),
+ PCI_DEV_HW_SPEC_BM( 27c5, 8086, 0x00, ATA_SA150, "Intel ICH7M" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 27c6, 8086, 0x00, ATA_SA150, "Intel ICH7M" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 27df, 8086, 0x00, ATA_UDMA5, "Intel ICH7" , 0 ),
PCI_DEV_HW_SPEC_BM( 269e, 8086, 0x00, ATA_UDMA5, "Intel 63XXESB2" , 0 ),
PCI_DEV_HW_SPEC_BM( 2680, 8086, 0x00, ATA_SA300, "Intel 63XXESB2" , UNIATA_SATA | UNIATA_AHCI ),
PCI_DEV_HW_SPEC_BM( 2681, 8086, 0x00, ATA_SA300, "Intel 63XXESB2" , UNIATA_SATA | UNIATA_AHCI ),
PCI_DEV_HW_SPEC_BM( 2682, 8086, 0x00, ATA_SA300, "Intel 63XXESB2" , UNIATA_SATA | UNIATA_AHCI ),
PCI_DEV_HW_SPEC_BM( 2683, 8086, 0x00, ATA_SA300, "Intel 63XXESB2" , UNIATA_SATA | UNIATA_AHCI ),
- PCI_DEV_HW_SPEC_BM( 2820, 8086, 0x00, ATA_SA300, "Intel ICH8" , 0 ),
+ PCI_DEV_HW_SPEC_BM( 2820, 8086, 0x00, ATA_UDMA5, "Intel ICH8" , 0 ),
PCI_DEV_HW_SPEC_BM( 2821, 8086, 0x00, ATA_SA300, "Intel ICH8" , UNIATA_SATA | UNIATA_AHCI ),
PCI_DEV_HW_SPEC_BM( 2822, 8086, 0x00, ATA_SA300, "Intel ICH8" , UNIATA_SATA | UNIATA_AHCI ),
PCI_DEV_HW_SPEC_BM( 2824, 8086, 0x00, ATA_SA300, "Intel ICH8" , UNIATA_SATA | UNIATA_AHCI ),
- PCI_DEV_HW_SPEC_BM( 2825, 8086, 0x00, ATA_SA300, "Intel ICH8" , UNIATA_SATA | UNIATA_AHCI ),
-// PCI_DEV_HW_SPEC_BM( 2828, 8086, 0x00, ATA_SA300, "Intel ICH8M" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 2825, 8086, 0x00, ATA_UDMA5, "Intel ICH8" , 0 ),
+ PCI_DEV_HW_SPEC_BM( 2828, 8086, 0x00, ATA_UDMA5, "Intel ICH8M" , 0 ),
PCI_DEV_HW_SPEC_BM( 2829, 8086, 0x00, ATA_SA300, "Intel ICH8M" , UNIATA_SATA | UNIATA_AHCI ),
PCI_DEV_HW_SPEC_BM( 282a, 8086, 0x00, ATA_SA300, "Intel ICH8M" , UNIATA_SATA | UNIATA_AHCI ),
-// PCI_DEV_HW_SPEC_BM( 2850, 8086, 0x00, ATA_SA300, "Intel ICH8M" , UNIATA_SATA ),
- PCI_DEV_HW_SPEC_BM( 2920, 8086, 0x00, ATA_SA300, "Intel ICH9" , UNIATA_SATA | UNIATA_AHCI ),
- PCI_DEV_HW_SPEC_BM( 2926, 8086, 0x00, ATA_SA300, "Intel ICH9" , UNIATA_SATA | UNIATA_AHCI ),
- PCI_DEV_HW_SPEC_BM( 2923, 8086, 0x00, ATA_SA300, "Intel ICH9" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 2850, 8086, 0x00, ATA_UDMA5, "Intel ICH8M" , 0 ),
+ PCI_DEV_HW_SPEC_BM( 2920, 8086, 0x00, ATA_UDMA5, "Intel ICH9R/DO/DH", 0 ),
+ PCI_DEV_HW_SPEC_BM( 2921, 8086, 0x00, ATA_UDMA5, "Intel ICH9" , 0 ),
PCI_DEV_HW_SPEC_BM( 2922, 8086, 0x00, ATA_SA300, "Intel ICH9" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 2923, 8086, 0x00, ATA_SA300, "Intel ICH9" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 2926, 8086, 0x00, ATA_UDMA5, "Intel ICH9" , 0 ),
+ PCI_DEV_HW_SPEC_BM( 2928, 8086, 0x00, ATA_UDMA5, "Intel ICH9M/M-E" , 0 ),
+ PCI_DEV_HW_SPEC_BM( 2929, 8086, 0x00, ATA_SA300, "Intel ICH9M/M-E" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 292d, 8086, 0x00, ATA_UDMA5, "Intel ICH9M/M-E" , 0 ),
+ PCI_DEV_HW_SPEC_BM( 3a00, 8086, 0x00, ATA_UDMA5, "Intel ICH10" , 0 ),
+ PCI_DEV_HW_SPEC_BM( 3a02, 8086, 0x00, ATA_SA300, "Intel ICH10" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 3a03, 8086, 0x00, ATA_SA300, "Intel ICH10" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 3a06, 8086, 0x00, ATA_UDMA5, "Intel ICH10" , 0 ),
+ PCI_DEV_HW_SPEC_BM( 3a20, 8086, 0x00, ATA_UDMA5, "Intel ICH10" , 0 ),
+ PCI_DEV_HW_SPEC_BM( 3a22, 8086, 0x00, ATA_SA300, "Intel ICH10" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 3a23, 8086, 0x00, ATA_SA300, "Intel ICH10" , UNIATA_SATA | UNIATA_AHCI ),
+ PCI_DEV_HW_SPEC_BM( 3a26, 8086, 0x00, ATA_UDMA5, "Intel ICH10" , 0 ),
+
// PCI_DEV_HW_SPEC_BM( 3200, 8086, 0x00, ATA_SA150, "Intel 31244" , UNIATA_SATA ),
/*
PCI_DEV_HW_SPEC_BM( 5040, 11ab, 0x00, ATA_SA150, "Marvell 88SX5040" , UNIATA_SATA ),
diff --git a/reactos/drivers/storage/ide/uniata/id_init.cpp b/reactos/drivers/storage/ide/uniata/id_init.cpp
index 602abcdb463..ea3f39a5568 100644
--- a/reactos/drivers/storage/ide/uniata/id_init.cpp
+++ b/reactos/drivers/storage/ide/uniata/id_init.cpp
@@ -96,8 +96,8 @@ UniataChipDetectChannels(
case ATA_ATI_ID:
KdPrint2((PRINT_PREFIX "ATI\n"));
switch(deviceExtension->DevID) {
- case 0x438c1002:
- case 0x439c1002:
+ case ATA_ATI_IXP600:
+ case ATA_ATI_IXP700:
/* IXP600 & IXP700 only have 1 PATA channel */
if(BMList[deviceExtension->DevIndex].channel) {
KdPrint2((PRINT_PREFIX "New ATI no 2nd PATA chan\n"));
diff --git a/reactos/drivers/storage/port/directory.rbuild b/reactos/drivers/storage/port/directory.rbuild
index cb52a518b4f..a5fa321ae73 100644
--- a/reactos/drivers/storage/port/directory.rbuild
+++ b/reactos/drivers/storage/port/directory.rbuild
@@ -4,7 +4,4 @@
-
-
-
diff --git a/reactos/drivers/usb/nt4compat/usbdriver/ehci.c b/reactos/drivers/usb/nt4compat/usbdriver/ehci.c
index 08642ef853b..54018ffdea3 100644
--- a/reactos/drivers/usb/nt4compat/usbdriver/ehci.c
+++ b/reactos/drivers/usb/nt4compat/usbdriver/ehci.c
@@ -3482,7 +3482,7 @@ ehci_probe(PDRIVER_OBJECT drvr_obj, PUNICODE_STRING reg_path, PUSB_DEV_MANAGER d
KeSynchronizeExecution(pdev_ext->ehci_int, ehci_cal_cpu_freq, NULL);
}
}
- return NULL;
+ return pdev;
}
PDEVICE_OBJECT
diff --git a/reactos/drivers/usb/nt4compat/usbdriver/ohci.c b/reactos/drivers/usb/nt4compat/usbdriver/ohci.c
index 6a6497eca2d..52b58692abd 100644
--- a/reactos/drivers/usb/nt4compat/usbdriver/ohci.c
+++ b/reactos/drivers/usb/nt4compat/usbdriver/ohci.c
@@ -236,7 +236,7 @@ PDEVICE_OBJECT ohci_probe(PDRIVER_OBJECT drvr_obj, PUNICODE_STRING reg_path,
//KeSynchronizeExecution(pdev_ext->ohci_int, ehci_cal_cpu_freq, NULL);
}
}
- return NULL;
+ return pdev;
}
BOOLEAN ohci_mem_init (POHCI_DEVICE_EXTENSION dev_ext)
diff --git a/reactos/drivers/usb/nt4compat/usbdriver/uhci.c b/reactos/drivers/usb/nt4compat/usbdriver/uhci.c
index 61b8eeba189..fa239ae8e1f 100644
--- a/reactos/drivers/usb/nt4compat/usbdriver/uhci.c
+++ b/reactos/drivers/usb/nt4compat/usbdriver/uhci.c
@@ -651,9 +651,8 @@ uhci_probe(PDRIVER_OBJECT drvr_obj, PUNICODE_STRING reg_path, PUSB_DEV_MANAGER d
#ifdef _MULTI_UHCI
{
pdev = uhci_alloc(drvr_obj, reg_path, ((bus << 8) | (i << 3) | j), dev_mgr);
- count++;
- if (!pdev)
- return NULL;
+ if (pdev)
+ count++;
}
#else
pdev = uhci_alloc(drvr_obj, reg_path, ((bus << 8) | (i << 3) | j), dev_mgr);
@@ -667,7 +666,9 @@ uhci_probe(PDRIVER_OBJECT drvr_obj, PUNICODE_STRING reg_path, PUSB_DEV_MANAGER d
}
}
+#ifndef _MULTI_UHCI
LBL_LOOPOUT:
+#endif
if (pdev)
{
pdev_ext = pdev->DeviceExtension;
@@ -677,7 +678,7 @@ LBL_LOOPOUT:
KeSynchronizeExecution(pdev_ext->uhci_int, uhci_cal_cpu_freq, NULL);
}
}
- return NULL;
+ return pdev;
}
PDEVICE_OBJECT
diff --git a/reactos/drivers/video/displays/framebuf/pointer.c b/reactos/drivers/video/displays/framebuf/pointer.c
index 9b1b1136829..cd41ff07f20 100644
--- a/reactos/drivers/video/displays/framebuf/pointer.c
+++ b/reactos/drivers/video/displays/framebuf/pointer.c
@@ -65,7 +65,7 @@ DrvMovePointer(
IN LONG y,
IN RECTL *prcl)
{
- return EngMovePointer(pso, x, y, prcl);
+ EngMovePointer(pso, x, y, prcl);
}
#else
diff --git a/reactos/drivers/video/font/bmfd/bmfd.h b/reactos/drivers/video/font/bmfd/bmfd.h
index 9163253e9d7..d9b5fb599ee 100644
--- a/reactos/drivers/video/font/bmfd/bmfd.h
+++ b/reactos/drivers/video/font/bmfd/bmfd.h
@@ -263,11 +263,15 @@ typedef struct
ULONG
DbgPrint(IN PCHAR Format, IN ...);
-static __inline__
-void
-DbgBreakPoint(void)
+FORCEINLINE
+VOID
+DbgBreakPoint(VOID)
{
+#ifdef __GNUC__
asm volatile ("int $3");
+#else
+ __asm int 3;
+#endif
}
DHPDEV
diff --git a/reactos/drivers/video/font/ftfd/ftfd.h b/reactos/drivers/video/font/ftfd/ftfd.h
index d043ee933ea..9806a17e317 100644
--- a/reactos/drivers/video/font/ftfd/ftfd.h
+++ b/reactos/drivers/video/font/ftfd/ftfd.h
@@ -52,11 +52,15 @@ typedef struct
ULONG
DbgPrint(IN PCHAR Format, IN ...);
-static __inline__
-void
-DbgBreakPoint(void)
+FORCEINLINE
+VOID
+DbgBreakPoint(VOID)
{
+#ifdef __GNUC__
asm volatile ("int $3");
+#else
+ __asm int 3;
+#endif
}
DHPDEV
diff --git a/reactos/drivers/video/videoprt/agp.c b/reactos/drivers/video/videoprt/agp.c
index b42d0eed5df..f089fda0df4 100644
--- a/reactos/drivers/video/videoprt/agp.c
+++ b/reactos/drivers/video/videoprt/agp.c
@@ -253,6 +253,7 @@ IntAgpCommitVirtual(
{
PVIDEO_PORT_AGP_VIRTUAL_MAPPING VirtualMapping;
PVOID BaseAddress = NULL;
+ PHYSICAL_ADDRESS PhysicalAddress;
NTSTATUS Status;
TRACE_(VIDEOPRT, "AgpCommitVirtual - VirtualContext: 0x%x Pages: %d, Offset: 0x%x\n",
@@ -279,7 +280,7 @@ IntAgpCommitVirtual(
ULONG OffsetInBytes = Offset * PAGE_SIZE;
BaseAddress = (PVOID)((ULONG_PTR)VirtualMapping->MappedAddress +
OffsetInBytes);
- PHYSICAL_ADDRESS PhysicalAddress = VirtualMapping->AgpMapping->PhysicalAddress;
+ PhysicalAddress = VirtualMapping->AgpMapping->PhysicalAddress;
PhysicalAddress.QuadPart += OffsetInBytes;
Status = ZwFreeVirtualMemory(VirtualMapping->ProcessHandle,
diff --git a/reactos/drivers/video/videoprt/event.c b/reactos/drivers/video/videoprt/event.c
index 06ea92248ea..4cc1e82ea8b 100644
--- a/reactos/drivers/video/videoprt/event.c
+++ b/reactos/drivers/video/videoprt/event.c
@@ -35,22 +35,30 @@ VideoPortCreateEvent(
IN PVOID Unused,
OUT PEVENT *Event)
{
- EVENT_TYPE Type;
+ PVIDEO_PORT_EVENT VpEvent;
+ EVENT_TYPE Type = SynchronizationEvent;
- (*Event) = ExAllocatePoolWithTag(
+ /* Allocate storage for the event structure */
+ VpEvent = ExAllocatePoolWithTag(
NonPagedPool,
- sizeof(KEVENT),
+ sizeof(VIDEO_PORT_EVENT),
TAG_VIDEO_PORT);
- if ((*Event) == NULL)
- return ERROR_NOT_ENOUGH_MEMORY;
+ /* Fail if not enough memory */
+ if (!VpEvent) return ERROR_NOT_ENOUGH_MEMORY;
+ /* Initialize the event structure */
+ RtlZeroMemory(VpEvent, sizeof(VIDEO_PORT_EVENT));
+ VpEvent->pKEvent = &VpEvent->Event;
+
+ /* Determine the event type */
if (EventFlag & NOTIFICATION_EVENT)
Type = NotificationEvent;
- else
- Type = SynchronizationEvent;
- KeInitializeEvent((PKEVENT)*Event, Type, EventFlag & INITIAL_EVENT_SIGNALED);
+ /* Initialize kernel event */
+ KeInitializeEvent(VpEvent->pKEvent, Type, EventFlag & INITIAL_EVENT_SIGNALED);
+
+ /* Indicate success */
return NO_ERROR;
}
@@ -63,7 +71,10 @@ VideoPortDeleteEvent(
IN PVOID HwDeviceExtension,
IN PEVENT Event)
{
+ /* Free storage */
ExFreePool(Event);
+
+ /* Indicate success */
return NO_ERROR;
}
@@ -76,7 +87,7 @@ VideoPortSetEvent(
IN PVOID HwDeviceExtension,
IN PEVENT Event)
{
- return KeSetEvent((PKEVENT)Event, IO_NO_INCREMENT, FALSE);
+ return KeSetEvent(Event->pKEvent, IO_NO_INCREMENT, FALSE);
}
/*
@@ -88,7 +99,7 @@ VideoPortClearEvent(
IN PVOID HwDeviceExtension,
IN PEVENT Event)
{
- KeClearEvent((PKEVENT)Event);
+ KeClearEvent(Event->pKEvent);
}
/*
diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h
index 9e66cd4f3a7..ca4854d642b 100644
--- a/reactos/drivers/video/videoprt/videoprt.h
+++ b/reactos/drivers/video/videoprt/videoprt.h
@@ -104,6 +104,15 @@ typedef struct _VIDEO_PORT_DEVICE_EXTENSTION
VIDEO_PORT_DEVICE_EXTENSION, \
MiniPortDeviceExtension)
+typedef struct _VIDEO_PORT_EVENT
+{
+ /* Public part */
+ ENG_EVENT;
+
+ /* Private part */
+ KEVENT Event;
+} VIDEO_PORT_EVENT, *PVIDEO_PORT_EVENT;
+
/* agp.c */
NTSTATUS
diff --git a/reactos/drivers/video/videoprt/videoprt.rbuild b/reactos/drivers/video/videoprt/videoprt.rbuild
index 33e85561e6e..992c20f3473 100644
--- a/reactos/drivers/video/videoprt/videoprt.rbuild
+++ b/reactos/drivers/video/videoprt/videoprt.rbuild
@@ -5,6 +5,7 @@
.
include
+ -fms-extensions
ntoskrnl
hal
videoprt.h
diff --git a/reactos/drivers/wdm/audio/backpln/audio_test/audio_test.c b/reactos/drivers/wdm/audio/backpln/audio_test/audio_test.c
index 0ee134b2e53..609d1de13b8 100644
--- a/reactos/drivers/wdm/audio/backpln/audio_test/audio_test.c
+++ b/reactos/drivers/wdm/audio/backpln/audio_test/audio_test.c
@@ -124,7 +124,7 @@ main(int argc, char* argv[])
i++;
}
- DeviceInfo.State = KSSTATE_RUN;
+ DeviceInfo.u.State = KSSTATE_RUN;
Status = DeviceIoControl(hWdmAud, IOCTL_SETDEVICE_STATE, (LPVOID)&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &BytesReturned, &Overlapped);
if (!Status)
{
@@ -154,7 +154,7 @@ main(int argc, char* argv[])
printf("WDMAUD: Played buffer\n");
- DeviceInfo.State = KSSTATE_STOP;
+ DeviceInfo.u.State = KSSTATE_STOP;
Status = DeviceIoControl(hWdmAud, IOCTL_SETDEVICE_STATE, (LPVOID)&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &BytesReturned, &Overlapped);
if (!Status)
{
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/adapter.c b/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
index 5849dd921c5..31eb6cf6849 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
@@ -145,6 +145,8 @@ PcAddAdapterDevice(
goto cleanup;
}
+ /* store max subdevice count */
+ portcls_ext->MaxSubDevices = MaxObjects;
/* store the physical device object */
portcls_ext->PhysicalDeviceObject = PhysicalDeviceObject;
/* set up the start device function */
@@ -153,6 +155,14 @@ PcAddAdapterDevice(
InitializeListHead(&portcls_ext->SubDeviceList);
/* prepare the physical connection list */
InitializeListHead(&portcls_ext->PhysicalConnectionList);
+ /* initialize timer lock */
+ KeInitializeSpinLock(&portcls_ext->TimerListLock);
+ /* initialize timer list */
+ InitializeListHead(&portcls_ext->TimerList);
+ /* initialize io timer */
+ IoInitializeTimer(fdo, PcIoTimerRoutine, NULL);
+ /* start the io timer */
+ IoStartTimer(fdo);
/* set io flags */
fdo->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE;
@@ -173,7 +183,7 @@ PcAddAdapterDevice(
if (PrevDeviceObject)
{
/* store the device object in the device header */
- //KsSetDevicePnpBaseObject(portcls_ext->KsDeviceHeader, PrevDeviceObject, fdo);
+ //KsSetDevicePnpBaseObject(portcls_ext->KsDeviceHeader, fdo, PrevDeviceObject);
portcls_ext->PrevDeviceObject = PrevDeviceObject;
}
else
@@ -229,6 +239,8 @@ PcRegisterSubdevice(
SUBDEVICE_DESCRIPTOR * SubDeviceDescriptor;
ULONG Index;
UNICODE_STRING RefName;
+ PSUBDEVICE_ENTRY Entry;
+ PSYMBOLICLINK_ENTRY SymEntry;
DPRINT1("PcRegisterSubdevice DeviceObject %p Name %S Unknown %p\n", DeviceObject, Name, Unknown);
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
@@ -268,12 +280,22 @@ PcRegisterSubdevice(
return STATUS_UNSUCCESSFUL;
}
+ /* allocate subdevice entry */
+ Entry = AllocateItem(NonPagedPool, sizeof(SUBDEVICE_ENTRY), TAG_PORTCLASS);
+ if (!Entry)
+ {
+ /* Insufficient memory */
+ SubDevice->lpVtbl->Release(SubDevice);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
/* add an create item to the device header */
Status = KsAddObjectCreateItemToDeviceHeader(DeviceExt->KsDeviceHeader, PcCreateItemDispatch, (PVOID)SubDevice, Name, NULL);
if (!NT_SUCCESS(Status))
{
/* failed to attach */
SubDevice->lpVtbl->Release(SubDevice);
+ FreeItem(Entry, TAG_PORTCLASS);
DPRINT1("KsAddObjectCreateItemToDeviceHeader failed with %x\n", Status);
return Status;
}
@@ -281,6 +303,14 @@ PcRegisterSubdevice(
/* initialize reference string */
RtlInitUnicodeString(&RefName, Name);
+ /* initialize subdevice entry */
+ Entry->SubDevice = SubDevice;
+ RtlInitUnicodeString(&Entry->Name, Name);
+ InitializeListHead(&Entry->SymbolicLinkList);
+
+ /* store subdevice entry */
+ InsertTailList(&DeviceExt->SubDeviceList, &Entry->Entry);
+
for(Index = 0; Index < SubDeviceDescriptor->InterfaceCount; Index++)
{
/* FIXME
@@ -292,12 +322,26 @@ PcRegisterSubdevice(
&SymbolicLinkName);
if (NT_SUCCESS(Status))
{
+ /* activate device interface */
IoSetDeviceInterfaceState(&SymbolicLinkName, TRUE);
- RtlFreeUnicodeString(&SymbolicLinkName);
+ /* allocate symbolic link entry */
+ SymEntry = AllocateItem(NonPagedPool, sizeof(SYMBOLICLINK_ENTRY), TAG_PORTCLASS);
+ if (SymEntry)
+ {
+ /* initialize symbolic link item */
+ RtlInitUnicodeString(&SymEntry->SymbolicLink, SymbolicLinkName.Buffer);
+ /* store item */
+ InsertTailList(&Entry->SymbolicLinkList, &SymEntry->Entry);
+ }
+ else
+ {
+ /* allocating failed */
+ RtlFreeUnicodeString(&SymbolicLinkName);
+ }
}
}
- /* Release SubDevice reference */
+ /* release SubDevice reference */
SubDevice->lpVtbl->Release(SubDevice);
return STATUS_SUCCESS;
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/api.c b/reactos/drivers/wdm/audio/backpln/portcls/api.c
index a03b6788028..067bd19701d 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/api.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/api.c
@@ -20,8 +20,13 @@ PcGetDeviceProperty(
OUT PVOID PropertyBuffer,
OUT PULONG ResultLength)
{
+ PPCLASS_DEVICE_EXTENSION DeviceExtension;
+
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
- return IoGetDeviceProperty(DeviceObject, DeviceProperty, BufferLength, PropertyBuffer, ResultLength);
+
+ DeviceExtension = (PPCLASS_DEVICE_EXTENSION)((PDEVICE_OBJECT)DeviceObject)->DeviceExtension;
+
+ return IoGetDeviceProperty(DeviceExtension->PhysicalDeviceObject, DeviceProperty, BufferLength, PropertyBuffer, ResultLength);
}
/*
@@ -40,7 +45,41 @@ PcGetTimeInterval(
}
/*
- * @unimplemented
+ * @implemented
+ */
+
+VOID
+NTAPI
+PcIoTimerRoutine(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PVOID Context)
+{
+ PPCLASS_DEVICE_EXTENSION DeviceExtension;
+ KIRQL OldIrql;
+ PLIST_ENTRY ListEntry;
+ PTIMER_CONTEXT CurContext;
+
+ if (!DeviceObject || !DeviceObject->DeviceExtension)
+ return;
+
+ DeviceExtension = (PPCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ KeAcquireSpinLock(&DeviceExtension->TimerListLock, &OldIrql);
+
+ ListEntry = DeviceExtension->TimerList.Flink;
+ while(ListEntry != &DeviceExtension->TimerList)
+ {
+ CurContext = (PTIMER_CONTEXT)CONTAINING_RECORD(ListEntry, TIMER_CONTEXT, Entry);
+
+ CurContext->pTimerRoutine(DeviceObject, CurContext->Context);
+ ListEntry = ListEntry->Flink;
+ }
+
+ KeReleaseSpinLock(&DeviceExtension->TimerListLock, OldIrql);
+}
+
+/*
+ * @implemented
*/
NTSTATUS NTAPI
PcRegisterIoTimeout(
@@ -48,42 +87,107 @@ PcRegisterIoTimeout(
IN PIO_TIMER_ROUTINE pTimerRoutine,
IN PVOID pContext)
{
- NTSTATUS Status;
+ NTSTATUS Status = STATUS_SUCCESS;
+ PTIMER_CONTEXT TimerContext, CurContext;
+ KIRQL OldIrql;
+ PLIST_ENTRY ListEntry;
+ BOOLEAN bFound;
+ PPCLASS_DEVICE_EXTENSION DeviceExtension;
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
- /* FIXME
- * check if timer is already used
- */
+ if (!pDeviceObject || !pDeviceObject->DeviceExtension)
+ return STATUS_INVALID_PARAMETER;
- Status = IoInitializeTimer(pDeviceObject, pTimerRoutine, pContext);
- if (!NT_SUCCESS(Status))
+ DeviceExtension = (PPCLASS_DEVICE_EXTENSION)pDeviceObject->DeviceExtension;
+
+ TimerContext = AllocateItem(NonPagedPool, sizeof(TIMER_CONTEXT), TAG_PORTCLASS);
+ if (!TimerContext)
{
- DPRINT1("IoInitializeTimer failed with %x\n", Status);
- return Status;
+ DPRINT1("Failed to allocate memory\n");
+ return STATUS_INSUFFICIENT_RESOURCES;
}
- IoStartTimer(pDeviceObject);
- return STATUS_SUCCESS;
+ KeAcquireSpinLock(&DeviceExtension->TimerListLock, &OldIrql);
+
+ ListEntry = DeviceExtension->TimerList.Flink;
+ bFound = FALSE;
+ while(ListEntry != &DeviceExtension->TimerList)
+ {
+ CurContext = (PTIMER_CONTEXT)CONTAINING_RECORD(ListEntry, TIMER_CONTEXT, Entry);
+
+ if (CurContext->Context == pContext && CurContext->pTimerRoutine == pTimerRoutine)
+ {
+ bFound = TRUE;
+ Status = STATUS_UNSUCCESSFUL;
+ ExFreePool(TimerContext);
+ break;
+ }
+ ListEntry = ListEntry->Flink;
+ }
+
+ if (!bFound)
+ {
+ TimerContext->Context = pContext;
+ TimerContext->pTimerRoutine = pTimerRoutine;
+ InsertTailList(&DeviceExtension->TimerList, &TimerContext->Entry);
+ }
+
+ KeReleaseSpinLock(&DeviceExtension->TimerListLock, OldIrql);
+
+ return Status;
}
/*
- * @unimplemented
+ * @implemented
*/
-NTSTATUS NTAPI
+NTSTATUS
+NTAPI
PcUnregisterIoTimeout(
IN PDEVICE_OBJECT pDeviceObject,
IN PIO_TIMER_ROUTINE pTimerRoutine,
IN PVOID pContext)
{
+ PTIMER_CONTEXT CurContext;
+ KIRQL OldIrql;
+ PLIST_ENTRY ListEntry;
+ BOOLEAN bFound;
+ PPCLASS_DEVICE_EXTENSION DeviceExtension;
+
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
- /* FIXME
- * check if timer is already used
- */
+ if (!pDeviceObject || !pDeviceObject->DeviceExtension)
+ return STATUS_INVALID_PARAMETER;
- IoStopTimer(pDeviceObject);
- return STATUS_SUCCESS;
+
+ DeviceExtension = (PPCLASS_DEVICE_EXTENSION)pDeviceObject->DeviceExtension;
+
+
+ KeAcquireSpinLock(&DeviceExtension->TimerListLock, &OldIrql);
+
+ ListEntry = DeviceExtension->TimerList.Flink;
+ bFound = FALSE;
+
+ while(ListEntry != &DeviceExtension->TimerList)
+ {
+ CurContext = (PTIMER_CONTEXT)CONTAINING_RECORD(ListEntry, TIMER_CONTEXT, Entry);
+
+ if (CurContext->Context == pContext && CurContext->pTimerRoutine == pTimerRoutine)
+ {
+ bFound = TRUE;
+ RemoveEntryList(&CurContext->Entry);
+ ExFreePool(CurContext);
+ break;
+ }
+ ListEntry = ListEntry->Flink;
+ }
+
+ KeReleaseSpinLock(&DeviceExtension->TimerListLock, OldIrql);
+
+ if (bFound)
+ return STATUS_SUCCESS;
+ else
+ return STATUS_NOT_FOUND;
}
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/connection.c b/reactos/drivers/wdm/audio/backpln/portcls/connection.c
index 0e20e706a36..79855baac61 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/connection.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/connection.c
@@ -9,6 +9,247 @@
#include "private.h"
+typedef struct
+{
+ IUnregisterPhysicalConnectionVtbl *lpVtbl;
+ LONG ref;
+
+}IUnregisterPhysicalConnectionImpl;
+
+NTSTATUS
+NTAPI
+IUnregisterPhysicalConnection_fnQueryInterface(
+ IUnregisterPhysicalConnection* iface,
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ IUnregisterPhysicalConnectionImpl * This = (IUnregisterPhysicalConnectionImpl*)iface;
+
+ if (IsEqualGUIDAligned(refiid, &IID_IUnregisterPhysicalConnection) ||
+ IsEqualGUIDAligned(refiid, &IID_IUnknown))
+ {
+ *Output = &This->lpVtbl;
+ InterlockedIncrement(&This->ref);
+ return STATUS_SUCCESS;
+ }
+
+ return STATUS_UNSUCCESSFUL;
+}
+
+ULONG
+NTAPI
+IUnregisterPhysicalConnection_fnAddRef(
+ IUnregisterPhysicalConnection* iface)
+{
+ IUnregisterPhysicalConnectionImpl * This = (IUnregisterPhysicalConnectionImpl*)iface;
+
+ return InterlockedIncrement(&This->ref);
+}
+
+ULONG
+NTAPI
+IUnregisterPhysicalConnection_fnRelease(
+ IUnregisterPhysicalConnection* iface)
+{
+ IUnregisterPhysicalConnectionImpl * This = (IUnregisterPhysicalConnectionImpl*)iface;
+
+ InterlockedDecrement(&This->ref);
+
+ if (This->ref == 0)
+ {
+ FreeItem(This, TAG_PORTCLASS);
+ return 0;
+ }
+ return This->ref;
+}
+
+static
+NTSTATUS
+UnRegisterConnection(
+ IN OUT PDEVICE_OBJECT DeviceObject,
+ IN PUNKNOWN FromUnknown,
+ IN PUNICODE_STRING FromString,
+ IN ULONG FromPin,
+ IN PUNKNOWN ToUnknown,
+ IN PUNICODE_STRING ToString,
+ IN ULONG ToPin)
+{
+ PLIST_ENTRY Entry;
+ PPHYSICAL_CONNECTION Connection;
+ PPCLASS_DEVICE_EXTENSION DeviceExt;
+ NTSTATUS Status;
+ ISubdevice * FromSubDevice = NULL;
+ ISubdevice * ToSubDevice = NULL;
+ ULONG bFound;
+
+ DeviceExt = (PPCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ if (FromUnknown)
+ {
+ /* get our private interface */
+ Status = FromUnknown->lpVtbl->QueryInterface(FromUnknown, &IID_ISubdevice, (PVOID*)&FromSubDevice);
+ if (!NT_SUCCESS(Status))
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ if (ToUnknown)
+ {
+ Status = ToUnknown->lpVtbl->QueryInterface(ToUnknown, &IID_ISubdevice, (PVOID*)&ToSubDevice);
+ if (!NT_SUCCESS(Status))
+ goto cleanup;
+ }
+
+
+ Entry = DeviceExt->PhysicalConnectionList.Flink;
+ bFound = FALSE;
+ /* loop physical connection list */
+ while(Entry != &DeviceExt->PhysicalConnectionList)
+ {
+ Connection = (PPHYSICAL_CONNECTION)CONTAINING_RECORD(Entry, PHYSICAL_CONNECTION, Entry);
+ /* compare current entry */
+ if (Connection->FromPin == FromPin && Connection->ToPin == ToPin &&
+ Connection->FromSubDevice == FromSubDevice && Connection->ToSubDevice == ToSubDevice)
+ {
+ if (FromString && Connection->FromUnicodeString.Buffer)
+ {
+ if (!RtlCompareUnicodeString(FromString, &Connection->FromUnicodeString, TRUE))
+ {
+ /* UnregisterPhysicalConnectionFromExternal */
+ bFound = TRUE;
+ break;
+ }
+ }
+ else if (ToString && Connection->ToUnicodeString.Buffer)
+ {
+ if (!RtlCompareUnicodeString(ToString, &Connection->ToUnicodeString, TRUE))
+ {
+ /* UnregisterPhysicalConnectionToExternal */
+ bFound = TRUE;
+ break;
+ }
+ }
+ else
+ {
+ /* UnregisterPhysicalConnection */
+ bFound = TRUE;
+ break;
+ }
+ }
+ Entry = Entry->Flink;
+ }
+
+ if (!bFound)
+ {
+ /* not found */
+ Status = STATUS_NOT_FOUND;
+ goto cleanup;
+ }
+
+ /* remove list entry */
+ RemoveEntryList(&Connection->Entry);
+
+ /* release resources */
+ if (Connection->FromSubDevice)
+ Connection->FromSubDevice->lpVtbl->Release(Connection->FromSubDevice);
+
+
+ if (Connection->ToSubDevice)
+ Connection->ToSubDevice->lpVtbl->Release(Connection->ToSubDevice);
+
+ if (Connection->FromUnicodeString.Buffer)
+ RtlFreeUnicodeString(&Connection->FromUnicodeString);
+
+ if (Connection->ToUnicodeString.Buffer)
+ RtlFreeUnicodeString(&Connection->ToUnicodeString);
+
+ FreeItem(Connection, TAG_PORTCLASS);
+ Status = STATUS_SUCCESS;
+
+cleanup:
+
+ if (FromSubDevice)
+ FromSubDevice->lpVtbl->Release(FromSubDevice);
+
+ if (ToSubDevice)
+ ToSubDevice->lpVtbl->Release(ToSubDevice);
+
+ return Status;
+
+}
+
+NTSTATUS
+NTAPI
+IUnregisterPhysicalConnection_fnUnregisterPhysicalConnection(
+ IN IUnregisterPhysicalConnection* iface,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PUNKNOWN FromUnknown,
+ IN ULONG FromPin,
+ IN PUNKNOWN ToUnknown,
+ IN ULONG ToPin)
+{
+ if (!DeviceObject || !FromUnknown || !ToUnknown)
+ return STATUS_INVALID_PARAMETER;
+
+ return UnRegisterConnection(DeviceObject, FromUnknown, NULL, FromPin, ToUnknown, NULL, ToPin);
+}
+
+NTSTATUS
+NTAPI
+IUnregisterPhysicalConnection_fnUnregisterPhysicalConnectionToExternal(
+ IN IUnregisterPhysicalConnection* iface,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PUNKNOWN FromUnknown,
+ IN ULONG FromPin,
+ IN PUNICODE_STRING ToString,
+ IN ULONG ToPin)
+{
+ if (!DeviceObject || !FromUnknown || !ToString)
+ return STATUS_INVALID_PARAMETER;
+
+ return UnRegisterConnection(DeviceObject, FromUnknown, NULL, FromPin, NULL, ToString, ToPin);
+}
+
+NTSTATUS
+NTAPI
+IUnregisterPhysicalConnection_fnUnregisterPhysicalConnectionFromExternal(
+ IN IUnregisterPhysicalConnection* iface,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PUNICODE_STRING FromString,
+ IN ULONG FromPin,
+ IN PUNKNOWN ToUnknown,
+ IN ULONG ToPin)
+{
+ if (!DeviceObject || !FromString || !ToUnknown)
+ return STATUS_INVALID_PARAMETER;
+
+ return UnRegisterConnection(DeviceObject, NULL, FromString, FromPin, ToUnknown, NULL, ToPin);
+}
+
+static IUnregisterPhysicalConnectionVtbl vt_IUnregisterPhysicalConnection =
+{
+ IUnregisterPhysicalConnection_fnQueryInterface,
+ IUnregisterPhysicalConnection_fnAddRef,
+ IUnregisterPhysicalConnection_fnRelease,
+ IUnregisterPhysicalConnection_fnUnregisterPhysicalConnection,
+ IUnregisterPhysicalConnection_fnUnregisterPhysicalConnectionToExternal,
+ IUnregisterPhysicalConnection_fnUnregisterPhysicalConnectionFromExternal
+};
+
+NTSTATUS
+NTAPI
+NewIUnregisterPhysicalConnection(
+ OUT PUNREGISTERPHYSICALCONNECTION *OutConnection)
+{
+ IUnregisterPhysicalConnectionImpl * This = (IUnregisterPhysicalConnectionImpl*)AllocateItem(NonPagedPool, sizeof(IUnregisterPhysicalConnectionImpl), TAG_PORTCLASS);
+
+ if (!This)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ This->lpVtbl = &vt_IUnregisterPhysicalConnection;
+ This->ref = 1;
+ *OutConnection = (PUNREGISTERPHYSICALCONNECTION)&This->lpVtbl;
+ return STATUS_SUCCESS;
+}
NTSYSAPI
BOOLEAN
@@ -30,75 +271,66 @@ RegisterConnection(
IN ULONG ToPin)
{
PHYSICAL_CONNECTION *NewConnection;
- UNICODE_STRING FromUnicodeString = {0, 0, 0};
- UNICODE_STRING ToUnicodeString = {0, 0, 0};
- ISubdevice * FromSubDevice = NULL;
- ISubdevice * ToSubDevice = NULL;
PPCLASS_DEVICE_EXTENSION DeviceExt;
+ NTSTATUS Status;
DeviceExt = (PPCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- if (FromUnknown)
- {
- Status = FromUnknown->lpVtbl->QueryInterface(FromUnknown, &IID_ISubdevice, (PVOID*)&FromSubDevice);
- if (!NT_SUCCESS(Status))
- return STATUS_INVALID_PARAMETER;
- }
- else
- {
- if (!RtlCreateUnicodeString(&FromUnicodeString, (PCWSTR)FromString))
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- if (ToUnknown)
- {
- Status = ToUnknown->lpVtbl->QueryInterface(ToUnknown, &IID_ISubdevice, (PVOID*)&ToSubDevice);
- }
- else
- {
- if (!RtlCreateUnicodeString(&ToUnicodeString, (PCWSTR)ToString))
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
-
- if (!NT_SUCCESS(Status))
- {
- goto cleanup;
- }
-
NewConnection = AllocateItem(NonPagedPool, sizeof(PHYSICAL_CONNECTION), TAG_PORTCLASS);
if (!NewConnection)
{
- Status = STATUS_INSUFFICIENT_RESOURCES;
- goto cleanup;
+ return STATUS_INSUFFICIENT_RESOURCES;
}
- NewConnection->FromPin = FromPin;
- NewConnection->FromSubDevice = FromSubDevice;
- NewConnection->FromUnicodeString = FromUnicodeString.Buffer;
- NewConnection->ToPin = ToPin;
- NewConnection->ToSubDevice = ToSubDevice;
- NewConnection->ToUnicodeString = ToUnicodeString.Buffer;
+ if (FromUnknown)
+ {
+ Status = FromUnknown->lpVtbl->QueryInterface(FromUnknown, &IID_ISubdevice, (PVOID*)&NewConnection->FromSubDevice);
+ if (!NT_SUCCESS(Status))
+ goto cleanup;
+ }
+ else
+ {
+ if (!RtlCreateUnicodeString(&NewConnection->FromUnicodeString, (PCWSTR)FromString))
+ {
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto cleanup;
+ }
+ }
+
+ if (ToUnknown)
+ {
+ Status = ToUnknown->lpVtbl->QueryInterface(ToUnknown, &IID_ISubdevice, (PVOID*)&NewConnection->ToSubDevice);
+ if (!NT_SUCCESS(Status))
+ goto cleanup;
+ }
+ else
+ {
+ if (!RtlCreateUnicodeString(&NewConnection->ToUnicodeString, (PCWSTR)ToString))
+ {
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto cleanup;
+ }
+ }
InsertTailList(&DeviceExt->PhysicalConnectionList, &NewConnection->Entry);
return STATUS_SUCCESS;
cleanup:
- if (FromSubDevice)
- FromSubDevice->lpVtbl->Release(FromSubDevice);
+ if (NewConnection->FromSubDevice)
+ NewConnection->FromSubDevice->lpVtbl->Release(NewConnection->FromSubDevice);
- if (ToSubDevice)
- ToSubDevice->lpVtbl->Release(ToSubDevice);
+ if (NewConnection->ToSubDevice)
+ NewConnection->ToSubDevice->lpVtbl->Release(NewConnection->ToSubDevice);
- if (FromUnicodeString.Buffer)
- RtlFreeUnicodeString(&FromUnicodeString);
+ if (NewConnection->FromUnicodeString.Buffer)
+ RtlFreeUnicodeString(&NewConnection->FromUnicodeString);
- if (ToUnicodeString.Buffer)
- RtlFreeUnicodeString(&ToUnicodeString);
+ if (NewConnection->ToUnicodeString.Buffer)
+ RtlFreeUnicodeString(&NewConnection->ToUnicodeString);
+
+ FreeItem(NewConnection, TAG_PORTCLASS);
return Status;
}
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c b/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c
index 916e9a95a23..fff89490378 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c
@@ -15,13 +15,15 @@ Dispatch_fnDeviceIoControl(
PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
+ PIO_STACK_LOCATION IoStack;
IIrpTarget * IrpTarget;
- PKSOBJECT_CREATE_ITEM CreateItem;
- /* access the create item */
- CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
- /* get the IrpTarget */
- IrpTarget = (IIrpTarget*)CreateItem->Context;
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* access IrpTarget */
+ IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
/* let IrpTarget handle request */
return IrpTarget->lpVtbl->DeviceIoControl(IrpTarget, DeviceObject, Irp);
}
@@ -32,13 +34,16 @@ Dispatch_fnRead(
PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
+ PIO_STACK_LOCATION IoStack;
IIrpTarget * IrpTarget;
- PKSOBJECT_CREATE_ITEM CreateItem;
- /* access the create item */
- CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
- /* get the IrpTarget */
- IrpTarget = (IIrpTarget*)CreateItem->Context;
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* access IrpTarget */
+ IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
+
/* let IrpTarget handle request */
return IrpTarget->lpVtbl->Read(IrpTarget, DeviceObject, Irp);
}
@@ -49,13 +54,16 @@ Dispatch_fnWrite(
PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
+ PIO_STACK_LOCATION IoStack;
IIrpTarget * IrpTarget;
- PKSOBJECT_CREATE_ITEM CreateItem;
- /* access the create item */
- CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
- /* get the IrpTarget */
- IrpTarget = (IIrpTarget*)CreateItem->Context;
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* access IrpTarget */
+ IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
+
/* let IrpTarget handle request */
return IrpTarget->lpVtbl->Write(IrpTarget, DeviceObject, Irp);
}
@@ -66,13 +74,16 @@ Dispatch_fnFlush(
PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
+ PIO_STACK_LOCATION IoStack;
IIrpTarget * IrpTarget;
- PKSOBJECT_CREATE_ITEM CreateItem;
- /* access the create item */
- CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
- /* get the IrpTarget */
- IrpTarget = (IIrpTarget*)CreateItem->Context;
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* access IrpTarget */
+ IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
+
/* let IrpTarget handle request */
return IrpTarget->lpVtbl->Flush(IrpTarget, DeviceObject, Irp);
}
@@ -83,13 +94,16 @@ Dispatch_fnClose(
PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
+ PIO_STACK_LOCATION IoStack;
IIrpTarget * IrpTarget;
- PKSOBJECT_CREATE_ITEM CreateItem;
- /* access the create item */
- CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
- /* get the IrpTarget */
- IrpTarget = (IIrpTarget*)CreateItem->Context;
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* access IrpTarget */
+ IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
+
/* let IrpTarget handle request */
return IrpTarget->lpVtbl->Close(IrpTarget, DeviceObject, Irp);
}
@@ -100,13 +114,16 @@ Dispatch_fnQuerySecurity(
PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
+ PIO_STACK_LOCATION IoStack;
IIrpTarget * IrpTarget;
- PKSOBJECT_CREATE_ITEM CreateItem;
- /* access the create item */
- CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
- /* get the IrpTarget */
- IrpTarget = (IIrpTarget*)CreateItem->Context;
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* access IrpTarget */
+ IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
+
/* let IrpTarget handle request */
return IrpTarget->lpVtbl->QuerySecurity(IrpTarget, DeviceObject, Irp);
}
@@ -117,13 +134,16 @@ Dispatch_fnSetSecurity(
PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
+ PIO_STACK_LOCATION IoStack;
IIrpTarget * IrpTarget;
- PKSOBJECT_CREATE_ITEM CreateItem;
- /* access the create item */
- CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
- /* get the IrpTarget */
- IrpTarget = (IIrpTarget*)CreateItem->Context;
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* access IrpTarget */
+ IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
+
/* let IrpTarget handle request */
return IrpTarget->lpVtbl->SetSecurity(IrpTarget, DeviceObject, Irp);
}
@@ -212,26 +232,19 @@ NTAPI
NewDispatchObject(
IN PIRP Irp,
IN IIrpTarget * Target,
- IN LPWSTR Name)
+ IN ULONG CreateItemCount,
+ IN PKSOBJECT_CREATE_ITEM CreateItem)
{
NTSTATUS Status;
KSOBJECT_HEADER ObjectHeader;
- PKSOBJECT_CREATE_ITEM CreateItem;
PIO_STACK_LOCATION IoStack;
- CreateItem = AllocateItem(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM), TAG_PORTCLASS);
- if (!CreateItem)
- return STATUS_INSUFFICIENT_RESOURCES;
-
- CreateItem->Context = (PVOID)Target;
- RtlInitUnicodeString(&CreateItem->ObjectClass, Name);
-
+ /* get current irp stack location */
IoStack = IoGetCurrentIrpStackLocation(Irp);
- ASSERT(IoStack->FileObject);
IoStack->FileObject->FsContext2 = (PVOID)Target;
- Status = KsAllocateObjectHeader(&ObjectHeader, 1, CreateItem, Irp, &DispatchTable);
+ Status = KsAllocateObjectHeader(&ObjectHeader, CreateItemCount, CreateItem, Irp, &DispatchTable);
DPRINT("KsAllocateObjectHeader result %x\n", Status);
return Status;
}
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/filter_topology.c b/reactos/drivers/wdm/audio/backpln/portcls/filter_topology.c
index a09ffb77663..8f6badecbd6 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/filter_topology.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/filter_topology.c
@@ -242,7 +242,43 @@ IPortFilterTopology_fnFastDeviceIoControl(
OUT PIO_STATUS_BLOCK StatusBlock,
IN PDEVICE_OBJECT DeviceObject)
{
- return FALSE;
+ ULONG Index;
+ PKSPROPERTY Property;
+ NTSTATUS Status;
+ ISubdevice * SubDevice = NULL;
+ PSUBDEVICE_DESCRIPTOR Descriptor = NULL;
+ IPortFilterTopologyImpl * This = (IPortFilterTopologyImpl*)iface;
+
+ Property = (PKSPROPERTY)InputBuffer;
+
+ if (InputBufferLength < sizeof(KSPROPERTY))
+ return FALSE;
+
+
+ /* get private interface */
+ Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&SubDevice);
+ if (!NT_SUCCESS(Status))
+ return FALSE;
+
+ /* get descriptor */
+ Status = SubDevice->lpVtbl->GetDescriptor(SubDevice, &Descriptor);
+ if (!NT_SUCCESS(Status))
+ {
+ SubDevice->lpVtbl->Release(SubDevice);
+ return FALSE;
+ }
+
+ for(Index = 0; Index < Descriptor->FilterPropertySet.FreeKsPropertySetOffset; Index++)
+ {
+ if (IsEqualGUIDAligned(&Property->Set, Descriptor->FilterPropertySet.Properties[Index].Set))
+ {
+ FastPropertyHandler(FileObject, (PKSPROPERTY)InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, StatusBlock,
+ 1,
+ &Descriptor->FilterPropertySet.Properties[Index],
+ Descriptor, SubDevice);
+ }
+ }
+ return TRUE;
}
/*
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c
index b6934ecdc6b..4abf7ca8859 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c
@@ -138,11 +138,6 @@ IPortFilterWaveCyclic_fnNewIrpTarget(
return Status;
}
- /* release existing pin */
- if (This->Pins[ConnectDetails->PinId])
- {
- This->Pins[ConnectDetails->PinId]->lpVtbl->Release(This->Pins[ConnectDetails->PinId]);
- }
/* store pin */
This->Pins[ConnectDetails->PinId] = Pin;
@@ -409,6 +404,7 @@ IPortFilterWaveCyclic_fnFreePin(
{
if (This->Pins[Index] == Pin)
{
+ This->Descriptor->Factory.Instances[Index].CurrentPinInstanceCount--;
This->Pins[Index]->lpVtbl->Release(This->Pins[Index]);
This->Pins[Index] = NULL;
return STATUS_SUCCESS;
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/filter_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/filter_wavepci.c
index d00c687d4b4..59524758ab5 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/filter_wavepci.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/filter_wavepci.c
@@ -138,11 +138,6 @@ IPortFilterWavePci_fnNewIrpTarget(
return Status;
}
- /* release existing pin */
- if (This->Pins[ConnectDetails->PinId])
- {
- This->Pins[ConnectDetails->PinId]->lpVtbl->Release(This->Pins[ConnectDetails->PinId]);
- }
/* store pin */
This->Pins[ConnectDetails->PinId] = Pin;
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/guids.c b/reactos/drivers/wdm/audio/backpln/portcls/guids.c
index 7f3999c33c8..2d81cace0d4 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/guids.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/guids.c
@@ -91,5 +91,6 @@ const GUID IID_IPortWaveRTStream = {0x1809ce5a, 0x64bc, 0x4e62,
const GUID IID_IMiniportWaveRT = {0x0f9fc4d6, 0x6061, 0x4f3c, {0xb1, 0xfc, 0x7, 0x5e, 0x35, 0xf7, 0x96, 0xa}};
const GUID IID_IMiniportWaveRTStream = {0x000ac9ab, 0xfaab, 0x4f3d, {0x94, 0x55, 0x6f, 0xf8, 0x30, 0x6a, 0x74, 0xa0}};
const GUID IID_IMiniportWaveRTStreamNotification = {0x23759128, 0x96f1, 0x423b, {0xab, 0x4d, 0x81, 0x63, 0x5b, 0xcf, 0x8c, 0xa1}};
-
+const GUID IID_IUnregisterSubdevice = {0x16738177, 0xe199, 0x41f9, {0x9a, 0x87, 0xab, 0xb2, 0xa5, 0x43, 0x2f, 0x21}};
+const GUID IID_IUnregisterPhysicalConnection = {0x6c38e231, 0x2a0d, 0x428d, {0x81, 0xf8, 0x07, 0xcc, 0x42, 0x8b, 0xb9, 0xa4}};
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h
index 77d98c31616..440680a2d28 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h
+++ b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h
@@ -213,7 +213,7 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
STDMETHOD_(ULONG, NumMappings)(THIS);
- STDMETHOD_(ULONG, MinMappings)(THIS);
+ STDMETHOD_(ULONG, NumData)(THIS);
STDMETHOD_(BOOL, MinimumDataAvailable)(THIS);
@@ -234,6 +234,9 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
STDMETHOD_(BOOL, HasLastMappingFailed)(THIS);
STDMETHOD_(VOID, PrintQueueStatus)(THIS);
+ STDMETHOD_(VOID, SetMinimumDataThreshold)(THIS_
+ IN ULONG MinimumDataThreshold);
+ STDMETHOD_(ULONG, GetMinimumDataThreshold)(THIS);
};
@@ -710,4 +713,62 @@ typedef IPortFilterTopology *PPORTFILTERTOPOLOGY;
#undef INTERFACE
+/*****************************************************************************
+ * IPortWaveRTStreamInit
+ *****************************************************************************
+ */
+
+#undef INTERFACE
+#define INTERFACE IPortWaveRTStreamInit
+
+
+DECLARE_INTERFACE_(IPortWaveRTStreamInit, IUnknown)
+{
+ DEFINE_ABSTRACT_UNKNOWN()
+
+ STDMETHOD_(PMDL, AllocatePagesForMdl)
+ ( THIS_
+ IN PHYSICAL_ADDRESS HighAddress,
+ IN SIZE_T TotalBytes
+ ) PURE;
+
+ STDMETHOD_(PMDL, AllocateContiguousPagesForMdl)
+ ( THIS_
+ IN PHYSICAL_ADDRESS LowAddress,
+ IN PHYSICAL_ADDRESS HighAddress,
+ IN SIZE_T TotalBytes
+ ) PURE;
+
+ STDMETHOD_(PVOID, MapAllocatedPages)
+ ( THIS_
+ IN PMDL MemoryDescriptorList,
+ IN MEMORY_CACHING_TYPE CacheType
+ ) PURE;
+
+ STDMETHOD_(VOID, UnmapAllocatedPages)
+ ( THIS_
+ IN PVOID BaseAddress,
+ IN PMDL MemoryDescriptorList
+ ) PURE;
+
+ STDMETHOD_(VOID, FreePagesFromMdl)
+ ( THIS_
+ IN PMDL MemoryDescriptorList
+ ) PURE;
+
+ STDMETHOD_(ULONG, GetPhysicalPagesCount)
+ ( THIS_
+ IN PMDL MemoryDescriptorList
+ ) PURE;
+
+ STDMETHOD_(PHYSICAL_ADDRESS, GetPhysicalPageAddress)
+ ( THIS_
+ IN PPHYSICAL_ADDRESS Address,
+ IN PMDL MemoryDescriptorList,
+ IN ULONG Index
+ ) PURE;
+};
+
+#undef INTERFACE
+
#endif
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c b/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c
index 6d916fccecf..cb3ea1b2755 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c
@@ -154,8 +154,8 @@ IInterruptSync_fnCallSynchronizedRoutine(
return STATUS_UNSUCCESSFUL;
}
-NTAPI
PKINTERRUPT
+NTAPI
IInterruptSync_fnGetKInterrupt(
IN IInterruptSync * iface)
{
@@ -255,12 +255,12 @@ IInterruptSync_fnConnect(
IInterruptServiceRoutine,
(PVOID)This,
&This->Lock,
- Descriptor->u.Interrupt.Vector,
+ Descriptor->u.Interrupt.Vector,
Descriptor->u.Interrupt.Level,
- Descriptor->u.Interrupt.Level, //FIXME
- Descriptor->Flags,
- TRUE,
- Descriptor->u.Interrupt.Affinity,
+ Descriptor->u.Interrupt.Level,
+ (Descriptor->Flags & CM_RESOURCE_INTERRUPT_LATCHED),
+ (Descriptor->Flags != CM_RESOURCE_INTERRUPT_LATCHED),
+ Descriptor->u.Interrupt.Affinity,
FALSE);
DPRINT("IInterruptSync_fnConnect result %x\n", Status);
@@ -347,7 +347,7 @@ PcNewInterruptSync(
DPRINT("PcNewInterruptSync entered OutInterruptSync %p OuterUnknown %p ResourceList %p ResourceIndex %u Mode %d\n",
OutInterruptSync, OuterUnknown, ResourceList, ResourceIndex, Mode);
- if (!OutInterruptSync || !ResourceList || Mode > InterruptSyncModeRepeat || Mode < InterruptSyncModeNormal || Mode > InterruptSyncModeRepeat)
+ if (!OutInterruptSync || !ResourceList || Mode < InterruptSyncModeNormal || Mode > InterruptSyncModeRepeat)
return STATUS_INVALID_PARAMETER;
if (ResourceIndex > ResourceList->lpVtbl->NumberOfEntriesOfType(ResourceList, CmResourceTypeInterrupt))
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irp.c b/reactos/drivers/wdm/audio/backpln/portcls/irp.c
index 6f8dd451867..d731e25cb5f 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/irp.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/irp.c
@@ -43,9 +43,6 @@ PortClsPnp(
PPCLASS_DEVICE_EXTENSION DeviceExt;
PIO_STACK_LOCATION IoStack;
IResourceList* resource_list = NULL;
- ULONG Length;
- WCHAR szMsg[100];
- PIO_ERROR_LOG_PACKET EventEntry;
DPRINT("PortClsPnp called\n");
@@ -100,22 +97,6 @@ PortClsPnp(
if (!NT_SUCCESS(Status))
{
DPRINT("StartDevice returned a failure code [0x%8x]\n", Status);
- swprintf(szMsg, L"%%1 failed to start with %x", Status);
- Length = (wcslen(szMsg) + 1) * sizeof(WCHAR) + sizeof(IO_ERROR_LOG_PACKET);
- if (Length < ERROR_LOG_MAXIMUM_SIZE)
- {
- EventEntry = (PIO_ERROR_LOG_PACKET)IoAllocateErrorLogEntry(DeviceExt->PhysicalDeviceObject, Length);
- if (EventEntry)
- {
- RtlZeroMemory(EventEntry, Length);
- EventEntry->MajorFunctionCode = IRP_MJ_PNP;
- EventEntry->NumberOfStrings = 1;
- EventEntry->StringOffset = sizeof(IO_ERROR_LOG_PACKET);
- EventEntry->ErrorCode = Status;
- wcscpy((LPWSTR)(EventEntry + 1), szMsg);
- IoWriteErrorLogEntry(EventEntry);
- }
- }
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
@@ -143,22 +124,19 @@ PortClsPnp(
case IRP_MN_QUERY_INTERFACE:
DPRINT("IRP_MN_QUERY_INTERFACE\n");
Status = PcForwardIrpSynchronous(DeviceObject, Irp);
- return Status;
-
+ return PcCompleteIrp(DeviceObject, Irp, Status);
case IRP_MN_QUERY_DEVICE_RELATIONS:
DPRINT("IRP_MN_QUERY_DEVICE_RELATIONS\n");
- Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_NOT_SUPPORTED;
+ Status = PcForwardIrpSynchronous(DeviceObject, Irp);
+ return PcCompleteIrp(DeviceObject, Irp, Status);
case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
- DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS Status %x Information %p Information2 %p\n", Irp->IoStatus.Status, Irp->IoStatus.Information, IoStack->Parameters.FilterResourceRequirements.IoResourceRequirementList);
- Status = Irp->IoStatus.Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return Status;
+ DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
+ Status = PcForwardIrpSynchronous(DeviceObject, Irp);
+ return PcCompleteIrp(DeviceObject, Irp, Status);
case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
Status = PcForwardIrpSynchronous(DeviceObject, Irp);
- return Status;
+ return PcCompleteIrp(DeviceObject, Irp, Status);
}
DPRINT1("unhandled function %u\n", IoStack->MinorFunction);
@@ -289,16 +267,23 @@ PcDispatchIrp(
}
/*
- * @unimplemented
+ * @implemented
*/
-NTSTATUS NTAPI
+NTSTATUS
+NTAPI
PcCompleteIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN NTSTATUS Status)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ ASSERT(DeviceObject);
+ ASSERT(Irp);
+ ASSERT(Status != STATUS_PENDING);
+
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return Status;
}
NTSTATUS
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
index 1fecad8d28f..f3e9a6d0038 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
@@ -40,6 +40,7 @@ typedef struct
ULONG OutOfMapping;
ULONG MaxFrameSize;
ULONG Alignment;
+ ULONG MinimumDataThreshold;
}IIrpQueueImpl;
@@ -128,6 +129,7 @@ IIrpQueue_fnInit(
This->DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat;
This->MaxFrameSize = FrameSize;
This->Alignment = Alignment;
+ This->MinimumDataThreshold = ((PKSDATAFORMAT_WAVEFORMATEX)DataFormat)->WaveFormatEx.nAvgBytesPerSec / 3;
InitializeListHead(&This->ListHead);
InitializeListHead(&This->FreeHead);
@@ -296,10 +298,11 @@ IIrpQueue_fnNumMappings(
ULONG
NTAPI
-IIrpQueue_fnMinMappings(
+IIrpQueue_fnNumData(
IN IIrpQueue *iface)
{
- return 25;
+ IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
+ return This->NumDataAvailable;
}
@@ -314,14 +317,15 @@ IIrpQueue_fnMinimumDataAvailable(
if (This->StartStream)
return TRUE;
- if (This->DataFormat->WaveFormatEx.nAvgBytesPerSec < This->NumDataAvailable)
+ if (This->MinimumDataThreshold < This->NumDataAvailable)
{
This->StartStream = TRUE;
Result = TRUE;
}
else
+ {
Result = FALSE;
-
+ }
return Result;
}
@@ -344,8 +348,9 @@ IIrpQueue_fnUpdateFormat(
{
IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
This->DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat;
+ This->MinimumDataThreshold = This->DataFormat->WaveFormatEx.nAvgBytesPerSec / 3;
This->StartStream = FALSE;
-
+ This->NumDataAvailable = 0;
}
NTSTATUS
@@ -472,6 +477,27 @@ IIrpQueue_fnPrintQueueStatus(
DPRINT("IIrpQueue_fnPrintQueueStatus ===============\n");
}
+VOID
+NTAPI
+IIrpQueue_fnSetMinimumDataThreshold(
+ IN IIrpQueue *iface,
+ ULONG MinimumDataThreshold)
+{
+ IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
+
+ This->MinimumDataThreshold = MinimumDataThreshold;
+}
+
+ULONG
+NTAPI
+IIrpQueue_fnGetMinimumDataThreshold(
+ IN IIrpQueue *iface)
+{
+ IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
+
+ return This->MinimumDataThreshold;
+}
+
static IIrpQueueVtbl vt_IIrpQueue =
{
@@ -483,18 +509,18 @@ static IIrpQueueVtbl vt_IIrpQueue =
IIrpQueue_fnGetMapping,
IIrpQueue_fnUpdateMapping,
IIrpQueue_fnNumMappings,
- IIrpQueue_fnMinMappings,
+ IIrpQueue_fnNumData,
IIrpQueue_fnMinimumDataAvailable,
IIrpQueue_fnCancelBuffers,
IIrpQueue_fnUpdateFormat,
IIrpQueue_fnGetMappingWithTag,
IIrpQueue_fnReleaseMappingWithTag,
IIrpQueue_fnHasLastMappingFailed,
- IIrpQueue_fnPrintQueueStatus
-
+ IIrpQueue_fnPrintQueueStatus,
+ IIrpQueue_fnSetMinimumDataThreshold,
+ IIrpQueue_fnGetMinimumDataThreshold
};
-
NTSTATUS
NTAPI
NewIrpQueue(
@@ -512,44 +538,3 @@ NewIrpQueue(
}
-NTSTATUS
-NewIrpStreamPhysical(
- OUT IIrpStreamPhysical ** OutIIrpStreamPhysical,
- IN IUnknown *OuterUnknown)
-{
- return STATUS_UNSUCCESSFUL;
-}
-
-
-/*
- * @implemented
- */
-
-NTSTATUS
-NTAPI
-PcNewIrpStreamPhysical(
- OUT IIrpStreamPhysical ** OutIrpStreamPhysical,
- IN IUnknown * OuterUnknown,
- IN BOOLEAN Wait,
- IN KSPIN_CONNECT *ConnectDetails,
- IN PDEVICE_OBJECT DeviceObject,
- IN PDMA_ADAPTER DmaAdapter)
-{
- NTSTATUS Status;
- IIrpStreamPhysical * Irp;
-
- Status = NewIrpStreamPhysical(&Irp, OuterUnknown);
- if (!NT_SUCCESS(Status))
- return Status;
-
-
- Status = Irp->lpVtbl->Init(Irp, Wait, ConnectDetails, DeviceObject, DmaAdapter);
- if (!NT_SUCCESS(Status))
- {
- Irp->lpVtbl->Release(Irp);
- return Status;
- }
-
- *OutIrpStreamPhysical = Irp;
- return Status;
-}
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.c
index 03fba0984ac..66f8bf7bca3 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.c
@@ -1015,7 +1015,7 @@ IPortPinDMus_fnFastWrite(
}
/*
- * @unimplemented
+ * @implemented
*/
NTSTATUS
NTAPI
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
index 2cf58e87849..885f32b0905 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
@@ -37,7 +37,9 @@ typedef struct
ULONG TotalPackets;
ULONG PreCompleted;
ULONG PostCompleted;
+ ULONG StopCount;
+ ULONG Delay;
}IPortPinWaveCyclicImpl;
@@ -114,7 +116,8 @@ static
VOID
UpdateCommonBuffer(
IPortPinWaveCyclicImpl * This,
- ULONG Position)
+ ULONG Position,
+ ULONG MaxTransferCount)
{
ULONG BufferLength;
ULONG BytesToCopy;
@@ -123,6 +126,8 @@ UpdateCommonBuffer(
NTSTATUS Status;
BufferLength = Position - This->CommonBufferOffset;
+ BufferLength = min(BufferLength, MaxTransferCount);
+
while(BufferLength)
{
Status = This->IrpQueue->lpVtbl->GetMapping(This->IrpQueue, &Buffer, &BufferSize);
@@ -131,7 +136,6 @@ UpdateCommonBuffer(
BytesToCopy = min(BufferLength, BufferSize);
-
if (This->Capture)
{
This->DmaChannel->lpVtbl->CopyTo(This->DmaChannel,
@@ -158,16 +162,18 @@ static
VOID
UpdateCommonBufferOverlap(
IPortPinWaveCyclicImpl * This,
- ULONG Position)
+ ULONG Position,
+ ULONG MaxTransferCount)
{
- ULONG BufferLength;
+ ULONG BufferLength, Length, Gap;
ULONG BytesToCopy;
ULONG BufferSize;
PUCHAR Buffer;
NTSTATUS Status;
- BufferLength = This->CommonBufferSize - This->CommonBufferOffset;
+ BufferLength = Gap = This->CommonBufferSize - This->CommonBufferOffset;
+ BufferLength = Length = min(BufferLength, MaxTransferCount);
while(BufferLength)
{
Status = This->IrpQueue->lpVtbl->GetMapping(This->IrpQueue, &Buffer, &BufferSize);
@@ -196,8 +202,18 @@ UpdateCommonBufferOverlap(
BufferLength = This->CommonBufferSize - This->CommonBufferOffset;
}
- This->CommonBufferOffset = 0;
- UpdateCommonBuffer(This, Position);
+
+ if (Gap == Length)
+ {
+ This->CommonBufferOffset = 0;
+
+ MaxTransferCount -= Length;
+
+ if (MaxTransferCount)
+ {
+ UpdateCommonBuffer(This, Position, MaxTransferCount);
+ }
+ }
}
VOID
@@ -209,6 +225,8 @@ SetStreamWorkerRoutine(
IPortPinWaveCyclicImpl * This;
PSETSTREAM_CONTEXT Ctx = (PSETSTREAM_CONTEXT)Context;
KSSTATE State;
+ ULONG MinimumDataThreshold;
+ ULONG MaximumDataThreshold;
This = Ctx->Pin;
State = Ctx->State;
@@ -220,6 +238,10 @@ SetStreamWorkerRoutine(
if (This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue) && State == KSSTATE_STOP)
return;
+ /* Has the audio state already been set? */
+ if (This->State == State)
+ return;
+
/* Set the state */
if (NT_SUCCESS(This->Stream->lpVtbl->SetState(This->Stream, State)))
{
@@ -230,7 +252,26 @@ SetStreamWorkerRoutine(
{
/* reset start stream */
This->IrpQueue->lpVtbl->CancelBuffers(This->IrpQueue); //FIX function name
- DPRINT1("Stopping PreCompleted %u PostCompleted %u\n", This->PreCompleted, This->PostCompleted);
+
+ /* increase stop counter */
+ This->StopCount++;
+ /* get current data threshold */
+ MinimumDataThreshold = This->IrpQueue->lpVtbl->GetMinimumDataThreshold(This->IrpQueue);
+ /* get maximum data threshold */
+ MaximumDataThreshold = ((PKSDATAFORMAT_WAVEFORMATEX)This->Format)->WaveFormatEx.nAvgBytesPerSec;
+ /* increase minimum data threshold by a third sec */
+ MinimumDataThreshold += This->FrameSize * 10;
+
+ /* assure it has not exceeded */
+ MinimumDataThreshold = min(MinimumDataThreshold, MaximumDataThreshold);
+ /* store minimum data threshold */
+ This->IrpQueue->lpVtbl->SetMinimumDataThreshold(This->IrpQueue, MinimumDataThreshold);
+
+ DPRINT1("Stopping PreCompleted %u PostCompleted %u StopCount %u MinimumDataThreshold %u\n", This->PreCompleted, This->PostCompleted, This->StopCount, MinimumDataThreshold);
+ }
+ if (This->State == KSSTATE_RUN)
+ {
+ DPRINT1("State RUN %x MinAvailable %u\n", State, This->IrpQueue->lpVtbl->MinimumDataAvailable(This->IrpQueue));
}
}
}
@@ -307,11 +348,11 @@ IServiceSink_fnRequestService(
if (Position < This->CommonBufferOffset)
{
- UpdateCommonBufferOverlap(This, Position);
+ UpdateCommonBufferOverlap(This, Position, This->FrameSize);
}
else if (Position >= This->CommonBufferOffset)
{
- UpdateCommonBuffer(This, Position);
+ UpdateCommonBuffer(This, Position, This->FrameSize);
}
}
@@ -431,6 +472,7 @@ IPortPinWaveCyclic_HandleKsProperty(
{
PKSSTATE State = (PKSSTATE)Irp->UserBuffer;
+ ASSERT_IRQL(DISPATCH_LEVEL);
if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KSSTATE))
{
Irp->IoStatus.Information = sizeof(KSSTATE);
@@ -549,11 +591,34 @@ IPortPinWaveCyclic_HandleKsProperty(
return STATUS_SUCCESS;
}
}
+ else if (Property->Id == KSPROPERTY_CONNECTION_ALLOCATORFRAMING)
+ {
+ PKSALLOCATOR_FRAMING Framing = (PKSALLOCATOR_FRAMING)Irp->UserBuffer;
+ ASSERT_IRQL(DISPATCH_LEVEL);
+ /* Validate input buffer */
+ if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KSALLOCATOR_FRAMING))
+ {
+ Irp->IoStatus.Information = sizeof(KSALLOCATOR_FRAMING);
+ Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+ /* Clear frame structure */
+ RtlZeroMemory(Framing, sizeof(KSALLOCATOR_FRAMING));
+ /* store requested frame size */
+ Framing->FrameSize = This->FrameSize;
+ /* FIXME fill in struct */
+
+ Irp->IoStatus.Information = sizeof(KSALLOCATOR_FRAMING);
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+ }
}
+
RtlStringFromGUID(&Property->Set, &GuidString);
DPRINT1("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags);
- DbgBreakPoint();
RtlFreeUnicodeString(&GuidString);
Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
@@ -619,7 +684,6 @@ IPortPinWaveCyclic_fnDeviceIoControl(
}
UNIMPLEMENTED
- DbgBreakPoint();
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
@@ -674,40 +738,25 @@ CloseStreamRoutine(
IN PVOID Context)
{
PMINIPORTWAVECYCLICSTREAM Stream;
- NTSTATUS Status;
- ISubdevice *ISubDevice;
- PSUBDEVICE_DESCRIPTOR Descriptor;
IPortPinWaveCyclicImpl * This;
+ NTSTATUS Status;
PCLOSESTREAM_CONTEXT Ctx = (PCLOSESTREAM_CONTEXT)Context;
This = (IPortPinWaveCyclicImpl*)Ctx->Pin;
- if (This->Stream)
+ if (This->State != KSSTATE_STOP)
{
- if (This->State != KSSTATE_STOP)
- {
- This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP);
- KeStallExecutionProcessor(10);
- }
- }
+ /* stop stream in case it hasn't been */
+ Status = This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP);
+ if (!NT_SUCCESS(Status))
+ DPRINT1("Warning: failed to stop stream with %x\n", Status);
- This->ServiceGroup->lpVtbl->RemoveMember(This->ServiceGroup, (PSERVICESINK)&This->lpVtblServiceSink);
- This->ServiceGroup->lpVtbl->Release(This->ServiceGroup);
- This->DmaChannel->lpVtbl->Release(This->DmaChannel);
-
- Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&ISubDevice);
- if (NT_SUCCESS(Status))
- {
- Status = ISubDevice->lpVtbl->GetDescriptor(ISubDevice, &Descriptor);
- if (NT_SUCCESS(Status))
- {
- ISubDevice->lpVtbl->Release(ISubDevice);
- Descriptor->Factory.Instances[This->ConnectDetails->PinId].CurrentPinInstanceCount--;
- }
+ This->State = KSSTATE_STOP;
}
if (This->Format)
{
+ /* free format */
ExFreePool(This->Format);
This->Format = NULL;
}
@@ -735,7 +784,6 @@ CloseStreamRoutine(
This->Filter->lpVtbl->FreePin(This->Filter, (IPortPinWaveCyclic*)This);
DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql());
Stream->lpVtbl->Release(Stream);
- /* this line is never reached */
}
}
@@ -754,20 +802,21 @@ IPortPinWaveCyclic_fnClose(
if (This->Stream)
{
+ /* allocate a close context */
Ctx = AllocateItem(NonPagedPool, sizeof(CLOSESTREAM_CONTEXT), TAG_PORTCLASS);
if (!Ctx)
{
DPRINT1("Failed to allocate stream context\n");
goto cleanup;
}
-
+ /* allocate work context */
Ctx->WorkItem = IoAllocateWorkItem(DeviceObject);
if (!Ctx->WorkItem)
{
DPRINT1("Failed to allocate work item\n");
goto cleanup;
}
-
+ /* setup the close context */
Ctx->Irp = Irp;
Ctx->Pin = (PVOID)This;
@@ -775,6 +824,9 @@ IPortPinWaveCyclic_fnClose(
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_PENDING;
+ /* remove member from service group */
+ This->ServiceGroup->lpVtbl->RemoveMember(This->ServiceGroup, (PSERVICESINK)&This->lpVtblServiceSink);
+
/* defer work item */
IoQueueWorkItem(Ctx->WorkItem, CloseStreamRoutine, DelayedWorkQueue, (PVOID)Ctx);
/* Return result */
@@ -842,7 +894,7 @@ IPortPinWaveCyclic_fnFastDeviceIoControl(
OUT PIO_STATUS_BLOCK StatusBlock,
IN PDEVICE_OBJECT DeviceObject)
{
- UNIMPLEMENTED
+ //UNIMPLEMENTED
return FALSE;
}
@@ -909,15 +961,19 @@ IPortPinWaveCyclic_fnFastWrite(
NTSTATUS Status;
PCONTEXT_WRITE Packet;
PIRP Irp;
+ ULONG PrePostRatio;
+ ULONG MinData;
IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)iface;
InterlockedIncrement((PLONG)&This->TotalPackets);
- DPRINT1("IPortPinWaveCyclic_fnFastWrite entered Total %u Pre %u Post %u\n", This->TotalPackets, This->PreCompleted, This->PostCompleted);
+ PrePostRatio = (This->PreCompleted * 100) / This->TotalPackets;
+ MinData = This->IrpQueue->lpVtbl->NumData(This->IrpQueue);
+
+ DPRINT("IPortPinWaveCyclic_fnFastWrite entered Total %u Pre %u Post %u State %x MinData %u Ratio %u\n", This->TotalPackets, This->PreCompleted, This->PostCompleted, This->State, This->IrpQueue->lpVtbl->NumData(This->IrpQueue), PrePostRatio);
Packet = (PCONTEXT_WRITE)Buffer;
-
if (This->IrpQueue->lpVtbl->MinimumDataAvailable(This->IrpQueue))
{
Irp = Packet->Irp;
@@ -939,7 +995,7 @@ IPortPinWaveCyclic_fnFastWrite(
if (!NT_SUCCESS(Status))
return FALSE;
- if (This->IrpQueue->lpVtbl->MinimumDataAvailable(This->IrpQueue) == TRUE && This->State != KSSTATE_RUN)
+ if (This->State != KSSTATE_RUN && This->IrpQueue->lpVtbl->MinimumDataAvailable(This->IrpQueue) == TRUE)
{
SetStreamState(This, KSSTATE_RUN);
/* some should initiate a state request but didnt do it */
@@ -994,13 +1050,6 @@ IPortPinWaveCyclic_fnInit(
if (!NT_SUCCESS(Status))
return Status;
- Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, DataFormat, DeviceObject, 0, 0);
- if (!NT_SUCCESS(Status))
- {
- This->IrpQueue->lpVtbl->Release(This->IrpQueue);
- return Status;
- }
-
if (KsPinDescriptor->Communication == KSPIN_COMMUNICATION_SINK && KsPinDescriptor->DataFlow == KSPIN_DATAFLOW_IN)
{
Capture = FALSE;
@@ -1060,12 +1109,22 @@ IPortPinWaveCyclic_fnInit(
This->CommonBufferSize = This->DmaChannel->lpVtbl->AllocatedBufferSize(This->DmaChannel);
This->CommonBuffer = This->DmaChannel->lpVtbl->SystemAddress(This->DmaChannel);
This->Capture = Capture;
+ /* delay of 10 milisec */
+ This->Delay = Int32x32To64(10, -10000);
Status = This->Stream->lpVtbl->SetNotificationFreq(This->Stream, 10, &This->FrameSize);
+ Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, DataFormat, DeviceObject, This->FrameSize, 0);
+ if (!NT_SUCCESS(Status))
+ {
+ This->IrpQueue->lpVtbl->Release(This->IrpQueue);
+ return Status;
+ }
+
+
//This->Stream->lpVtbl->SetFormat(This->Stream, (PKSDATAFORMAT)This->Format);
- DPRINT1("Setting state to acquire %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_ACQUIRE));
- DPRINT1("Setting state to pause %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_PAUSE));
+ DPRINT1("Setting state to acquire %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_ACQUIRE));
+ DPRINT1("Setting state to pause %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_PAUSE));
This->State = KSSTATE_PAUSE;
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c
index 682334e401b..a332c9248ac 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c
@@ -12,6 +12,7 @@ typedef struct
{
IPortPinWavePciVtbl *lpVtbl;
IServiceSinkVtbl *lpVtblServiceSink;
+ IPortWavePciStreamVtbl *lpVtblPortWavePciStream;
LONG ref;
IPortWavePci * Port;
@@ -27,16 +28,22 @@ typedef struct
BOOL Capture;
PDEVICE_OBJECT DeviceObject;
- PPORTWAVEPCISTREAM WaveStream;
IIrpQueue * IrpQueue;
ULONG TotalPackets;
ULONG PreCompleted;
ULONG PostCompleted;
+ ULONG StopCount;
+
+ ULONG Delay;
+
+ BOOL bUsePrefetch;
+ ULONG PrefetchOffset;
+
+ KSALLOCATOR_FRAMING AllocatorFraming;
}IPortPinWavePciImpl;
-
typedef struct
{
IPortPinWavePciImpl *Pin;
@@ -44,12 +51,110 @@ typedef struct
KSSTATE State;
}SETSTREAM_CONTEXT, *PSETSTREAM_CONTEXT;
+//==================================================================================================================================
+static
NTSTATUS
NTAPI
-IPortWavePci_fnProcessNewIrp(
- IPortPinWavePciImpl * This);
+IPortWavePciStream_fnQueryInterface(
+ IPortWavePciStream* iface,
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)CONTAINING_RECORD(iface, IPortPinWavePciImpl, lpVtblPortWavePciStream);
+
+ DPRINT("IPortWavePciStream_fnQueryInterface entered\n");
+
+ if (IsEqualGUIDAligned(refiid, &IID_IPortWavePciStream) ||
+ IsEqualGUIDAligned(refiid, &IID_IUnknown))
+ {
+ *Output = &This->lpVtbl;
+ InterlockedIncrement(&This->ref);
+ return STATUS_SUCCESS;
+ }
+
+ return STATUS_UNSUCCESSFUL;
+}
+
+static
+ULONG
+NTAPI
+IPortWavePciStream_fnAddRef(
+ IPortWavePciStream* iface)
+{
+ IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)CONTAINING_RECORD(iface, IPortPinWavePciImpl, lpVtblPortWavePciStream);
+ DPRINT("IPortWavePciStream_fnAddRef entered\n");
+
+ return InterlockedIncrement(&This->ref);
+}
+
+static
+ULONG
+NTAPI
+IPortWavePciStream_fnRelease(
+ IPortWavePciStream* iface)
+{
+ IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)CONTAINING_RECORD(iface, IPortPinWavePciImpl, lpVtblPortWavePciStream);
+
+ InterlockedDecrement(&This->ref);
+
+ DPRINT("IPortWavePciStream_fnRelease entered %u\n", This->ref);
+
+ /* Return new reference count */
+ return This->ref;
+}
+
+static
+NTSTATUS
+NTAPI
+IPortWavePciStream_fnGetMapping(
+ IN IPortWavePciStream *iface,
+ IN PVOID Tag,
+ OUT PPHYSICAL_ADDRESS PhysicalAddress,
+ OUT PVOID *VirtualAddress,
+ OUT PULONG ByteCount,
+ OUT PULONG Flags)
+{
+ IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)CONTAINING_RECORD(iface, IPortPinWavePciImpl, lpVtblPortWavePciStream);
+
+ ASSERT_IRQL(DISPATCH_LEVEL);
+ return This->IrpQueue->lpVtbl->GetMappingWithTag(This->IrpQueue, Tag, PhysicalAddress, VirtualAddress, ByteCount, Flags);
+}
+
+static
+NTSTATUS
+NTAPI
+IPortWavePciStream_fnReleaseMapping(
+ IN IPortWavePciStream *iface,
+ IN PVOID Tag)
+{
+ IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)CONTAINING_RECORD(iface, IPortPinWavePciImpl, lpVtblPortWavePciStream);
+
+ ASSERT_IRQL(DISPATCH_LEVEL);
+ return This->IrpQueue->lpVtbl->ReleaseMappingWithTag(This->IrpQueue, Tag);
+}
+
+static
+NTSTATUS
+NTAPI
+IPortWavePciStream_fnTerminatePacket(
+ IN IPortWavePciStream *iface)
+{
+ UNIMPLEMENTED
+ ASSERT_IRQL(DISPATCH_LEVEL);
+ return STATUS_SUCCESS;
+}
+
+
+static IPortWavePciStreamVtbl vt_PortWavePciStream =
+{
+ IPortWavePciStream_fnQueryInterface,
+ IPortWavePciStream_fnAddRef,
+ IPortWavePciStream_fnRelease,
+ IPortWavePciStream_fnGetMapping,
+ IPortWavePciStream_fnReleaseMapping,
+ IPortWavePciStream_fnTerminatePacket
+};
-//==================================================================================================================================
static
NTSTATUS
@@ -115,6 +220,8 @@ SetStreamWorkerRoutine(
IPortPinWavePciImpl * This;
PSETSTREAM_CONTEXT Ctx = (PSETSTREAM_CONTEXT)Context;
KSSTATE State;
+ ULONG MinimumDataThreshold;
+ ULONG MaximumDataThreshold;
This = Ctx->Pin;
State = Ctx->State;
@@ -136,7 +243,27 @@ SetStreamWorkerRoutine(
{
/* reset start stream */
This->IrpQueue->lpVtbl->CancelBuffers(This->IrpQueue); //FIX function name
- DPRINT1("Stopping PreCompleted %u PostCompleted %u\n", This->PreCompleted, This->PostCompleted);
+ //This->ServiceGroup->lpVtbl->CancelDelayedService(This->ServiceGroup);
+ /* increase stop counter */
+ This->StopCount++;
+ /* get current data threshold */
+ MinimumDataThreshold = This->IrpQueue->lpVtbl->GetMinimumDataThreshold(This->IrpQueue);
+ /* get maximum data threshold */
+ MaximumDataThreshold = ((PKSDATAFORMAT_WAVEFORMATEX)This->Format)->WaveFormatEx.nAvgBytesPerSec;
+ /* increase minimum data threshold by 10 frames */
+ MinimumDataThreshold += This->AllocatorFraming.FrameSize * 10;
+
+ /* assure it has not exceeded */
+ MinimumDataThreshold = min(MinimumDataThreshold, MaximumDataThreshold);
+ /* store minimum data threshold */
+ This->IrpQueue->lpVtbl->SetMinimumDataThreshold(This->IrpQueue, MinimumDataThreshold);
+
+ DPRINT1("Stopping PreCompleted %u PostCompleted %u StopCount %u MinimumDataThreshold %u\n", This->PreCompleted, This->PostCompleted, This->StopCount, MinimumDataThreshold);
+ }
+ if (This->State == KSSTATE_RUN)
+ {
+ /* start the notification timer */
+ //This->ServiceGroup->lpVtbl->RequestDelayedService(This->ServiceGroup, This->Delay);
}
}
}
@@ -193,26 +320,23 @@ NTAPI
IServiceSink_fnRequestService(
IServiceSink* iface)
{
- ULONGLONG Position;
- NTSTATUS Status;
IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)CONTAINING_RECORD(iface, IPortPinWavePciImpl, lpVtblServiceSink);
ASSERT_IRQL(DISPATCH_LEVEL);
if (This->IrpQueue->lpVtbl->HasLastMappingFailed(This->IrpQueue))
{
- This->IrpQueue->lpVtbl->PrintQueueStatus(This->IrpQueue);
if (This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue) == 0)
{
DPRINT("Stopping stream...\n");
SetStreamState(This, KSSTATE_STOP);
+ return;
}
}
- Status = This->Stream->lpVtbl->GetPosition(This->Stream, &Position);
- DPRINT("Position %lu Status %x\n", Position, Status);
-
This->Stream->lpVtbl->Service(This->Stream);
+ //TODO
+ //generate events
}
static IServiceSinkVtbl vt_IServiceSink =
@@ -304,6 +428,179 @@ IPortPinWavePci_fnNewIrpTarget(
return STATUS_UNSUCCESSFUL;
}
+NTSTATUS
+NTAPI
+IPortPinWavePci_HandleKsProperty(
+ IN IPortPinWavePci * iface,
+ IN PVOID InputBuffer,
+ IN ULONG InputBufferLength,
+ IN PVOID OutputBuffer,
+ IN ULONG OutputBufferLength,
+ IN PIO_STATUS_BLOCK IoStatusBlock)
+{
+ PKSPROPERTY Property;
+ NTSTATUS Status;
+ UNICODE_STRING GuidString;
+
+ IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)iface;
+
+
+ DPRINT("IPortPinWavePci_HandleKsProperty entered\n");
+
+ if (InputBufferLength < sizeof(KSPROPERTY))
+ {
+ IoStatusBlock->Information = 0;
+ IoStatusBlock->Status = STATUS_INVALID_PARAMETER;
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ Property = (PKSPROPERTY)InputBuffer;
+
+ if (IsEqualGUIDAligned(&Property->Set, &KSPROPSETID_Connection))
+ {
+ if (Property->Id == KSPROPERTY_CONNECTION_STATE)
+ {
+ PKSSTATE State = (PKSSTATE)OutputBuffer;
+
+ ASSERT_IRQL(DISPATCH_LEVEL);
+ if (OutputBufferLength < sizeof(KSSTATE))
+ {
+ IoStatusBlock->Information = sizeof(KSSTATE);
+ IoStatusBlock->Status = STATUS_BUFFER_TOO_SMALL;
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+
+ if (Property->Flags & KSPROPERTY_TYPE_SET)
+ {
+ Status = STATUS_UNSUCCESSFUL;
+ IoStatusBlock->Information = 0;
+
+ if (This->Stream)
+ {
+ Status = This->Stream->lpVtbl->SetState(This->Stream, *State);
+
+ DPRINT1("Setting state %u %x\n", *State, Status);
+ if (NT_SUCCESS(Status))
+ {
+ This->State = *State;
+ }
+ }
+ IoStatusBlock->Status = Status;
+ return Status;
+ }
+ else if (Property->Flags & KSPROPERTY_TYPE_GET)
+ {
+ *State = This->State;
+ IoStatusBlock->Information = sizeof(KSSTATE);
+ IoStatusBlock->Status = STATUS_SUCCESS;
+ return STATUS_SUCCESS;
+ }
+ }
+ else if (Property->Id == KSPROPERTY_CONNECTION_DATAFORMAT)
+ {
+ PKSDATAFORMAT DataFormat = (PKSDATAFORMAT)OutputBuffer;
+ if (Property->Flags & KSPROPERTY_TYPE_SET)
+ {
+ PKSDATAFORMAT NewDataFormat;
+ if (!RtlCompareMemory(DataFormat, This->Format, DataFormat->FormatSize))
+ {
+ IoStatusBlock->Information = DataFormat->FormatSize;
+ IoStatusBlock->Status = STATUS_SUCCESS;
+ return STATUS_SUCCESS;
+ }
+
+ NewDataFormat = AllocateItem(NonPagedPool, DataFormat->FormatSize, TAG_PORTCLASS);
+ if (!NewDataFormat)
+ {
+ IoStatusBlock->Information = 0;
+ IoStatusBlock->Status = STATUS_NO_MEMORY;
+ return STATUS_NO_MEMORY;
+ }
+ RtlMoveMemory(NewDataFormat, DataFormat, DataFormat->FormatSize);
+
+ if (This->Stream)
+ {
+ ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
+ ASSERT(NewDataFormat->FormatSize == sizeof(KSDATAFORMAT_WAVEFORMATEX));
+ ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.MajorFormat, &KSDATAFORMAT_TYPE_AUDIO));
+ ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM));
+ ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.Specifier, &KSDATAFORMAT_SPECIFIER_WAVEFORMATEX));
+
+ ASSERT(This->State == KSSTATE_STOP);
+ DPRINT1("NewDataFormat: Channels %u Bits %u Samples %u\n", ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nChannels,
+ ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.wBitsPerSample,
+ ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nSamplesPerSec);
+
+ Status = This->Stream->lpVtbl->SetFormat(This->Stream, NewDataFormat);
+ if (NT_SUCCESS(Status))
+ {
+ if (This->Format)
+ ExFreePoolWithTag(This->Format, TAG_PORTCLASS);
+
+ This->IrpQueue->lpVtbl->UpdateFormat(This->IrpQueue, (PKSDATAFORMAT)NewDataFormat);
+ This->Format = NewDataFormat;
+ IoStatusBlock->Information = DataFormat->FormatSize;
+ IoStatusBlock->Status = STATUS_SUCCESS;
+ return STATUS_SUCCESS;
+ }
+ }
+ DPRINT1("Failed to set format\n");
+ IoStatusBlock->Information = 0;
+ IoStatusBlock->Status = STATUS_UNSUCCESSFUL;
+ return STATUS_UNSUCCESSFUL;
+ }
+ else if (Property->Flags & KSPROPERTY_TYPE_GET)
+ {
+ if (!This->Format)
+ {
+ DPRINT1("No format\n");
+ IoStatusBlock->Information = 0;
+ IoStatusBlock->Status = STATUS_UNSUCCESSFUL;
+ return STATUS_UNSUCCESSFUL;
+ }
+ if (This->Format->FormatSize > OutputBufferLength)
+ {
+ IoStatusBlock->Information = This->Format->FormatSize;
+ IoStatusBlock->Status = STATUS_BUFFER_TOO_SMALL;
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+
+ RtlMoveMemory(DataFormat, This->Format, This->Format->FormatSize);
+ IoStatusBlock->Information = DataFormat->FormatSize;
+ IoStatusBlock->Status = STATUS_SUCCESS;
+ return STATUS_SUCCESS;
+ }
+ }
+ else if (Property->Id == KSPROPERTY_CONNECTION_ALLOCATORFRAMING)
+ {
+ PKSALLOCATOR_FRAMING Framing = (PKSALLOCATOR_FRAMING)OutputBuffer;
+
+ ASSERT_IRQL(DISPATCH_LEVEL);
+ /* Validate input buffer */
+ if (OutputBufferLength < sizeof(KSALLOCATOR_FRAMING))
+ {
+ IoStatusBlock->Information = sizeof(KSALLOCATOR_FRAMING);
+ IoStatusBlock->Status = STATUS_BUFFER_TOO_SMALL;
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+ /* copy frame allocator struct */
+ RtlMoveMemory(Framing, &This->AllocatorFraming, sizeof(KSALLOCATOR_FRAMING));
+
+ IoStatusBlock->Information = sizeof(KSALLOCATOR_FRAMING);
+ IoStatusBlock->Status = STATUS_SUCCESS;
+ return STATUS_SUCCESS;
+ }
+ }
+
+ RtlStringFromGUID(&Property->Set, &GuidString);
+ DPRINT1("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags);
+ RtlFreeUnicodeString(&GuidString);
+
+ IoStatusBlock->Status = STATUS_NOT_IMPLEMENTED;
+ IoStatusBlock->Information = 0;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
/*
* @unimplemented
*/
@@ -314,6 +611,19 @@ IPortPinWavePci_fnDeviceIoControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
+ PIO_STACK_LOCATION IoStack;
+ NTSTATUS Status;
+
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY)
+ {
+ Status = IPortPinWavePci_HandleKsProperty(iface, IoStack->Parameters.DeviceIoControl.Type3InputBuffer, IoStack->Parameters.DeviceIoControl.InputBufferLength, Irp->UserBuffer, IoStack->Parameters.DeviceIoControl.OutputBufferLength, &Irp->IoStatus);
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+
+
UNIMPLEMENTED
Irp->IoStatus.Information = 0;
@@ -383,14 +693,12 @@ CloseStreamRoutine(
if (This->State != KSSTATE_STOP)
{
This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP);
- KeStallExecutionProcessor(10);
}
}
if (This->ServiceGroup)
{
This->ServiceGroup->lpVtbl->RemoveMember(This->ServiceGroup, (PSERVICESINK)&This->lpVtblServiceSink);
- This->ServiceGroup->lpVtbl->Release(This->ServiceGroup);
}
Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&ISubDevice);
@@ -399,9 +707,9 @@ CloseStreamRoutine(
Status = ISubDevice->lpVtbl->GetDescriptor(ISubDevice, &Descriptor);
if (NT_SUCCESS(Status))
{
- ISubDevice->lpVtbl->Release(ISubDevice);
Descriptor->Factory.Instances[This->ConnectDetails->PinId].CurrentPinInstanceCount--;
}
+ ISubDevice->lpVtbl->Release(ISubDevice);
}
if (This->Format)
@@ -410,11 +718,6 @@ CloseStreamRoutine(
This->Format = NULL;
}
- if (This->WaveStream)
- {
- This->WaveStream->lpVtbl->Release(This->WaveStream);
- }
-
/* complete the irp */
Ctx->Irp->IoStatus.Information = 0;
Ctx->Irp->IoStatus.Status = STATUS_SUCCESS;
@@ -432,7 +735,6 @@ CloseStreamRoutine(
This->Stream = NULL;
DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql());
Stream->lpVtbl->Release(Stream);
- /* this line is never reached */
}
}
@@ -539,7 +841,17 @@ IPortPinWavePci_fnFastDeviceIoControl(
OUT PIO_STATUS_BLOCK StatusBlock,
IN PDEVICE_OBJECT DeviceObject)
{
- UNIMPLEMENTED
+ NTSTATUS Status;
+
+ if (IoControlCode == IOCTL_KS_PROPERTY)
+ {
+ Status = IPortPinWavePci_HandleKsProperty(iface, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, StatusBlock);
+ if (NT_SUCCESS(Status))
+ {
+ return TRUE;
+ }
+ }
+
return FALSE;
}
@@ -606,6 +918,7 @@ IPortPinWavePci_fnFastWrite(
NTSTATUS Status;
PCONTEXT_WRITE Packet;
PIRP Irp;
+ ULONG MinimumDataThreshold;
IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)iface;
DPRINT("IPortPinWavePci_fnFastWrite entered Total %u Pre %u Post %u\n", This->TotalPackets, This->PreCompleted, This->PostCompleted);
@@ -614,7 +927,6 @@ IPortPinWavePci_fnFastWrite(
Packet = (PCONTEXT_WRITE)Buffer;
-
if (This->IrpQueue->lpVtbl->MinimumDataAvailable(This->IrpQueue))
{
Irp = Packet->Irp;
@@ -645,9 +957,15 @@ IPortPinWavePci_fnFastWrite(
if (This->IrpQueue->lpVtbl->HasLastMappingFailed(This->IrpQueue))
{
- /* notify port driver that new mapping is available */
- DPRINT("Notifying of new mapping\n");
- This->Stream->lpVtbl->MappingAvailable(This->Stream);
+ /* get minimum data threshold */
+ MinimumDataThreshold = This->IrpQueue->lpVtbl->GetMinimumDataThreshold(This->IrpQueue);
+
+ if (MinimumDataThreshold < This->IrpQueue->lpVtbl->NumData(This->IrpQueue))
+ {
+ /* notify port driver that new mapping is available */
+ DPRINT("Notifying of new mapping\n");
+ This->Stream->lpVtbl->MappingAvailable(This->Stream);
+ }
}
return TRUE;
@@ -669,7 +987,6 @@ IPortPinWavePci_fnInit(
NTSTATUS Status;
PKSDATAFORMAT DataFormat;
BOOL Capture;
- KSALLOCATOR_FRAMING AllocatorFraming;
IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)iface;
@@ -693,14 +1010,6 @@ IPortPinWavePci_fnInit(
RtlMoveMemory(This->Format, DataFormat, DataFormat->FormatSize);
- Status = NewIPortWavePciStream(&This->WaveStream);
- if (!NT_SUCCESS(Status))
- {
- ExFreePool(This->Format);
- This->Format = NULL;
- return Status;
- }
-
if (KsPinDescriptor->Communication == KSPIN_COMMUNICATION_SINK && KsPinDescriptor->DataFlow == KSPIN_DATAFLOW_IN)
{
Capture = FALSE;
@@ -719,7 +1028,7 @@ IPortPinWavePci_fnInit(
&This->Stream,
NULL,
NonPagedPool,
- This->WaveStream,
+ (PPORTWAVEPCISTREAM)&This->lpVtblPortWavePciStream,
ConnectDetails->PinId,
Capture,
This->Format,
@@ -743,20 +1052,24 @@ IPortPinWavePci_fnInit(
This->ServiceGroup->lpVtbl->SupportDelayedService(This->ServiceGroup);
}
- This->IrpQueue = IPortWavePciStream_GetIrpQueue(This->WaveStream);
+ /* delay of 10 milisec */
+ This->Delay = Int32x32To64(10, -10000);
- Status = This->Stream->lpVtbl->GetAllocatorFraming(This->Stream, &AllocatorFraming);
+ Status = This->Stream->lpVtbl->GetAllocatorFraming(This->Stream, &This->AllocatorFraming);
if (!NT_SUCCESS(Status))
{
DPRINT1("GetAllocatorFraming failed with %x\n", Status);
return Status;
}
- DPRINT("OptionFlags %x RequirementsFlag %x PoolType %x Frames %lu FrameSize %lu FileAlignment %lu\n",
- AllocatorFraming.OptionsFlags, AllocatorFraming.RequirementsFlags, AllocatorFraming.PoolType, AllocatorFraming.Frames, AllocatorFraming.FrameSize, AllocatorFraming.FileAlignment);
+ DPRINT("OptionFlags %x RequirementsFlag %x PoolType %x Frames %lu FrameSize %lu FileAlignment %lu\n",
+ This->AllocatorFraming.OptionsFlags, This->AllocatorFraming.RequirementsFlags, This->AllocatorFraming.PoolType, This->AllocatorFraming.Frames, This->AllocatorFraming.FrameSize, This->AllocatorFraming.FileAlignment);
+ Status = NewIrpQueue(&This->IrpQueue);
+ if (!NT_SUCCESS(Status))
+ return Status;
- Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, This->Format, DeviceObject, AllocatorFraming.FrameSize, AllocatorFraming.FileAlignment);
+ Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, This->Format, DeviceObject, This->AllocatorFraming.FrameSize, This->AllocatorFraming.FileAlignment);
if (!NT_SUCCESS(Status))
{
DPRINT1("IrpQueue_Init failed with %x\n", Status);
@@ -833,6 +1146,7 @@ NTSTATUS NewPortPinWavePci(
This->ref = 1;
This->lpVtbl = &vt_IPortPinWavePci;
This->lpVtblServiceSink = &vt_IServiceSink;
+ This->lpVtblPortWavePciStream = &vt_PortWavePciStream;
/* store result */
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c
index e878ca47f3a..aaff97fcc69 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c
@@ -59,6 +59,85 @@ SetStreamState(
IN IPortPinWaveRTImpl * This,
IN KSSTATE State);
+static
+VOID
+UpdateCommonBuffer(
+ IPortPinWaveRTImpl * This,
+ ULONG Position)
+{
+ ULONG BufferLength;
+ ULONG BytesToCopy;
+ ULONG BufferSize;
+ PUCHAR Buffer;
+ NTSTATUS Status;
+
+ BufferLength = Position - This->CommonBufferOffset;
+ while(BufferLength)
+ {
+ Status = This->IrpQueue->lpVtbl->GetMapping(This->IrpQueue, &Buffer, &BufferSize);
+ if (!NT_SUCCESS(Status))
+ return;
+
+ BytesToCopy = min(BufferLength, BufferSize);
+
+ if (This->Capture)
+ {
+ RtlMoveMemory(Buffer, (PUCHAR)This->CommonBuffer + This->CommonBufferOffset, BytesToCopy);
+ }
+ else
+ {
+ RtlMoveMemory((PUCHAR)This->CommonBuffer + This->CommonBufferOffset, Buffer, BytesToCopy);
+ }
+
+ This->IrpQueue->lpVtbl->UpdateMapping(This->IrpQueue, BytesToCopy);
+ This->CommonBufferOffset += BytesToCopy;
+
+ BufferLength = Position - This->CommonBufferOffset;
+ }
+}
+
+static
+VOID
+UpdateCommonBufferOverlap(
+ IPortPinWaveRTImpl * This,
+ ULONG Position)
+{
+ ULONG BufferLength;
+ ULONG BytesToCopy;
+ ULONG BufferSize;
+ PUCHAR Buffer;
+ NTSTATUS Status;
+
+
+ BufferLength = This->CommonBufferSize - This->CommonBufferOffset;
+ while(BufferLength)
+ {
+ Status = This->IrpQueue->lpVtbl->GetMapping(This->IrpQueue, &Buffer, &BufferSize);
+ if (!NT_SUCCESS(Status))
+ return;
+
+ BytesToCopy = min(BufferLength, BufferSize);
+
+ if (This->Capture)
+ {
+ RtlMoveMemory(Buffer, (PUCHAR)This->CommonBuffer + This->CommonBufferOffset, BytesToCopy);
+ }
+ else
+ {
+ RtlMoveMemory((PUCHAR)This->CommonBuffer + This->CommonBufferOffset, Buffer, BytesToCopy);
+ }
+
+ This->IrpQueue->lpVtbl->UpdateMapping(This->IrpQueue, BytesToCopy);
+ This->CommonBufferOffset += BytesToCopy;
+
+ BufferLength = This->CommonBufferSize - This->CommonBufferOffset;
+ }
+ This->CommonBufferOffset = 0;
+ UpdateCommonBuffer(This, Position);
+}
+
+
+
//==================================================================================================================================
static
NTSTATUS
@@ -137,14 +216,16 @@ IServiceSink_fnRequestService(
}
Status = This->Stream->lpVtbl->GetPosition(This->Stream, &Position);
- DPRINT("PlayOffset %llu WriteOffset %llu %u Buffer %p BufferSize %u\n", Position.PlayOffset, Position.WriteOffset, Buffer, This->CommonBufferSize, BufferSize);
+ DPRINT("PlayOffset %lu WriteOffset %lu Buffer %p BufferSize %u CommonBufferSize %u\n", Position.PlayOffset, Position.WriteOffset, Buffer, BufferSize, This->CommonBufferSize);
- //FIXME
- // implement writing into cyclic buffer
- //
-
- /* reschedule the timer */
- This->ServiceGroup->lpVtbl->RequestDelayedService(This->ServiceGroup, This->Delay);
+ if (Position.PlayOffset < This->CommonBufferOffset)
+ {
+ UpdateCommonBufferOverlap(This, Position.PlayOffset);
+ }
+ else if (Position.PlayOffset >= This->CommonBufferOffset)
+ {
+ UpdateCommonBuffer(This, Position.PlayOffset);
+ }
}
static IServiceSinkVtbl vt_IServiceSink =
@@ -621,9 +702,9 @@ CloseStreamRoutine(
Status = ISubDevice->lpVtbl->GetDescriptor(ISubDevice, &Descriptor);
if (NT_SUCCESS(Status))
{
- ISubDevice->lpVtbl->Release(ISubDevice);
Descriptor->Factory.Instances[This->ConnectDetails->PinId].CurrentPinInstanceCount--;
}
+ ISubDevice->lpVtbl->Release(ISubDevice);
}
if (This->Format)
@@ -654,7 +735,6 @@ CloseStreamRoutine(
This->Stream = NULL;
DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql());
Stream->lpVtbl->Release(Stream);
- /* this line is never reached */
}
}
@@ -959,21 +1039,28 @@ IPortPinWaveRT_fnInit(
goto cleanup;
This->Stream->lpVtbl->GetHWLatency(This->Stream, &Latency);
- /* minimum delay of 10 milisec */
- This->Delay = Int32x32To64(min(max(Latency.ChipsetDelay + Latency.CodecDelay + Latency.FifoSize, 10), 10), -10000);
+ /* delay of 10 milisec */
+ This->Delay = Int32x32To64(10, -10000);
- Status = This->Stream->lpVtbl->AllocateAudioBuffer(This->Stream, 16384, &This->Mdl, &This->CommonBufferSize, &This->CommonBufferOffset, &This->CacheType);
+ Status = This->Stream->lpVtbl->AllocateAudioBuffer(This->Stream, 16384 * 11, &This->Mdl, &This->CommonBufferSize, &This->CommonBufferOffset, &This->CacheType);
if (!NT_SUCCESS(Status))
{
DPRINT1("AllocateAudioBuffer failed with %x\n", Status);
goto cleanup;
}
- This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP);
- This->State = KSSTATE_STOP;
- This->Capture = Capture;
+ This->CommonBuffer = MmGetSystemAddressForMdlSafe(This->Mdl, NormalPagePriority);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to get system address %x\n", Status);
+ IoFreeMdl(This->Mdl);
+ This->Mdl = NULL;
+ goto cleanup;
+ }
- This->Stream->lpVtbl->SetFormat(This->Stream, (PKSDATAFORMAT)This->Format);
+ DPRINT1("Setting state to acquire %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_ACQUIRE));
+ DPRINT1("Setting state to pause %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_PAUSE));
+ This->State = KSSTATE_PAUSE;
return STATUS_SUCCESS;
cleanup:
@@ -995,12 +1082,20 @@ cleanup:
This->ServiceGroup = NULL;
}
- if (This->PortStream)
+ if (This->Stream)
{
- This->PortStream->lpVtbl->Release(This->PortStream);
- This->PortStream = NULL;
+ This->Stream->lpVtbl->Release(This->Stream);
+ This->Stream = NULL;
}
+ else
+ {
+ if (This->PortStream)
+ {
+ This->PortStream->lpVtbl->Release(This->PortStream);
+ This->PortStream = NULL;
+ }
+ }
return Status;
}
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port.c b/reactos/drivers/wdm/audio/backpln/portcls/port.c
index 95f72e3d83a..2fdb7c8b529 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/port.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/port.c
@@ -40,10 +40,8 @@ PcNewPort(
Status = NewPortWaveCyclic(OutPort);
else if (IsEqualGUIDAligned(ClassId, &CLSID_PortWavePci))
Status = NewPortWavePci(OutPort);
-#if (NTDDI_VERSION >= NTDDI_VISTA)
- else if (IsEqualGUIDAligned(ClassId, &CLSID_PortWavePci))
+ else if (IsEqualGUIDAligned(ClassId, &CLSID_PortWaveRT))
Status = NewPortWaveRT(OutPort);
-#endif
else
{
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c b/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c
index 5e37ef0c68c..55eae19e285 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c
@@ -45,6 +45,28 @@ static GUID InterfaceGuids[3] =
}
};
+DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterDMusTopologySet, TopologyPropertyHandler);
+DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PortFilterDMusPinSet, PinPropertyHandler, PinPropertyHandler, PinPropertyHandler);
+
+KSPROPERTY_SET PortDMusPropertySet[] =
+{
+ {
+ &KSPROPSETID_Topology,
+ sizeof(PortFilterDMusTopologySet) / sizeof(KSPROPERTY_ITEM),
+ (const KSPROPERTY_ITEM*)&PortFilterDMusTopologySet,
+ 0,
+ NULL
+ },
+ {
+ &KSPROPSETID_Pin,
+ sizeof(PortFilterDMusPinSet) / sizeof(KSPROPERTY_ITEM),
+ (const KSPROPERTY_ITEM*)&PortFilterDMusPinSet,
+ 0,
+ NULL
+ }
+};
+
+
//---------------------------------------------------------------
// IUnknown interface functions
//
@@ -83,6 +105,14 @@ IPortDMus_fnQueryInterface(
{
return NewPortClsVersion((PPORTCLSVERSION*)Output);
}
+ else if (IsEqualGUIDAligned(refiid, &IID_IUnregisterSubdevice))
+ {
+ return NewIUnregisterSubdevice((PUNREGISTERSUBDEVICE*)Output);
+ }
+ else if (IsEqualGUIDAligned(refiid, &IID_IUnregisterPhysicalConnection))
+ {
+ return NewIUnregisterPhysicalConnection((PUNREGISTERPHYSICALCONNECTION*)Output);
+ }
if (RtlStringFromGUID(refiid, &GuidString) == STATUS_SUCCESS)
{
@@ -241,8 +271,8 @@ IPortDMus_fnInit(
InterfaceGuids,
0,
NULL,
- 0,
- NULL,
+ 2,
+ PortDMusPropertySet,
0,
0,
0,
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
index 4b8b7e34d22..58cb6e61813 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
@@ -101,6 +101,14 @@ IPortTopology_fnQueryInterface(
{
return NewPortClsVersion((PPORTCLSVERSION*)Output);
}
+ else if (IsEqualGUIDAligned(refiid, &IID_IUnregisterSubdevice))
+ {
+ return NewIUnregisterSubdevice((PUNREGISTERSUBDEVICE*)Output);
+ }
+ else if (IsEqualGUIDAligned(refiid, &IID_IUnregisterPhysicalConnection))
+ {
+ return NewIUnregisterPhysicalConnection((PUNREGISTERPHYSICALCONNECTION*)Output);
+ }
if (RtlStringFromGUID(refiid, &GuidString) == STATUS_SUCCESS)
{
@@ -507,12 +515,13 @@ CreatePinWorkerRoutine(
WorkerContext->Irp,
NULL);
- DPRINT("CreatePinWorkerRoutine Status %x\n", Status);
+ DPRINT1("CreatePinWorkerRoutine Status %x\n", Status);
if (NT_SUCCESS(Status))
{
/* create the dispatch object */
- Status = NewDispatchObject(WorkerContext->Irp, Pin, NULL);
+ /* FIXME need create item for clock */
+ Status = NewDispatchObject(WorkerContext->Irp, Pin, 0, NULL);
DPRINT("Pin %p\n", Pin);
}
@@ -528,6 +537,78 @@ CreatePinWorkerRoutine(
FreeItem(WorkerContext, TAG_PORTCLASS);
}
+NTSTATUS
+NTAPI
+PcCreatePinDispatch(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ IIrpTarget *Filter;
+ PKSOBJECT_CREATE_ITEM CreateItem;
+ PPIN_WORKER_CONTEXT Context;
+
+ /* access the create item */
+ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+ /* sanity check */
+ ASSERT(CreateItem);
+
+ DPRINT1("PcCreatePinDispatch called DeviceObject %p %S Name\n", DeviceObject, CreateItem->ObjectClass.Buffer);
+
+ Filter = (IIrpTarget*)CreateItem->Context;
+
+ /* sanity checks */
+ ASSERT(Filter != NULL);
+
+
+#if KS_IMPLEMENTED
+ Status = KsReferenceSoftwareBusObject(DeviceExt->KsDeviceHeader);
+ if (!NT_SUCCESS(Status) && Status != STATUS_NOT_IMPLEMENTED)
+ {
+ DPRINT1("PcCreatePinDispatch failed to reference device header\n");
+
+ FreeItem(Entry, TAG_PORTCLASS);
+ goto cleanup;
+ }
+#endif
+
+ /* new pins are instantiated at passive level,
+ * so allocate a work item and context for it
+ */
+
+ Context = AllocateItem(NonPagedPool, sizeof(PIN_WORKER_CONTEXT), TAG_PORTCLASS);
+ if (!Context)
+ {
+ DPRINT("Failed to allocate worker context\n");
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* allocate work item */
+ Context->WorkItem = IoAllocateWorkItem(DeviceObject);
+ if (!Context->WorkItem)
+ {
+ DPRINT("Failed to allocate workitem\n");
+ FreeItem(Context, TAG_PORTCLASS);
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ Context->Filter = Filter;
+ Context->Irp = Irp;
+
+ DPRINT("Queueing IRP %p Irql %u\n", Irp, KeGetCurrentIrql());
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_PENDING;
+ IoMarkIrpPending(Irp);
+ IoQueueWorkItem(Context->WorkItem, CreatePinWorkerRoutine, DelayedWorkQueue, (PVOID)Context);
+ return STATUS_PENDING;
+}
+
+
NTSTATUS
NTAPI
@@ -535,58 +616,35 @@ PcCreateItemDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
- NTSTATUS Status = STATUS_SUCCESS;
- PIO_STACK_LOCATION IoStack;
+ NTSTATUS Status;
ISubdevice * SubDevice;
- PPCLASS_DEVICE_EXTENSION DeviceExt;
IIrpTarget *Filter;
- PKSOBJECT_CREATE_ITEM CreateItem;
- PPIN_WORKER_CONTEXT Context;
+ PKSOBJECT_CREATE_ITEM CreateItem, PinCreateItem;
- DPRINT1("PcCreateItemDispatch called DeviceObject %p\n", DeviceObject);
+ static LPWSTR KS_NAME_PIN = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}";
/* access the create item */
CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
- if (!CreateItem)
- {
- DPRINT1("PcCreateItemDispatch no CreateItem\n");
- return STATUS_UNSUCCESSFUL;
- }
+ DPRINT1("PcCreateItemDispatch called DeviceObject %p %S Name\n", DeviceObject, CreateItem->ObjectClass.Buffer);
+
+ /* get the subdevice */
SubDevice = (ISubdevice*)CreateItem->Context;
- DeviceExt = (PPCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- if (!SubDevice || !DeviceExt)
- {
- DPRINT1("PcCreateItemDispatch SubDevice %p DeviceExt %p\n", SubDevice, DeviceExt);
- return STATUS_UNSUCCESSFUL;
- }
+ /* sanity checks */
+ ASSERT(SubDevice != NULL);
#if KS_IMPLEMENTED
Status = KsReferenceSoftwareBusObject(DeviceExt->KsDeviceHeader);
if (!NT_SUCCESS(Status) && Status != STATUS_NOT_IMPLEMENTED)
{
- DPRINT1("PciCreateItemDispatch failed to reference device header\n");
+ DPRINT1("PcCreateItemDispatch failed to reference device header\n");
FreeItem(Entry, TAG_PORTCLASS);
goto cleanup;
}
#endif
-
- /* get current io stack location */
- IoStack = IoGetCurrentIrpStackLocation(Irp);
- /* sanity check */
- ASSERT(IoStack->FileObject != NULL);
-
- if (IoStack->FileObject->FsContext != NULL)
- {
- /* nothing to do */
- DPRINT1("FsContext already exists\n");
- return STATUS_SUCCESS;
- }
-
-
/* get filter object
* is implemented as a singleton
*/
@@ -601,67 +659,37 @@ PcCreateItemDispatch(
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to get filter object\n");
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
}
- /* is just the filter requested */
- if (IoStack->FileObject->FileName.Buffer == NULL)
+ /* allocate pin create item */
+ PinCreateItem = AllocateItem(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM), TAG_PORTCLASS);
+ if (!PinCreateItem)
{
- /* create the dispatch object */
- Status = NewDispatchObject(Irp, Filter, CreateItem->ObjectClass.Buffer);
-
- DPRINT1("Filter %p\n", Filter);
+ /* not enough memory */
+ Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_INSUFFICIENT_RESOURCES;
}
- else
- {
- LPWSTR Buffer = IoStack->FileObject->FileName.Buffer;
- static LPWSTR KS_NAME_PIN = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}";
+ /* initialize pin create item */
+ PinCreateItem->Context = (PVOID)Filter;
+ PinCreateItem->Create = PcCreatePinDispatch;
+ RtlInitUnicodeString(&PinCreateItem->ObjectClass, KS_NAME_PIN);
+ /* FIXME copy security descriptor */
- /* is the request for a new pin */
- if (!wcsncmp(KS_NAME_PIN, Buffer, wcslen(KS_NAME_PIN)))
- {
- /* try to create new pin */
- Context = AllocateItem(NonPagedPool, sizeof(PIN_WORKER_CONTEXT), TAG_PORTCLASS);
- if (!Context)
- {
- DPRINT("Failed to allocate worker context\n");
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_INSUFFICIENT_RESOURCES;
- }
- /* allocate work item */
- Context->WorkItem = IoAllocateWorkItem(DeviceObject);
- if (!Context->WorkItem)
- {
- DPRINT("Failed to allocate workitem\n");
- FreeItem(Context, TAG_PORTCLASS);
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_INSUFFICIENT_RESOURCES;
- }
+ /* now allocate a dispatch object */
+ Status = NewDispatchObject(Irp, Filter, 1, PinCreateItem);
- Context->Filter = Filter;
- Context->Irp = Irp;
-
- DPRINT("Queueing IRP %p Irql %u\n", Irp, KeGetCurrentIrql());
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_PENDING;
- IoMarkIrpPending(Irp);
- IoQueueWorkItem(Context->WorkItem, CreatePinWorkerRoutine, DelayedWorkQueue, (PVOID)Context);
- return STATUS_PENDING;
- }
- }
- Irp->IoStatus.Information = 0;
+ /* complete request */
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return Status;
+
+ return STATUS_SUCCESS;
}
-
-
NTSTATUS
NewPortTopology(
OUT PPORT* OutPort)
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c
index 801a43df7b1..eef0193c301 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c
@@ -226,6 +226,14 @@ IPortWaveCyclic_fnQueryInterface(
{
return NewIDrmPort((PDRMPORT2*)Output);
}
+ else if (IsEqualGUIDAligned(refiid, &IID_IUnregisterSubdevice))
+ {
+ return NewIUnregisterSubdevice((PUNREGISTERSUBDEVICE*)Output);
+ }
+ else if (IsEqualGUIDAligned(refiid, &IID_IUnregisterPhysicalConnection))
+ {
+ return NewIUnregisterPhysicalConnection((PUNREGISTERPHYSICALCONNECTION*)Output);
+ }
if (RtlStringFromGUID(refiid, &GuidString) == STATUS_SUCCESS)
{
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
index f041e275ec0..63ccedf0a1c 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
@@ -22,7 +22,6 @@ typedef struct
PMINIPORTWAVEPCI Miniport;
PDEVICE_OBJECT pDeviceObject;
- KDPC Dpc;
BOOL bInitialized;
PRESOURCELIST pResourceList;
PSERVICEGROUP ServiceGroup;
@@ -31,6 +30,10 @@ typedef struct
PPCFILTER_DESCRIPTOR pDescriptor;
PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor;
IPortFilterWavePci * Filter;
+
+ LIST_ENTRY EventList;
+ KSPIN_LOCK EventListLock;
+
}IPortWavePciImpl;
static GUID InterfaceGuids[3] =
@@ -134,8 +137,14 @@ IPortEvents_fnAddEventToEventList(
IPortEvents* iface,
IN PKSEVENT_ENTRY EventEntry)
{
- UNIMPLEMENTED
+ KIRQL OldIrql;
+ IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, IPortWavePciImpl, lpVtblPortEvents);
+
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
+ KeAcquireSpinLock(&This->EventListLock, &OldIrql);
+ InsertTailList(&This->EventList, &EventEntry->ListEntry);
+ KeReleaseSpinLock(&This->EventListLock, OldIrql);
}
@@ -287,6 +296,14 @@ IPortWavePci_fnQueryInterface(
{
return NewPortClsVersion((PPORTCLSVERSION*)Output);
}
+ else if (IsEqualGUIDAligned(refiid, &IID_IUnregisterSubdevice))
+ {
+ return NewIUnregisterSubdevice((PUNREGISTERSUBDEVICE*)Output);
+ }
+ else if (IsEqualGUIDAligned(refiid, &IID_IUnregisterPhysicalConnection))
+ {
+ return NewIUnregisterPhysicalConnection((PUNREGISTERPHYSICALCONNECTION*)Output);
+ }
if (RtlStringFromGUID(refiid, &GuidString) == STATUS_SUCCESS)
{
@@ -331,26 +348,6 @@ IPortWavePci_fnRelease(
return This->ref;
}
-VOID
-NTAPI
-ServiceNotifyRoutine(
- IN struct _KDPC *Dpc,
- IN PVOID DeferredContext,
- IN PVOID SystemArgument1,
- IN PVOID SystemArgument2)
-{
- DPRINT("ServiceNotifyRoutine entered %p %p %p\n", DeferredContext, SystemArgument1, SystemArgument2);
-
- IPortWavePciImpl * This = (IPortWavePciImpl*)DeferredContext;
- if (This->ServiceGroup && This->bInitialized)
- {
- DPRINT("ServiceGroup %p\n", This->ServiceGroup);
- This->ServiceGroup->lpVtbl->RequestService(This->ServiceGroup);
- }
-}
-
-
-
NTSTATUS
NTAPI
IPortWavePci_fnInit(
@@ -385,15 +382,13 @@ IPortWavePci_fnInit(
return STATUS_INVALID_PARAMETER;
}
- /* initialize the dpc */
- KeInitializeDpc(&This->Dpc, ServiceNotifyRoutine, (PVOID)This);
-
/* Initialize port object */
This->Miniport = Miniport;
This->pDeviceObject = DeviceObject;
This->bInitialized = TRUE;
This->pResourceList = ResourceList;
-
+ InitializeListHead(&This->EventList);
+ KeInitializeSpinLock(&This->EventListLock);
/* increment reference on miniport adapter */
Miniport->lpVtbl->AddRef(Miniport);
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepcistream.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepcistream.c
deleted file mode 100644
index 4e851d31e5a..00000000000
--- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepcistream.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS Kernel Streaming
- * FILE: drivers/wdm/audio/backpln/portcls/port_wavepcistream.c
- * PURPOSE: Wave PCI Stream object
- * PROGRAMMER: Johannes Anderwald
- */
-
-#include "private.h"
-
-typedef struct
-{
- IPortWavePciStreamVtbl * lpVtbl;
- IIrpQueue *Queue;
- LONG ref;
-
-
-}IPortWavePciStreamImpl;
-
-static
-NTSTATUS
-NTAPI
-IPortWavePciStream_fnQueryInterface(
- IPortWavePciStream* iface,
- IN REFIID refiid,
- OUT PVOID* Output)
-{
- IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
-
- DPRINT("IPortWavePciStream_fnQueryInterface entered\n");
-
- if (IsEqualGUIDAligned(refiid, &IID_IPortWavePciStream) ||
- IsEqualGUIDAligned(refiid, &IID_IUnknown))
- {
- *Output = &This->lpVtbl;
- InterlockedIncrement(&This->ref);
- return STATUS_SUCCESS;
- }
-
- return STATUS_UNSUCCESSFUL;
-}
-
-static
-ULONG
-NTAPI
-IPortWavePciStream_fnAddRef(
- IPortWavePciStream* iface)
-{
- IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
- DPRINT("IPortWavePciStream_fnAddRef entered\n");
-
- return InterlockedIncrement(&This->ref);
-}
-
-static
-ULONG
-NTAPI
-IPortWavePciStream_fnRelease(
- IPortWavePciStream* iface)
-{
- IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
-
- InterlockedDecrement(&This->ref);
-
- DPRINT("IPortWavePciStream_fnRelease entered %u\n", This->ref);
-
- if (This->ref == 0)
- {
- This->Queue->lpVtbl->Release(This->Queue);
- FreeItem(This, TAG_PORTCLASS);
- return 0;
- }
- /* Return new reference count */
- return This->ref;
-}
-
-static
-NTSTATUS
-NTAPI
-IPortWavePciStream_fnGetMapping(
- IN IPortWavePciStream *iface,
- IN PVOID Tag,
- OUT PPHYSICAL_ADDRESS PhysicalAddress,
- OUT PVOID *VirtualAddress,
- OUT PULONG ByteCount,
- OUT PULONG Flags)
-{
- IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
-
- ASSERT_IRQL(DISPATCH_LEVEL);
- return This->Queue->lpVtbl->GetMappingWithTag(This->Queue, Tag, PhysicalAddress, VirtualAddress, ByteCount, Flags);
-}
-
-static
-NTSTATUS
-NTAPI
-IPortWavePciStream_fnReleaseMapping(
- IN IPortWavePciStream *iface,
- IN PVOID Tag)
-{
- IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
-
- ASSERT_IRQL(DISPATCH_LEVEL);
- return This->Queue->lpVtbl->ReleaseMappingWithTag(This->Queue, Tag);
-}
-
-static
-NTSTATUS
-NTAPI
-IPortWavePciStream_fnTerminatePacket(
- IN IPortWavePciStream *iface)
-{
- UNIMPLEMENTED
- ASSERT_IRQL(DISPATCH_LEVEL);
- return STATUS_SUCCESS;
-}
-
-
-static IPortWavePciStreamVtbl vt_PortWavePciStream =
-{
- IPortWavePciStream_fnQueryInterface,
- IPortWavePciStream_fnAddRef,
- IPortWavePciStream_fnRelease,
- IPortWavePciStream_fnGetMapping,
- IPortWavePciStream_fnReleaseMapping,
- IPortWavePciStream_fnTerminatePacket
-};
-
-NTSTATUS
-NTAPI
-NewIPortWavePciStream(
- OUT PPORTWAVEPCISTREAM *Stream)
-{
- IIrpQueue * Queue;
- IPortWavePciStreamImpl * This;
- NTSTATUS Status;
-
- Status = NewIrpQueue(&Queue);
- if (!NT_SUCCESS(Status))
- return Status;
-
- This = AllocateItem(NonPagedPool, sizeof(IPortWavePciStreamImpl), TAG_PORTCLASS);
- if (!This)
- {
- Queue->lpVtbl->Release(Queue);
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- This->lpVtbl = &vt_PortWavePciStream;
- This->ref = 1;
- This->Queue = Queue;
-
- *Stream = (PPORTWAVEPCISTREAM)&This->lpVtbl;
- return STATUS_SUCCESS;
-}
-
-IIrpQueue*
-NTAPI
-IPortWavePciStream_GetIrpQueue(
- IN IPortWavePciStream *iface)
-{
- IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
- return This->Queue;
-}
-
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavert.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavert.c
index 37e851388c3..14a6a113f5d 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavert.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavert.c
@@ -222,6 +222,14 @@ IPortWaveRT_fnQueryInterface(
{
return NewIDrmPort((PDRMPORT2*)Output);
}
+ else if (IsEqualGUIDAligned(refiid, &IID_IUnregisterSubdevice))
+ {
+ return NewIUnregisterSubdevice((PUNREGISTERSUBDEVICE*)Output);
+ }
+ else if (IsEqualGUIDAligned(refiid, &IID_IUnregisterPhysicalConnection))
+ {
+ return NewIUnregisterPhysicalConnection((PUNREGISTERPHYSICALCONNECTION*)Output);
+ }
if (RtlStringFromGUID(refiid, &GuidString) == STATUS_SUCCESS)
{
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavertstream.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavertstream.c
index f9ebafba17d..45ee9a7e60b 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavertstream.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavertstream.c
@@ -10,7 +10,7 @@
typedef struct
{
- IPortWaveRTStreamVtbl *lpVtbl;
+ IPortWaveRTStreamInitVtbl *lpVtbl;
LONG ref;
}IPortWaveRTStreamImpl;
@@ -21,8 +21,8 @@ typedef struct
static
NTSTATUS
NTAPI
-IPortWaveRTStream_fnQueryInterface(
- IPortWaveRTStream* iface,
+IPortWaveRTStreamInit_fnQueryInterface(
+ IPortWaveRTStreamInit * iface,
IN REFIID refiid,
OUT PVOID* Output)
{
@@ -46,8 +46,8 @@ IPortWaveRTStream_fnQueryInterface(
static
ULONG
NTAPI
-IPortWaveRTStream_fnAddRef(
- IPortWaveRTStream* iface)
+IPortWaveRTStreamInit_fnAddRef(
+ IPortWaveRTStreamInit * iface)
{
IPortWaveRTStreamImpl * This = (IPortWaveRTStreamImpl*)iface;
DPRINT("IPortWaveRTStream_fnAddRef entered\n");
@@ -61,8 +61,8 @@ IPortWaveRTStream_fnAddRef(
static
ULONG
NTAPI
-IPortWaveRTStream_fnRelease(
- IPortWaveRTStream* iface)
+IPortWaveRTStreamInit_fnRelease(
+ IPortWaveRTStreamInit * iface)
{
IPortWaveRTStreamImpl * This = (IPortWaveRTStreamImpl*)iface;
@@ -85,8 +85,8 @@ IPortWaveRTStream_fnRelease(
static
PMDL
NTAPI
-IPortWaveRTStream_fnAllocatePagesForMdl(
- IN IPortWaveRTStream* iface,
+IPortWaveRTStreamInit_fnAllocatePagesForMdl(
+ IN IPortWaveRTStreamInit * iface,
IN PHYSICAL_ADDRESS HighAddress,
IN SIZE_T TotalBytes)
{
@@ -99,8 +99,8 @@ IPortWaveRTStream_fnAllocatePagesForMdl(
static
PMDL
NTAPI
-IPortWaveRTStream_fnAllocateContiguousPagesForMdl(
- IN IPortWaveRTStream* iface,
+IPortWaveRTStreamInit_fnAllocateContiguousPagesForMdl(
+ IN IPortWaveRTStreamInit * iface,
IN PHYSICAL_ADDRESS LowAddress,
IN PHYSICAL_ADDRESS HighAddress,
IN SIZE_T TotalBytes)
@@ -129,12 +129,14 @@ IPortWaveRTStream_fnAllocateContiguousPagesForMdl(
if (MmGetMdlByteCount(Mdl) < TotalBytes)
{
+ DPRINT1("ByteCount %u Required %u\n", MmGetMdlByteCount(Mdl), TotalBytes);
MmFreePagesFromMdl(Mdl);
ExFreePool(Mdl);
return NULL;
}
- return NULL;
+ DPRINT("Result %p\n", Mdl);
+ return Mdl;
}
/*
@@ -143,8 +145,8 @@ IPortWaveRTStream_fnAllocateContiguousPagesForMdl(
static
PVOID
NTAPI
-IPortWaveRTStream_fnMapAllocatedPages(
- IN IPortWaveRTStream* iface,
+IPortWaveRTStreamInit_fnMapAllocatedPages(
+ IN IPortWaveRTStreamInit * iface,
IN PMDL MemoryDescriptorList,
IN MEMORY_CACHING_TYPE CacheType)
{
@@ -157,8 +159,8 @@ IPortWaveRTStream_fnMapAllocatedPages(
static
VOID
NTAPI
-IPortWaveRTStream_fnUnmapAllocatedPages(
- IN IPortWaveRTStream* iface,
+IPortWaveRTStreamInit_fnUnmapAllocatedPages(
+ IN IPortWaveRTStreamInit * iface,
IN PVOID BaseAddress,
IN PMDL MemoryDescriptorList)
{
@@ -171,8 +173,8 @@ IPortWaveRTStream_fnUnmapAllocatedPages(
static
VOID
NTAPI
-IPortWaveRTStream_fnFreePagesFromMdl(
- IN IPortWaveRTStream* iface,
+IPortWaveRTStreamInit_fnFreePagesFromMdl(
+ IN IPortWaveRTStreamInit * iface,
IN PMDL MemoryDescriptorList)
{
MmFreePagesFromMdl(MemoryDescriptorList);
@@ -185,8 +187,8 @@ IPortWaveRTStream_fnFreePagesFromMdl(
static
ULONG
NTAPI
-IPortWaveRTStream_fnGetPhysicalPagesCount(
- IN IPortWaveRTStream* iface,
+IPortWaveRTStreamInit_fnGetPhysicalPagesCount(
+ IN IPortWaveRTStreamInit * iface,
IN PMDL MemoryDescriptorList)
{
return ADDRESS_AND_SIZE_TO_SPAN_PAGES(0, MmGetMdlByteCount(MemoryDescriptorList));
@@ -198,13 +200,15 @@ IPortWaveRTStream_fnGetPhysicalPagesCount(
static
PHYSICAL_ADDRESS
NTAPI
-IPortWaveRTStream_fnGetPhysicalPageAddress(
- IN IPortWaveRTStream* iface,
- IN PMDL MemoryDescriptorList,
+IPortWaveRTStreamInit_fnGetPhysicalPageAddress(
+ IN IPortWaveRTStreamInit * iface,
+ IN PPHYSICAL_ADDRESS Address,
+ IN PMDL MemoryDescriptorList,
IN ULONG Index)
{
PVOID Buffer;
ULONG Pages;
+ PHYSICAL_ADDRESS Result, Addr;
Pages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(0, MmGetMdlByteCount(MemoryDescriptorList));
if (Pages <= Index)
@@ -214,21 +218,26 @@ IPortWaveRTStream_fnGetPhysicalPageAddress(
}
Buffer = UlongToPtr(PtrToUlong(MmGetSystemAddressForMdl(MemoryDescriptorList)) + Index * PAGE_SIZE);
- return MmGetPhysicalAddress(Buffer);
+
+ Addr = MmGetPhysicalAddress(Buffer);
+ Address->QuadPart = Addr.QuadPart;
+ Result.QuadPart = (PtrToUlong(Address));
+
+ return Result;
}
-static IPortWaveRTStreamVtbl vt_PortWaveRTStream =
+static IPortWaveRTStreamInitVtbl vt_PortWaveRTStream =
{
- IPortWaveRTStream_fnQueryInterface,
- IPortWaveRTStream_fnAddRef,
- IPortWaveRTStream_fnRelease,
- IPortWaveRTStream_fnAllocatePagesForMdl,
- IPortWaveRTStream_fnAllocateContiguousPagesForMdl,
- IPortWaveRTStream_fnMapAllocatedPages,
- IPortWaveRTStream_fnUnmapAllocatedPages,
- IPortWaveRTStream_fnFreePagesFromMdl,
- IPortWaveRTStream_fnGetPhysicalPagesCount,
- IPortWaveRTStream_fnGetPhysicalPageAddress
+ IPortWaveRTStreamInit_fnQueryInterface,
+ IPortWaveRTStreamInit_fnAddRef,
+ IPortWaveRTStreamInit_fnRelease,
+ IPortWaveRTStreamInit_fnAllocatePagesForMdl,
+ IPortWaveRTStreamInit_fnAllocateContiguousPagesForMdl,
+ IPortWaveRTStreamInit_fnMapAllocatedPages,
+ IPortWaveRTStreamInit_fnUnmapAllocatedPages,
+ IPortWaveRTStreamInit_fnFreePagesFromMdl,
+ IPortWaveRTStreamInit_fnGetPhysicalPagesCount,
+ IPortWaveRTStreamInit_fnGetPhysicalPageAddress
};
NTSTATUS
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
index 0032e58ff0d..ac75bc25911 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
+++ b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
@@ -8,9 +8,9 @@
ntoskrnl
ks
drmk
- rtl
hal
libcntpr
+ pseh
adapter.c
api.c
connection.c
@@ -41,7 +41,6 @@
port_topology.c
port_wavecyclic.c
port_wavepci.c
- port_wavepcistream.c
port_wavert.c
port_wavertstream.c
power.c
@@ -50,6 +49,7 @@
resource.c
service_group.c
undoc.c
+ unregister.c
version.c
portcls.rc
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/private.h b/reactos/drivers/wdm/audio/backpln/portcls/private.h
index a0dd108b646..0b3df66032a 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/private.h
+++ b/reactos/drivers/wdm/audio/backpln/portcls/private.h
@@ -7,6 +7,8 @@
#ifndef PORTCLS_PRIVATE_H
#define PORTCLS_PRIVATE_H
+//#define _KS_NO_ANONYMOUS_STRUCTURES_
+
#include
#include
#define NDEBUG
@@ -24,11 +26,6 @@
#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
#define TAG_PORTCLASS TAG('P', 'C', 'L', 'S')
-#ifdef _MSC_VER
- #define STDCALL
- #define DDKAPI
-#endif
-
#define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x))
NTSTATUS
@@ -160,7 +157,8 @@ NTAPI
NewDispatchObject(
IN PIRP Irp,
IN IIrpTarget * Target,
- IN LPWSTR Name);
+ IN ULONG ObjectCreateItemCount,
+ IN PKSOBJECT_CREATE_ITEM ObjectCreateItem);
PMINIPORTWAVECYCLIC
GetWaveCyclicMiniport(
@@ -182,24 +180,6 @@ NTAPI
NewIrpQueue(
IN IIrpQueue **Queue);
-
-typedef struct
-{
- LIST_ENTRY Entry;
- KSOBJECT_HEADER ObjectHeader;
-}SUBDEVICE_ENTRY;
-
-typedef struct
-{
- LIST_ENTRY Entry;
- ISubdevice * FromSubDevice;
- LPWSTR FromUnicodeString;
- ULONG FromPin;
- ISubdevice * ToSubDevice;
- LPWSTR ToUnicodeString;
- ULONG ToPin;
-}PHYSICAL_CONNECTION;
-
NTSTATUS
NTAPI
TopologyPropertyHandler(
@@ -214,37 +194,6 @@ PinPropertyHandler(
IN PKSIDENTIFIER Request,
IN OUT PVOID Data);
-typedef struct
-{
- KSDEVICE_HEADER KsDeviceHeader;
- PDEVICE_OBJECT PhysicalDeviceObject;
- PDEVICE_OBJECT PrevDeviceObject;
- PCPFNSTARTDEVICE StartDevice;
- ULONG_PTR Unused[4];
- IAdapterPowerManagement * AdapterPowerManagement;
- ULONG MaxSubDevices;
- KSOBJECT_CREATE_ITEM * CreateItems;
-
- IResourceList* resources;
- LIST_ENTRY SubDeviceList;
- LIST_ENTRY PhysicalConnectionList;
-
-} PCLASS_DEVICE_EXTENSION, *PPCLASS_DEVICE_EXTENSION;
-
-
-typedef struct
-{
- KSSTREAM_HEADER Header;
- PIRP Irp;
-}CONTEXT_WRITE, *PCONTEXT_WRITE;
-
-typedef struct
-{
- PVOID Pin;
- PIO_WORKITEM WorkItem;
- PIRP Irp;
-}CLOSESTREAM_CONTEXT, *PCLOSESTREAM_CONTEXT;
-
NTSTATUS
NTAPI
PcDmaMasterDescription(
@@ -326,15 +275,21 @@ PDEVICE_OBJECT
GetDeviceObject(
IPortWaveCyclic* iface);
-IIrpQueue*
+VOID
NTAPI
-IPortWavePciStream_GetIrpQueue(
- IN IPortWavePciStream *iface);
+PcIoTimerRoutine(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PVOID Context);
NTSTATUS
NTAPI
-NewIPortWavePciStream(
- OUT PPORTWAVEPCISTREAM *Stream);
+NewIUnregisterSubdevice(
+ OUT PUNREGISTERSUBDEVICE *OutDevice);
+
+NTSTATUS
+NTAPI
+NewIUnregisterPhysicalConnection(
+ OUT PUNREGISTERPHYSICALCONNECTION *OutConnection);
#define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\
PropGeneral, PropInstances, PropIntersection)\
@@ -353,4 +308,71 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\
DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(PropGeneral)\
}
+typedef struct
+{
+ LIST_ENTRY Entry;
+ UNICODE_STRING SymbolicLink;
+}SYMBOLICLINK_ENTRY, *PSYMBOLICLINK_ENTRY;
+
+
+typedef struct
+{
+ LIST_ENTRY Entry;
+ ISubdevice *SubDevice;
+ UNICODE_STRING Name;
+ LIST_ENTRY SymbolicLinkList;
+}SUBDEVICE_ENTRY, *PSUBDEVICE_ENTRY;
+
+typedef struct
+{
+ LIST_ENTRY Entry;
+ ISubdevice * FromSubDevice;
+ UNICODE_STRING FromUnicodeString;
+ ULONG FromPin;
+ ISubdevice * ToSubDevice;
+ UNICODE_STRING ToUnicodeString;
+ ULONG ToPin;
+}PHYSICAL_CONNECTION, *PPHYSICAL_CONNECTION;
+
+typedef struct
+{
+ KSDEVICE_HEADER KsDeviceHeader;
+ PDEVICE_OBJECT PhysicalDeviceObject;
+ PDEVICE_OBJECT PrevDeviceObject;
+ PCPFNSTARTDEVICE StartDevice;
+ ULONG_PTR Unused[4];
+ IAdapterPowerManagement * AdapterPowerManagement;
+ ULONG MaxSubDevices;
+ KSOBJECT_CREATE_ITEM * CreateItems;
+
+ IResourceList* resources;
+ LIST_ENTRY SubDeviceList;
+ LIST_ENTRY PhysicalConnectionList;
+
+ LIST_ENTRY TimerList;
+ KSPIN_LOCK TimerListLock;
+
+} PCLASS_DEVICE_EXTENSION, *PPCLASS_DEVICE_EXTENSION;
+
+
+typedef struct
+{
+ KSSTREAM_HEADER Header;
+ PIRP Irp;
+}CONTEXT_WRITE, *PCONTEXT_WRITE;
+
+typedef struct
+{
+ PVOID Pin;
+ PIO_WORKITEM WorkItem;
+ PIRP Irp;
+}CLOSESTREAM_CONTEXT, *PCLOSESTREAM_CONTEXT;
+
+typedef struct
+{
+ LIST_ENTRY Entry;
+ PIO_TIMER_ROUTINE pTimerRoutine;
+ PVOID Context;
+}TIMER_CONTEXT, *PTIMER_CONTEXT;
+
#endif
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.c b/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.c
index 7a174129bd6..cfab5b34e91 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.c
@@ -121,9 +121,9 @@ PinPropertyHandler(
IN PKSIDENTIFIER Request,
IN OUT PVOID Data)
{
- PKSOBJECT_CREATE_ITEM CreateItem;
- PSUBDEVICE_DESCRIPTOR Descriptor;
PIO_STACK_LOCATION IoStack;
+ //PKSOBJECT_CREATE_ITEM CreateItem;
+ PSUBDEVICE_DESCRIPTOR Descriptor;
IIrpTarget * IrpTarget;
IPort *Port;
ISubdevice *SubDevice;
@@ -134,10 +134,11 @@ PinPropertyHandler(
Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
ASSERT(Descriptor);
- /* Access the create item */
- CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
/* Get the IrpTarget */
- IrpTarget = (IIrpTarget*)CreateItem->Context;
+ IrpTarget = (IIrpTarget*)IoStack->FileObject->FsContext2;
/* Get the parent */
Status = IrpTarget->lpVtbl->QueryInterface(IrpTarget, &IID_IPort, (PVOID*)&Port);
if (!NT_SUCCESS(Status))
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/service_group.c b/reactos/drivers/wdm/audio/backpln/portcls/service_group.c
index e0f7151d8f0..7c73c44957e 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/service_group.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/service_group.c
@@ -26,6 +26,8 @@ typedef struct
BOOL TimerActive;
KTIMER Timer;
KDPC Dpc;
+ KEVENT Event;
+ LONG ThreadActive;
}IServiceGroupImpl;
@@ -94,6 +96,10 @@ IServiceGroup_fnRelease(
FreeItem(Entry, TAG_PORTCLASS);
}
KeCancelTimer(&This->Timer);
+ if (This->ThreadActive)
+ {
+ KeSetEvent(&This->Event, 0, TRUE);
+ }
FreeItem(This, TAG_PORTCLASS);
return 0;
}
@@ -203,18 +209,60 @@ IServiceGroupDpc(
}
}
+
+VOID
+NTAPI
+ServiceGroupThread(IN PVOID StartContext)
+{
+ NTSTATUS Status;
+ KWAIT_BLOCK WaitBlockArray[2];
+ PVOID WaitObjects[2];
+ IServiceGroupImpl * This = (IServiceGroupImpl*)StartContext;
+
+ /* Set thread state */
+ InterlockedIncrement(&This->ThreadActive);
+
+ /* Setup the wait objects */
+ WaitObjects[0] = &This->Timer;
+ WaitObjects[1] = &This->Event;
+
+ do
+ {
+ /* Wait on our objects */
+ Status = KeWaitForMultipleObjects(2, WaitObjects, WaitAny, Executive, KernelMode, FALSE, NULL, WaitBlockArray);
+
+ switch(Status)
+ {
+ case STATUS_WAIT_0:
+ IServiceGroupDpc(&This->Dpc, (PVOID)This, NULL, NULL);
+ break;
+ case STATUS_WAIT_1:
+ PsTerminateSystemThread(STATUS_SUCCESS);
+ return;
+ }
+ }while(TRUE);
+}
+
VOID
NTAPI
IServiceGroup_fnSupportDelayedService(
IN IServiceGroup * iface)
{
+ NTSTATUS Status;
+ HANDLE ThreadHandle;
IServiceGroupImpl * This = (IServiceGroupImpl*)iface;
ASSERT_IRQL(DISPATCH_LEVEL);
- if (!This->Initialized)
+ if (This->Initialized)
+ return;
+
+ KeInitializeTimerEx(&This->Timer, NotificationTimer);
+
+ Status = PsCreateSystemThread(&ThreadHandle, THREAD_ALL_ACCESS, NULL, 0, NULL, ServiceGroupThread, (PVOID)This);
+ if (NT_SUCCESS(Status))
{
- KeInitializeTimerEx(&This->Timer, NotificationTimer);
+ ZwClose(ThreadHandle);
This->Initialized = TRUE;
}
}
@@ -290,6 +338,7 @@ PcNewServiceGroup(
This->ref = 1;
KeInitializeDpc(&This->Dpc, IServiceGroupDpc, (PVOID)This);
KeSetImportanceDpc(&This->Dpc, HighImportance);
+ KeInitializeEvent(&This->Event, NotificationEvent, FALSE);
InitializeListHead(&This->ServiceSinkHead);
*OutServiceGroup = (PSERVICEGROUP)&This->lpVtbl;
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/undoc.c b/reactos/drivers/wdm/audio/backpln/portcls/undoc.c
index b7c736c78e2..4e3cc28a564 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/undoc.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/undoc.c
@@ -327,27 +327,3 @@ PcValidateConnectRequest(
return KsValidateConnectRequest(Irp, Factory->PinDescriptorCount, Factory->KsPinDescriptor, Connect);
}
-
-/* PcDeleteSubdeviceDescriptor */
-
-/* PcFreeEventTable */
-
-/* PcFreePropertyTable */
-
-/* PcGenerateEventDeferredRoutine */
-
-/* PcGenerateEventList */
-
-/* PcHandleDisableEventWithTable */
-
-/* PcHandleEnableEventWithTable */
-
-/* PcHandlePropertyWithTable */
-
-/* PcPinPropertyHandler */
-
-/* PcTerminateConnection */
-
-/* PcValidateConnectRequest */
-
-/* PcVerifyFilterIsReady */
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/unregister.c b/reactos/drivers/wdm/audio/backpln/portcls/unregister.c
new file mode 100644
index 00000000000..41a7af5a572
--- /dev/null
+++ b/reactos/drivers/wdm/audio/backpln/portcls/unregister.c
@@ -0,0 +1,172 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/backpln/portcls/unregister.c
+ * PURPOSE: Unregisters a subdevice
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+#include "private.h"
+
+typedef struct
+{
+ IUnregisterSubdeviceVtbl *lpVtbl;
+ LONG ref;
+
+}IUnregisterSubdeviceImpl;
+
+NTSTATUS
+NTAPI
+IUnregisterSubdevice_fnQueryInterface(
+ IUnregisterSubdevice* iface,
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ IUnregisterSubdeviceImpl * This = (IUnregisterSubdeviceImpl*)iface;
+
+ if (IsEqualGUIDAligned(refiid, &IID_IUnregisterSubdevice) ||
+ IsEqualGUIDAligned(refiid, &IID_IUnknown))
+ {
+ *Output = &This->lpVtbl;
+ InterlockedIncrement(&This->ref);
+ return STATUS_SUCCESS;
+ }
+
+ return STATUS_UNSUCCESSFUL;
+}
+
+ULONG
+NTAPI
+IUnregisterSubdevice_fnAddRef(
+ IUnregisterSubdevice* iface)
+{
+ IUnregisterSubdeviceImpl * This = (IUnregisterSubdeviceImpl*)iface;
+
+ return InterlockedIncrement(&This->ref);
+}
+
+ULONG
+NTAPI
+IUnregisterSubdevice_fnRelease(
+ IUnregisterSubdevice* iface)
+{
+ IUnregisterSubdeviceImpl * This = (IUnregisterSubdeviceImpl*)iface;
+
+ InterlockedDecrement(&This->ref);
+
+ if (This->ref == 0)
+ {
+ FreeItem(This, TAG_PORTCLASS);
+ return 0;
+ }
+ return This->ref;
+}
+
+NTSTATUS
+NTAPI
+IUnregisterSubdevice_fnUnregisterSubdevice(
+ IUnregisterSubdevice* iface,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PUNKNOWN Unknown)
+{
+ PPCLASS_DEVICE_EXTENSION DeviceExtension;
+ PLIST_ENTRY Entry;
+ PSUBDEVICE_ENTRY SubDeviceEntry;
+ PSYMBOLICLINK_ENTRY SymLinkEntry;
+ ISubdevice *SubDevice;
+ ULONG Found;
+ ULONG Index;
+ NTSTATUS Status;
+
+ ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
+ DeviceExtension = (PPCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ ASSERT(DeviceExtension);
+
+ /* look up our undocumented interface */
+ Status = Unknown->lpVtbl->QueryInterface(Unknown, &IID_ISubdevice, (LPVOID)&SubDevice);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("No ISubdevice interface\n");
+ /* the provided port driver doesnt support ISubdevice */
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ Entry = DeviceExtension->SubDeviceList.Flink;
+ Found = FALSE;
+ /* loop subdevice entry list and search for the subdevice */
+ while(Entry != &DeviceExtension->SubDeviceList)
+ {
+ SubDeviceEntry = (PSUBDEVICE_ENTRY)CONTAINING_RECORD(Entry, SUBDEVICE_ENTRY, Entry);
+ if (SubDeviceEntry->SubDevice == SubDevice)
+ {
+ Found = TRUE;
+ break;
+ }
+ Entry = Entry->Flink;
+ }
+ /* release the subdevice */
+ SubDevice->lpVtbl->Release(SubDevice);
+
+ if (!Found)
+ return STATUS_NOT_FOUND;
+
+ /* remove subdevice entry */
+ RemoveEntryList(&SubDeviceEntry->Entry);
+
+ /* loop our create items and disable the create handler */
+ for(Index = 0; Index < DeviceExtension->MaxSubDevices; Index++)
+ {
+ if (!RtlCompareUnicodeString(&SubDeviceEntry->Name, &DeviceExtension->CreateItems[Index].ObjectClass, TRUE))
+ {
+ DeviceExtension->CreateItems[Index].Create = NULL;
+ RtlInitUnicodeString(&DeviceExtension->CreateItems[Index].ObjectClass, NULL);
+ break;
+ }
+ }
+
+ /* now unregister device interfaces */
+ while(!IsListEmpty(&SubDeviceEntry->SymbolicLinkList))
+ {
+ /* remove entry */
+ Entry = RemoveHeadList(&SubDeviceEntry->SymbolicLinkList);
+ /* get symlink entry */
+ SymLinkEntry = (PSYMBOLICLINK_ENTRY)CONTAINING_RECORD(Entry, SYMBOLICLINK_ENTRY, Entry);
+
+ /* unregister device interface */
+ IoSetDeviceInterfaceState(&SymLinkEntry->SymbolicLink, FALSE);
+ /* free symbolic link */
+ RtlFreeUnicodeString(&SymLinkEntry->SymbolicLink);
+ /* free sym entry */
+ FreeItem(SymLinkEntry, TAG_PORTCLASS);
+ }
+
+ /* free subdevice entry */
+ ExFreePool(SubDeviceEntry);
+
+ return STATUS_SUCCESS;
+}
+
+static IUnregisterSubdeviceVtbl vt_IUnregisterSubdeviceVtbl =
+{
+ IUnregisterSubdevice_fnQueryInterface,
+ IUnregisterSubdevice_fnAddRef,
+ IUnregisterSubdevice_fnRelease,
+ IUnregisterSubdevice_fnUnregisterSubdevice
+};
+
+NTSTATUS
+NTAPI
+NewIUnregisterSubdevice(
+ OUT PUNREGISTERSUBDEVICE *OutDevice)
+{
+ IUnregisterSubdeviceImpl * This = AllocateItem(NonPagedPool, sizeof(IUnregisterSubdeviceImpl), TAG_PORTCLASS);
+ if (!This)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ This->lpVtbl = &vt_IUnregisterSubdeviceVtbl;
+ This->ref = 1;
+
+ *OutDevice = (PUNREGISTERSUBDEVICE)&This->lpVtbl;
+ return STATUS_SUCCESS;
+}
diff --git a/reactos/drivers/wdm/audio/filters/kmixer/filter.c b/reactos/drivers/wdm/audio/filters/kmixer/filter.c
index 68400372d39..42794478dd0 100644
--- a/reactos/drivers/wdm/audio/filters/kmixer/filter.c
+++ b/reactos/drivers/wdm/audio/filters/kmixer/filter.c
@@ -179,6 +179,25 @@ static KSDISPATCH_TABLE DispatchTable =
Dispatch_fnFastWrite,
};
+NTSTATUS
+NTAPI
+DispatchCreateKMixPin(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NTSTATUS Status;
+
+ DPRINT("DispatchCreateKMix entered\n");
+
+ /* create the pin */
+ Status = CreatePin(Irp);
+
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+}
+
NTSTATUS
NTAPI
DispatchCreateKMix(
@@ -187,32 +206,13 @@ DispatchCreateKMix(
{
NTSTATUS Status;
KSOBJECT_HEADER ObjectHeader;
- PIO_STACK_LOCATION IoStatus;
- LPWSTR Buffer;
PKSOBJECT_CREATE_ITEM CreateItem;
static LPWSTR KS_NAME_PIN = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}";
- IoStatus = IoGetCurrentIrpStackLocation(Irp);
- Buffer = IoStatus->FileObject->FileName.Buffer;
-
DPRINT("DispatchCreateKMix entered\n");
- if (Buffer)
- {
- /* is the request for a new pin */
- if (!wcsncmp(KS_NAME_PIN, Buffer, wcslen(KS_NAME_PIN)))
- {
- Status = CreatePin(Irp);
-
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return Status;
- }
- }
-
- /* allocate create item */
+ /* allocate create item */
CreateItem = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
if (!CreateItem)
{
@@ -225,7 +225,10 @@ DispatchCreateKMix(
/* zero create struct */
RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
- RtlInitUnicodeString(&CreateItem->ObjectClass, L"KMixer");
+ /* initialize pin create item */
+ CreateItem->Create = DispatchCreateKMixPin;
+ RtlInitUnicodeString(&CreateItem->ObjectClass, KS_NAME_PIN);
+
/* allocate object header */
Status = KsAllocateObjectHeader(&ObjectHeader, 1, CreateItem, Irp, &DispatchTable);
@@ -254,6 +257,7 @@ KMixAllocateDeviceHeader(
/* initialize create item struct */
RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
CreateItem->Create = DispatchCreateKMix;
+ CreateItem->Flags = KSCREATE_ITEM_WILDCARD;
RtlInitUnicodeString(&CreateItem->ObjectClass, L"KMixer");
Status = KsAllocateDeviceHeader(&DeviceExtension->KsDeviceHeader,
diff --git a/reactos/drivers/wdm/audio/filters/kmixer/kmixer.h b/reactos/drivers/wdm/audio/filters/kmixer/kmixer.h
index d56382e7089..d43c3fae576 100644
--- a/reactos/drivers/wdm/audio/filters/kmixer/kmixer.h
+++ b/reactos/drivers/wdm/audio/filters/kmixer/kmixer.h
@@ -5,7 +5,7 @@
#include
#include
#include
-#define NDEBUG
+#define YDEBUG
#include
#include
@@ -18,6 +18,14 @@ typedef struct
}KMIXER_DEVICE_EXT, *PKMIXER_DEVICE_EXT;
+typedef struct
+{
+ KSPIN_LOCK Lock;
+
+
+}SUM_NODE_CONTEXT, *PSUM_NODE_CONTEXT;
+
+
NTSTATUS
NTAPI
KMixAllocateDeviceHeader(
diff --git a/reactos/drivers/wdm/audio/filters/kmixer/kmixer.rbuild b/reactos/drivers/wdm/audio/filters/kmixer/kmixer.rbuild
index ea9ae7d16c3..d5fcf8c3906 100644
--- a/reactos/drivers/wdm/audio/filters/kmixer/kmixer.rbuild
+++ b/reactos/drivers/wdm/audio/filters/kmixer/kmixer.rbuild
@@ -5,7 +5,6 @@
.
ntoskrnl
ks
- rtl
hal
libcntpr
libsamplerate
diff --git a/reactos/drivers/wdm/audio/filters/kmixer/pin.c b/reactos/drivers/wdm/audio/filters/kmixer/pin.c
index 2a5b0aaea25..71f817ce684 100644
--- a/reactos/drivers/wdm/audio/filters/kmixer/pin.c
+++ b/reactos/drivers/wdm/audio/filters/kmixer/pin.c
@@ -34,6 +34,8 @@ PerformSampleRateConversion(
DPRINT("PerformSampleRateConversion OldRate %u NewRate %u BytesPerSample %u NumChannels %u Irql %u\n", OldRate, NewRate, BytesPerSample, NumChannels, KeGetCurrentIrql());
+ ASSERT(BytesPerSample == 1 || BytesPerSample == 2 || BytesPerSample == 4);
+
/* first acquire float save context */
Status = KeSaveFloatingPointState(&FloatSave);
@@ -43,9 +45,9 @@ PerformSampleRateConversion(
return Status;
}
- NumSamples = BufferLength / BytesPerSample;
+ NumSamples = BufferLength / (BytesPerSample * NumChannels);
- FloatIn = ExAllocatePool(NonPagedPool, NumSamples * sizeof(FLOAT));
+ FloatIn = ExAllocatePool(NonPagedPool, NumSamples * NumChannels * sizeof(FLOAT));
if (!FloatIn)
{
KeRestoreFloatingPointState(&FloatSave);
@@ -54,7 +56,7 @@ PerformSampleRateConversion(
NewSamples = lrintf(((FLOAT)NumSamples * ((FLOAT)NewRate / (FLOAT)OldRate))) + 2;
- FloatOut = ExAllocatePool(NonPagedPool, NewSamples * sizeof(FLOAT));
+ FloatOut = ExAllocatePool(NonPagedPool, NewSamples * NumChannels * sizeof(FLOAT));
if (!FloatOut)
{
ExFreePool(FloatIn);
@@ -62,7 +64,7 @@ PerformSampleRateConversion(
return STATUS_INSUFFICIENT_RESOURCES;
}
- ResultOut = ExAllocatePool(NonPagedPool, NewSamples * (BytesPerSample/8));
+ ResultOut = ExAllocatePool(NonPagedPool, NewSamples * NumChannels * BytesPerSample);
if (!FloatOut)
{
ExFreePool(FloatIn);
@@ -83,31 +85,24 @@ PerformSampleRateConversion(
}
/* fixme use asm */
- if (BytesPerSample == 8)
+ if (BytesPerSample == 1)
{
- for(Index = 0; Index < NumSamples; Index++)
- FloatIn[Index] = (float)Buffer[Index];
+ for(Index = 0; Index < NumSamples * NumChannels; Index++)
+ FloatIn[Index] = (float)(Buffer[Index] / (1.0 * 0x80));
}
- else if (BytesPerSample == 16)
+ else if (BytesPerSample == 2)
{
- PUSHORT Res = (PUSHORT)ResultOut;
- for(Index = 0; Index < NumSamples; Index++)
- FloatIn[Index] = (float)_byteswap_ushort(Res[Index]);
+ src_short_to_float_array((short*)Buffer, FloatIn, NumSamples * NumChannels);
}
- else
+ else if (BytesPerSample == 4)
{
- UNIMPLEMENTED
- KeRestoreFloatingPointState(&FloatSave);
- ExFreePool(FloatIn);
- ExFreePool(FloatOut);
- ExFreePool(ResultOut);
- return STATUS_UNSUCCESSFUL;
+ src_int_to_float_array((int*)Buffer, FloatIn, NumSamples * NumChannels);
}
Data.data_in = FloatIn;
Data.data_out = FloatOut;
- Data.input_frames = NumSamples / NumChannels;
- Data.output_frames = NewSamples / NumChannels;
+ Data.input_frames = NumSamples;
+ Data.output_frames = NewSamples;
Data.src_ratio = (double)NewRate / (double)OldRate;
error = src_process(State, &Data);
@@ -121,26 +116,33 @@ PerformSampleRateConversion(
return STATUS_UNSUCCESSFUL;
}
- if (BytesPerSample == 8)
+ if (BytesPerSample == 1)
{
+ /* FIXME perform over/under clipping */
+
for(Index = 0; Index < Data.output_frames_gen * NumChannels; Index++)
- ResultOut[Index] = lrintf(FloatOut[Index]);
+ ResultOut[Index] = (lrintf(FloatOut[Index]) >> 24);
}
- else if (BytesPerSample == 16)
+ else if (BytesPerSample == 2)
{
PUSHORT Res = (PUSHORT)ResultOut;
- for(Index = 0; Index < Data.output_frames_gen * NumChannels; Index++)
- Res[Index] = _byteswap_ushort(lrintf(FloatOut[Index]));
+ src_float_to_short_array(FloatIn, (short*)Res, Data.output_frames_gen * NumChannels);
+ }
+ else if (BytesPerSample == 4)
+ {
+ PULONG Res = (PULONG)ResultOut;
+
+ src_float_to_int_array(FloatIn, (int*)Res, Data.output_frames_gen * NumChannels);
}
+
*Result = ResultOut;
- *ResultLength = Data.output_frames_gen * (BytesPerSample/8) * NumChannels;
+ *ResultLength = Data.output_frames_gen * BytesPerSample * NumChannels;
ExFreePool(FloatIn);
ExFreePool(FloatOut);
src_delete(State);
KeRestoreFloatingPointState(&FloatSave);
-
return STATUS_SUCCESS;
}
@@ -654,7 +656,7 @@ Pin_fnFastWrite(
StreamHeader->DataUsed,
InputFormat->WaveFormatEx.nSamplesPerSec,
OutputFormat->WaveFormatEx.nSamplesPerSec,
- OutputFormat->WaveFormatEx.wBitsPerSample,
+ OutputFormat->WaveFormatEx.wBitsPerSample / 8,
OutputFormat->WaveFormatEx.nChannels,
&BufferOut,
&BufferLength);
diff --git a/reactos/drivers/wdm/audio/legacy/directory.rbuild b/reactos/drivers/wdm/audio/legacy/directory.rbuild
index 9f313d10d87..b97ec5432e3 100644
--- a/reactos/drivers/wdm/audio/legacy/directory.rbuild
+++ b/reactos/drivers/wdm/audio/legacy/directory.rbuild
@@ -4,4 +4,8 @@
+
+
+
+
diff --git a/reactos/drivers/wdm/audio/legacy/stream/control.c b/reactos/drivers/wdm/audio/legacy/stream/control.c
new file mode 100644
index 00000000000..2c9ed545b0c
--- /dev/null
+++ b/reactos/drivers/wdm/audio/legacy/stream/control.c
@@ -0,0 +1,71 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/legacy/stream/dll.c
+ * PURPOSE: kernel mode driver initialization
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
+#include "stream.h"
+
+
+NTSTATUS
+NTAPI
+StreamClassPower(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+StreamClassSystemControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+StreamClassCleanup(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+StreamClassFlushBuffers(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+StreamClassDeviceControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
diff --git a/reactos/drivers/wdm/audio/legacy/stream/dll.c b/reactos/drivers/wdm/audio/legacy/stream/dll.c
new file mode 100644
index 00000000000..05db83e82f9
--- /dev/null
+++ b/reactos/drivers/wdm/audio/legacy/stream/dll.c
@@ -0,0 +1,30 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/legacy/stream/dll.c
+ * PURPOSE: kernel mode driver initialization
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
+#include "stream.h"
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+DllInitialize(ULONG Unknown)
+{
+ return 0;
+}
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+DllUnload(VOID)
+{
+ return 0;
+}
diff --git a/reactos/drivers/wdm/audio/legacy/stream/driver.c b/reactos/drivers/wdm/audio/legacy/stream/driver.c
new file mode 100644
index 00000000000..b36f08d12ee
--- /dev/null
+++ b/reactos/drivers/wdm/audio/legacy/stream/driver.c
@@ -0,0 +1,394 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/legacy/stream/driver.c
+ * PURPOSE: WDM Codec Class Driver
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+#include "stream.h"
+
+NTSTATUS
+NTAPI
+StreamClassAddDevice(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT PhysicalDeviceObject)
+{
+ PSTREAM_CLASS_DRIVER_EXTENSION DriverObjectExtension;
+ PDEVICE_OBJECT DeviceObject, LowerDeviceObject;
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+ PKSOBJECT_CREATE_ITEM ItemList;
+ NTSTATUS Status;
+
+ /* Fetch driver object extension */
+ DriverObjectExtension = IoGetDriverObjectExtension(DriverObject, (PVOID)StreamClassAddDevice);
+ if (!DriverObjectExtension)
+ {
+ /* Failed to get driver extension */
+ return STATUS_DEVICE_DOES_NOT_EXIST;
+ }
+ /* Allocate Create Item */
+ ItemList = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
+ if (!ItemList)
+ {
+ /* Failed to allocated Create Item */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Create the FDO */
+ Status = IoCreateDevice(DriverObject, DriverObjectExtension->Data.DeviceExtensionSize + sizeof(STREAM_DEVICE_EXTENSION), NULL, FILE_DEVICE_KS, FILE_AUTOGENERATED_DEVICE_NAME | FILE_DEVICE_SECURE_OPEN, 0, &DeviceObject);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed to create the FDO */
+ ExFreePool(ItemList);
+ return Status;
+ }
+
+ /* Attach to device stack */
+ LowerDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject);
+ if (!LowerDeviceObject)
+ {
+ /* Failed to attach */
+ IoDeleteDevice(DeviceObject);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* Zero Create item */
+ RtlZeroMemory(ItemList, sizeof(KSOBJECT_CREATE_ITEM));
+ /* Setup object class */
+ RtlInitUnicodeString(&ItemList->ObjectClass, L"STREAMCLASS");
+ /* Setup CreateDispatch routine */
+ ItemList->Create = StreamClassCreateFilter;
+
+ /* Get device extension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ /* Zero device extension */
+ RtlZeroMemory(DeviceExtension, sizeof(STREAM_DEVICE_EXTENSION));
+ /* Initialize Ks streaming */
+ Status = KsAllocateDeviceHeader(&DeviceExtension->Header, 1, ItemList);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Cleanup resources */
+ IoDetachDevice(LowerDeviceObject);
+ IoDeleteDevice(DeviceObject);
+ ExFreePool(ItemList);
+ return Status;
+ }
+
+ /* Store lower device object */
+ DeviceExtension->LowerDeviceObject = LowerDeviceObject;
+
+ /* Store physical device object */
+ DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
+ /* Store driver object extension */
+ DeviceExtension->DriverExtension = DriverObjectExtension;
+ /* Initialize memory list */
+ InitializeListHead(&DeviceExtension->MemoryResourceList);
+ /* Setup device extension */
+ DeviceExtension->DeviceExtension = (PVOID) (DeviceExtension + 1);
+ /* Init interrupt dpc */
+ KeInitializeDpc(&DeviceExtension->InterruptDpc, StreamClassInterruptDpc, (PVOID)DeviceExtension);
+
+ /* Set device transfer method */
+ DeviceObject->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE;
+ /* Clear init flag */
+ DeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING;
+
+ return Status;
+}
+
+/*
+ *@implemented
+ */
+NTSTATUS
+STREAMAPI
+StreamClassRegisterAdapter(
+ IN PVOID Argument1,
+ IN PVOID Argument2,
+ IN PHW_INITIALIZATION_DATA HwInitializationData)
+{
+ NTSTATUS Status;
+ PSTREAM_CLASS_DRIVER_EXTENSION DriverObjectExtension;
+ PDRIVER_OBJECT DriverObject = (PDRIVER_OBJECT)Argument1;
+
+ /* Allocate driver extension */
+ Status = IoAllocateDriverObjectExtension(DriverObject, (PVOID)StreamClassAddDevice, sizeof(STREAM_CLASS_DRIVER_EXTENSION), (PVOID*)&DriverObjectExtension);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed to allocate */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Zero driver object extension */
+ RtlZeroMemory(DriverObjectExtension, sizeof(STREAM_CLASS_DRIVER_EXTENSION));
+
+ /* copy HwInitializationData */
+ RtlCopyMemory(&DriverObjectExtension->Data, HwInitializationData, sizeof(HW_INITIALIZATION_DATA));
+
+ /* Setup device init methods */
+ DriverObject->DriverExtension->AddDevice = StreamClassAddDevice;
+ DriverObject->DriverUnload = KsNullDriverUnload;
+
+ /* Setup irp handlers */
+ DriverObject->MajorFunction[IRP_MJ_PNP] = StreamClassPnp;
+ DriverObject->MajorFunction[IRP_MJ_POWER] = StreamClassPower;
+ DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = StreamClassSystemControl;
+ DriverObject->MajorFunction[IRP_MJ_CLEANUP] = StreamClassCleanup;
+ DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = StreamClassFlushBuffers;
+ DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = StreamClassDeviceControl;
+
+ /* Let Ks handle these */
+ KsSetMajorFunctionHandler(DriverObject, IRP_MJ_CREATE);
+ KsSetMajorFunctionHandler(DriverObject, IRP_MJ_CLOSE);
+
+ return STATUS_SUCCESS;
+}
+
+/*
+ *@implemented
+ */
+
+VOID
+NTAPI
+StreamClassReenumerateStreams(
+ IN PVOID HwDeviceExtension,
+ IN ULONG StreamDescriptorSize)
+{
+ HW_STREAM_REQUEST_BLOCK_EXT RequestBlock;
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+ PHW_STREAM_DESCRIPTOR StreamDescriptor;
+
+ if (!HwDeviceExtension || !StreamDescriptorSize)
+ return;
+
+ StreamDescriptor = ExAllocatePool(NonPagedPool, StreamDescriptorSize);
+ if (!StreamDescriptor)
+ return;
+
+ /* Zero stream descriptor */
+ RtlZeroMemory(StreamDescriptor, StreamDescriptorSize);
+
+ /* Get our DeviceExtension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION) ((ULONG_PTR)HwDeviceExtension - sizeof(STREAM_DEVICE_EXTENSION));
+ ASSERT(DeviceExtension->DeviceExtension == HwDeviceExtension);
+
+
+ /* Zero RequestBlock */
+ RtlZeroMemory(&RequestBlock, sizeof(HW_STREAM_REQUEST_BLOCK_EXT));
+
+ /* Setup get stream info struct */
+ RequestBlock.Block.SizeOfThisPacket = sizeof(HW_STREAM_REQUEST_BLOCK);
+ RequestBlock.Block.Command = SRB_GET_STREAM_INFO;
+ RequestBlock.Block.CommandData.StreamBuffer = StreamDescriptor;
+ KeInitializeEvent(&RequestBlock.Event, SynchronizationEvent, FALSE);
+
+ /* FIXME SYNCHRONIZATION */
+
+ /* Send the request */
+ DeviceExtension->DriverExtension->Data.HwReceivePacket ((PHW_STREAM_REQUEST_BLOCK)&RequestBlock);
+
+ /* Is the device already completed? */
+ if (RequestBlock.Block.Status == STATUS_PENDING)
+ {
+ /* Request is pending, wait for result */
+ KeWaitForSingleObject(&RequestBlock.Event, Executive, KernelMode, FALSE, NULL);
+ }
+
+ if (!NT_SUCCESS(RequestBlock.Block.Status))
+ {
+ /* Release Stream descriptor */
+ ExFreePool(StreamDescriptor);
+ }
+ else
+ {
+ if (DeviceExtension->StreamDescriptor)
+ {
+ /* Release old stream descriptor */
+ ExFreePool(DeviceExtension->StreamDescriptor);
+ }
+
+ /* Store stream descriptor */
+ DeviceExtension->StreamDescriptor = StreamDescriptor;
+ DeviceExtension->StreamDescriptorSize = StreamDescriptorSize;
+ }
+
+}
+
+/*
+ *@implemented
+ */
+
+VOID
+NTAPI
+StreamClassDebugAssert(
+ IN PCHAR File,
+ IN ULONG Line,
+ IN PCHAR AssertText,
+ IN ULONG AssertValue)
+{
+#ifdef DBG
+ DbgBreakPoint();
+#endif
+}
+
+/*
+ *@implemented
+ */
+VOID
+__cdecl
+StreamClassDebugPrint(
+ IN STREAM_DEBUG_LEVEL DebugPrintLevel,
+ IN PCCHAR DebugMessage,
+ ...)
+{
+#ifdef DBG
+ va_list ap;
+
+ if (DebugPrintLevel <=STREAMDEBUG_LEVEL)
+ {
+ va_start(ap, DebugMessage);
+
+ DbgPrint(DebugMessage, ap);
+
+ va_end(ap);
+ }
+#endif
+
+}
+
+/*
+ *@unimplemented
+ */
+VOID
+__cdecl
+StreamClassDeviceNotification(
+ IN STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE NotificationType,
+ IN PVOID HwDeviceExtension,
+ IN PHW_STREAM_REQUEST_BLOCK pSrb,
+ IN PKSEVENT_ENTRY EventEntry,
+ IN GUID *EventSet,
+ IN ULONG EventId)
+{
+ PHW_STREAM_REQUEST_BLOCK_EXT RequestBlock;
+ if (NotificationType == DeviceRequestComplete)
+ {
+ RequestBlock = (PHW_STREAM_REQUEST_BLOCK_EXT)pSrb;
+
+ KeSetEvent(&RequestBlock->Event, 0, FALSE);
+ return;
+ }
+
+ UNIMPLEMENTED
+}
+
+/*
+ *@implemented
+ */
+PVOID
+STREAMAPI
+StreamClassGetDmaBuffer(
+ IN PVOID HwDeviceExtension)
+{
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+
+ /* Get our DeviceExtension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION) ((ULONG_PTR)HwDeviceExtension - sizeof(STREAM_DEVICE_EXTENSION));
+ ASSERT(DeviceExtension->DeviceExtension == HwDeviceExtension);
+
+ return DeviceExtension->DmaCommonBuffer;
+}
+
+NTSTATUS
+NTAPI
+StreamClassRWCompletion(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PVOID Context)
+{
+ PIO_STATUS_BLOCK IoStatusBlock = (PIO_STATUS_BLOCK)Context;
+
+ IoStatusBlock->Information = Irp->IoStatus.Information;
+ IoStatusBlock->Status = Irp->IoStatus.Status;
+
+ return STATUS_SUCCESS;
+}
+
+/*
+ *@implemented
+ */
+BOOLEAN
+STREAMAPI
+StreamClassReadWriteConfig(
+ IN PVOID HwDeviceExtension,
+ IN BOOLEAN Read,
+ IN PVOID Buffer,
+ IN ULONG OffSet,
+ IN ULONG Length)
+{
+ PIRP Irp;
+ ULONG MajorFunction;
+ KEVENT Event;
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+ LARGE_INTEGER Offset;
+ IO_STATUS_BLOCK StatusBlock;
+ NTSTATUS Status;
+
+ /* Get our DeviceExtension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION) ((ULONG_PTR)HwDeviceExtension - sizeof(STREAM_DEVICE_EXTENSION));
+ ASSERT(DeviceExtension->DeviceExtension == HwDeviceExtension);
+
+ if (Read)
+ {
+ /* Zero input buffer */
+ RtlZeroMemory(Buffer, Length);
+ }
+
+ /* Set request type */
+ MajorFunction = (Read ? IRP_MJ_READ : IRP_MJ_WRITE);
+
+ /* Initialize event */
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+ /* Set offset */
+ Offset.QuadPart = OffSet;
+
+ /* Pre-init status block */
+ StatusBlock.Status = STATUS_NOT_SUPPORTED;
+
+ /* Create Irp */
+ Irp = IoBuildSynchronousFsdRequest(MajorFunction,
+ DeviceExtension->LowerDeviceObject, /* Verify */
+ Buffer,
+ Length,
+ &Offset,
+ &Event,
+ &StatusBlock);
+
+ if (!Irp)
+ {
+ /* Failed to allocate memory */
+ return FALSE;
+ }
+
+ /* Setup a completion routine */
+ IoSetCompletionRoutine(Irp, StreamClassRWCompletion, (PVOID)&Event, TRUE, TRUE, TRUE);
+
+ /* Call driver */
+ Status = IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
+
+ if (Status == STATUS_PENDING)
+ {
+ /* Request is pending, wait for result */
+ KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+ /* Fetch result */
+ Status = StatusBlock.Status;
+ }
+
+ if (!NT_SUCCESS(Status))
+ {
+ return FALSE;
+ }
+
+ /* FIXME Handle Length != InputLength */
+ return TRUE;
+}
diff --git a/reactos/drivers/wdm/audio/legacy/stream/filter.c b/reactos/drivers/wdm/audio/legacy/stream/filter.c
new file mode 100644
index 00000000000..fe9d0281190
--- /dev/null
+++ b/reactos/drivers/wdm/audio/legacy/stream/filter.c
@@ -0,0 +1,260 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/legacy/stream/filter.c
+ * PURPOSE: filter instance handling
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
+#include "stream.h"
+
+NTSTATUS
+NTAPI
+FilterDispatch_fnDeviceIoControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+{
+ DPRINT1("FilterDispatch Called\n");
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
+
+
+NTSTATUS
+NTAPI
+FilterDispatch_fnClose(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+ HW_STREAM_REQUEST_BLOCK_EXT RequestBlock;
+
+ /* Get device extension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ if (!DeviceExtension->DriverExtension->Data.FilterInstanceExtensionSize)
+ {
+ /* driver supports only one instance */
+ if (DeviceExtension->InstanceCount)
+ {
+ /* there is already one instance open */
+ return STATUS_UNSUCCESSFUL;
+ }
+ }
+ else
+ {
+ /* driver supports more than one filter instance */
+ RtlZeroMemory(&RequestBlock, sizeof(HW_STREAM_REQUEST_BLOCK_EXT));
+
+ /* set up request block */
+ RequestBlock.Block.Command = SRB_CLOSE_DEVICE_INSTANCE;
+ RequestBlock.Block.HwDeviceExtension = DeviceExtension->DeviceExtension;
+ RequestBlock.Block.Irp = Irp;
+ KeInitializeEvent(&RequestBlock.Event, SynchronizationEvent, FALSE);
+
+ /*FIXME SYNCHRONIZATION */
+
+ /* Send the request */
+ DeviceExtension->DriverExtension->Data.HwReceivePacket((PHW_STREAM_REQUEST_BLOCK)&RequestBlock);
+ if (RequestBlock.Block.Status == STATUS_PENDING)
+ {
+ /* Wait for the request */
+ KeWaitForSingleObject(&RequestBlock.Event, Executive, KernelMode, FALSE, NULL);
+ }
+ }
+
+ /* Increment total instance count */
+ InterlockedDecrement(&DeviceExtension->InstanceCount);
+
+ Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+}
+
+static KSDISPATCH_TABLE DispatchTable =
+{
+ FilterDispatch_fnDeviceIoControl,
+ KsDispatchInvalidDeviceRequest,
+ KsDispatchInvalidDeviceRequest,
+ KsDispatchInvalidDeviceRequest,
+ FilterDispatch_fnClose,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+VOID
+RegisterDeviceInterfaces(
+ IN PSTREAM_DEVICE_EXTENSION DeviceExtension)
+{
+ ULONG Index;
+ PHW_STREAM_INFORMATION StreamInformation;
+ UNICODE_STRING SymbolicLink;
+ NTSTATUS Status;
+
+ /* Sanity check */
+ ASSERT(DeviceExtension->StreamDescriptor);
+ ASSERT(DeviceExtension->StreamDescriptorSize);
+
+ /* Loop all stream descriptors and register device interfaces */
+ StreamInformation = (PHW_STREAM_INFORMATION)&DeviceExtension->StreamDescriptor->StreamInfo;
+
+ for(Index = 0; DeviceExtension->StreamDescriptor->StreamHeader.NumberOfStreams; Index++)
+ {
+ if (StreamInformation->Category)
+ {
+ /* Register device interface */
+ Status = IoRegisterDeviceInterface(DeviceExtension->PhysicalDeviceObject,
+ StreamInformation->Category,
+ NULL, /* see bug 4566 */
+ &SymbolicLink);
+
+ if (NT_SUCCESS(Status))
+ {
+ /* Activate device interface */
+ IoSetDeviceInterfaceState(&SymbolicLink, TRUE);
+ /* Release Symbolic Link */
+ RtlFreeUnicodeString(&SymbolicLink);
+ }
+ }
+ StreamInformation = (PHW_STREAM_INFORMATION) (ULONG_PTR)StreamInformation + DeviceExtension->StreamDescriptor->StreamHeader.SizeOfHwStreamInformation;
+ }
+
+}
+
+NTSTATUS
+InitializeFilterWithKs(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NTSTATUS Status;
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+ KSOBJECT_HEADER ObjectHeader;
+ PKSOBJECT_CREATE_ITEM CreateItem;
+ PIO_STACK_LOCATION IoStack;
+ HW_STREAM_REQUEST_BLOCK_EXT RequestBlock;
+ PVOID HwInstanceExtension = NULL;
+
+ /* Get device extension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ if (!DeviceExtension->DriverExtension->Data.FilterInstanceExtensionSize)
+ {
+ /* driver supports only one instance */
+ if (DeviceExtension->InstanceCount)
+ {
+ /* there is already one instance open */
+ return STATUS_UNSUCCESSFUL;
+ }
+ }
+ else
+ {
+ /* driver supports more than one filter instance */
+ RtlZeroMemory(&RequestBlock, sizeof(HW_STREAM_REQUEST_BLOCK_EXT));
+
+ /* allocate instance extension */
+ HwInstanceExtension = ExAllocatePool(NonPagedPool, DeviceExtension->DriverExtension->Data.FilterInstanceExtensionSize);
+ if (!HwInstanceExtension)
+ {
+ /* Not enough memory */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Zero instance extension */
+ RtlZeroMemory(HwInstanceExtension, DeviceExtension->DriverExtension->Data.FilterInstanceExtensionSize);
+
+ /* set up request block */
+ RequestBlock.Block.Command = SRB_OPEN_DEVICE_INSTANCE;
+ RequestBlock.Block.HwDeviceExtension = DeviceExtension->DeviceExtension;
+ RequestBlock.Block.Irp = Irp;
+ RequestBlock.Block.HwInstanceExtension = HwInstanceExtension;
+ KeInitializeEvent(&RequestBlock.Event, SynchronizationEvent, FALSE);
+
+ /*FIXME SYNCHRONIZATION */
+
+ /* Send the request */
+ DeviceExtension->DriverExtension->Data.HwReceivePacket((PHW_STREAM_REQUEST_BLOCK)&RequestBlock);
+ if (RequestBlock.Block.Status == STATUS_PENDING)
+ {
+ /* Wait for the request */
+ KeWaitForSingleObject(&RequestBlock.Event, Executive, KernelMode, FALSE, NULL);
+ }
+ /* Check for success */
+ if (!NT_SUCCESS(RequestBlock.Block.Status))
+ {
+ /* Resource is not available */
+ ExFreePool(HwInstanceExtension);
+ return RequestBlock.Block.Status;
+ }
+ }
+
+ /* Allocate create item */
+ CreateItem = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
+ if (!CreateItem)
+ {
+ /* not enough memory */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+ /* Zero create item */
+ RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
+ /* Set item class */
+ RtlInitUnicodeString(&CreateItem->ObjectClass, L"STREAMCLASS");
+ /* Get current irp stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ /* Create Ks streaming object header */
+ Status = KsAllocateObjectHeader(&ObjectHeader, 1, CreateItem, Irp, &DispatchTable);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed to create header */
+ ExFreePool(CreateItem);
+ if (HwInstanceExtension)
+ {
+ /* free instance buffer */
+ ExFreePool(HwInstanceExtension);
+ }
+ return Status;
+ }
+
+ /* Store instance buffer in file object context */
+ IoStack->FileObject->FsContext2 = HwInstanceExtension;
+
+ /* Increment total instance count */
+ InterlockedIncrement(&DeviceExtension->InstanceCount);
+
+ /* Register device stream interfaces */
+ RegisterDeviceInterfaces(DeviceExtension);
+
+ /* Return result */
+ return Status;
+
+}
+
+NTSTATUS
+NTAPI
+StreamClassCreateFilter(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NTSTATUS Status;
+ DPRINT1("StreamClassCreateFilter Called\n");
+
+ /* FIXME Support Pins/Clocks */
+ /* Init filter */
+ Status = InitializeFilterWithKs(DeviceObject, Irp);
+
+ Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+}
+
+
+
diff --git a/reactos/drivers/wdm/audio/legacy/stream/helper.c b/reactos/drivers/wdm/audio/legacy/stream/helper.c
new file mode 100644
index 00000000000..9353ae90b39
--- /dev/null
+++ b/reactos/drivers/wdm/audio/legacy/stream/helper.c
@@ -0,0 +1,56 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/legacy/stream/helper.c
+ * PURPOSE: irp helper routines
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
+#include "stream.h"
+
+NTSTATUS
+NTAPI
+CompletionRoutine(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PVOID Context)
+{
+ if (Irp->PendingReturned == TRUE)
+ {
+ KeSetEvent ((PKEVENT) Context, IO_NO_INCREMENT, FALSE);
+ }
+ return STATUS_MORE_PROCESSING_REQUIRED;
+}
+
+
+NTSTATUS
+NTAPI
+ForwardIrpSynchronous(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ KEVENT Event;
+ PSTREAM_DEVICE_EXTENSION DeviceExt;
+ NTSTATUS Status;
+
+ DeviceExt = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* initialize the notification event */
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+
+ IoSetCompletionRoutine(Irp, CompletionRoutine, (PVOID)&Event, TRUE, TRUE, TRUE);
+
+ /* now call the driver */
+ Status = IoCallDriver(DeviceExt->LowerDeviceObject, Irp);
+ /* did the request complete yet */
+ if (Status == STATUS_PENDING)
+ {
+ /* not yet, lets wait a bit */
+ KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+ Status = Irp->IoStatus.Status;
+ }
+ return Status;
+}
diff --git a/reactos/drivers/wdm/audio/legacy/stream/pnp.c b/reactos/drivers/wdm/audio/legacy/stream/pnp.c
new file mode 100644
index 00000000000..b21d4384d4e
--- /dev/null
+++ b/reactos/drivers/wdm/audio/legacy/stream/pnp.c
@@ -0,0 +1,465 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/legacy/stream/pnp.c
+ * PURPOSE: pnp handling
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+#include "stream.h"
+
+VOID
+CompleteIrp(
+ IN PIRP Irp,
+ IN NTSTATUS Status,
+ IN ULONG_PTR Information)
+{
+ Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Information = Information;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+}
+
+VOID
+NTAPI
+StreamClassReleaseResources(
+ IN PDEVICE_OBJECT DeviceObject)
+{
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+ PLIST_ENTRY Entry;
+ PMEMORY_RESOURCE_LIST Mem;
+
+ /* Get device extension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* Disconnect interrupt */
+ if (DeviceExtension->Interrupt)
+ {
+ IoDisconnectInterrupt(DeviceExtension->Interrupt);
+ DeviceExtension->Interrupt = NULL;
+ }
+
+ /* Release DmaAdapter */
+ if (DeviceExtension->DmaAdapter)
+ {
+ DeviceExtension->DmaAdapter->DmaOperations->PutDmaAdapter(DeviceExtension->DmaAdapter);
+ DeviceExtension->DmaAdapter = NULL;
+ }
+
+ /* Release mem mapped I/O */
+ while(!IsListEmpty(&DeviceExtension->MemoryResourceList))
+ {
+ Entry = RemoveHeadList(&DeviceExtension->MemoryResourceList);
+ Mem = (PMEMORY_RESOURCE_LIST)CONTAINING_RECORD(Entry, MEMORY_RESOURCE_LIST, Entry);
+
+ MmUnmapIoSpace(Mem->Start, Mem->Length);
+ ExFreePool(Entry);
+ }
+}
+
+BOOLEAN
+NTAPI
+StreamClassSynchronize(
+ IN PKINTERRUPT Interrupt,
+ IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
+ IN PVOID SynchronizeContext)
+{
+ /* This function is used when the driver either implements synchronization on its own
+ * or if there is no interrupt assigned
+ */
+ return SynchronizeRoutine(SynchronizeContext);
+}
+
+VOID
+NTAPI
+StreamClassInterruptDpc(
+ IN PKDPC Dpc,
+ IN PVOID DeferredContext,
+ IN PVOID SystemArgument1,
+ IN PVOID SystemArgument2)
+{
+ //TODO
+ //read/write data
+}
+
+
+BOOLEAN
+NTAPI
+StreamClassInterruptRoutine(
+ IN PKINTERRUPT Interrupt,
+ IN PVOID ServiceContext)
+{
+ BOOLEAN Ret = FALSE;
+ PSTREAM_DEVICE_EXTENSION DeviceExtension = (PSTREAM_DEVICE_EXTENSION)ServiceContext;
+
+ /* Does the driver implement HwInterrupt routine */
+ if (DeviceExtension->DriverExtension->Data.HwInterrupt)
+ {
+ /* Check if the interrupt was coming from this device */
+ Ret = DeviceExtension->DriverExtension->Data.HwInterrupt(DeviceExtension->DeviceExtension);
+ if (Ret)
+ {
+ /* Interrupt has from this device, schedule a Dpc for us */
+ KeInsertQueueDpc(&DeviceExtension->InterruptDpc, NULL, NULL);
+ }
+ }
+ /* Return result */
+ return Ret;
+}
+
+
+
+NTSTATUS
+NTAPI
+StreamClassStartDevice(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PHW_STREAM_REQUEST_BLOCK_EXT RequestBlock;
+ PPORT_CONFIGURATION_INFORMATION Config;
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+ PIO_STACK_LOCATION IoStack;
+ PCM_RESOURCE_LIST List;
+ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor;
+ PSTREAM_CLASS_DRIVER_EXTENSION DriverObjectExtension;
+ PDMA_ADAPTER Adapter;
+ DEVICE_DESCRIPTION DeviceDesc;
+ NTSTATUS Status = STATUS_SUCCESS;
+ ULONG ResultLength, Index;
+ BOOLEAN bUseDMA, bUseInterrupt;
+ ULONG MapRegisters;
+ KAFFINITY Affinity = 0;
+ PHW_STREAM_DESCRIPTOR StreamDescriptor;
+ PACCESS_RANGE Range;
+ PVOID MappedAddr;
+ PMEMORY_RESOURCE_LIST Mem;
+
+ /* Get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* Get resource list */
+ List = IoStack->Parameters.StartDevice.AllocatedResourcesTranslated;
+ /* Calculate request length */
+ ResultLength = sizeof(HW_STREAM_REQUEST_BLOCK_EXT) + sizeof(PPORT_CONFIGURATION_INFORMATION) + List->List[0].PartialResourceList.Count * sizeof(ACCESS_RANGE);
+
+ /* Allocate Request Block */
+ RequestBlock = ExAllocatePool(NonPagedPool, ResultLength);
+
+ if (!RequestBlock)
+ {
+ /* Not enough memory */
+ CompleteIrp(Irp, STATUS_INSUFFICIENT_RESOURCES, 0);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Get device extension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* Get driver object extension */
+ DriverObjectExtension = IoGetDriverObjectExtension(DeviceObject->DriverObject, (PVOID)StreamClassAddDevice);
+
+ /* Zero request block */
+ RtlZeroMemory(RequestBlock, ResultLength);
+
+ /* Locate Config struct */
+ Config = (PPORT_CONFIGURATION_INFORMATION) (RequestBlock + 1);
+ Range = (PACCESS_RANGE) (Config + 1);
+
+ /* Initialize Request */
+ RequestBlock->Block.SizeOfThisPacket = sizeof(HW_STREAM_REQUEST_BLOCK);
+ RequestBlock->Block.Command = SRB_INITIALIZE_DEVICE;
+ RequestBlock->Block.CommandData.ConfigInfo = Config;
+ KeInitializeEvent(&RequestBlock->Event, SynchronizationEvent, FALSE);
+
+ Config->SizeOfThisPacket = sizeof(PPORT_CONFIGURATION_INFORMATION);
+ Config->HwDeviceExtension = (PVOID) (DeviceExtension + 1);
+ Config->ClassDeviceObject = DeviceObject;
+ Config->PhysicalDeviceObject = DeviceExtension->LowerDeviceObject;
+ Config->RealPhysicalDeviceObject = DeviceExtension->PhysicalDeviceObject;
+ Config->AccessRanges = Range;
+
+ IoGetDeviceProperty(DeviceObject, DevicePropertyBusNumber, sizeof(ULONG), (PVOID)&Config->SystemIoBusNumber, &ResultLength);
+ IoGetDeviceProperty(DeviceObject, DevicePropertyLegacyBusType, sizeof(INTERFACE_TYPE), (PVOID)&Config->AdapterInterfaceType, &ResultLength);
+
+ /* Get resource list */
+ List = IoStack->Parameters.StartDevice.AllocatedResourcesTranslated;
+
+ /* Scan the translated resources */
+ bUseDMA = FALSE;
+ bUseInterrupt = FALSE;
+
+ Range = (PACCESS_RANGE) (Config + 1);
+
+ for(Index = 0; Index < List->List[0].PartialResourceList.Count; Index++)
+ {
+ /* Locate partial descriptor */
+ Descriptor = &List->List[0].PartialResourceList.PartialDescriptors[Index];
+
+ switch(Descriptor->Type)
+ {
+ case CmResourceTypePort:
+ {
+ /* Store resource information in AccessRange struct */
+ Range[Config->NumberOfAccessRanges].RangeLength = Descriptor->u.Port.Length;
+ Range[Config->NumberOfAccessRanges].RangeStart.QuadPart = Descriptor->u.Port.Start.QuadPart;
+ Range[Config->NumberOfAccessRanges].RangeInMemory = FALSE;
+ Config->NumberOfAccessRanges++;
+ break;
+ }
+ case CmResourceTypeInterrupt:
+ {
+ /* Store resource information */
+ Config->BusInterruptLevel = Descriptor->u.Interrupt.Level;
+ Config->BusInterruptVector = Descriptor->u.Interrupt.Vector;
+ Config->InterruptMode = Descriptor->Flags;
+ Affinity = Descriptor->u.Interrupt.Affinity;
+ bUseInterrupt = TRUE;
+ break;
+ }
+ case CmResourceTypeMemory:
+ {
+ Mem = ExAllocatePool(NonPagedPool, sizeof(MEMORY_RESOURCE_LIST));
+ MappedAddr = MmMapIoSpace(Descriptor->u.Memory.Start, Descriptor->u.Memory.Length, MmNonCached);
+ if (!MappedAddr || !Mem)
+ {
+ if (Mem)
+ {
+ /* Release Memory resource descriptor */
+ ExFreePool(Mem);
+ }
+
+ if (MappedAddr)
+ {
+ /* Release mem mapped I/O */
+ MmUnmapIoSpace(MappedAddr, Descriptor->u.Memory.Length);
+ }
+
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Complete irp */
+ CompleteIrp(Irp, STATUS_INSUFFICIENT_RESOURCES, 0);
+ ExFreePool(RequestBlock);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+ /* Store range for driver */
+ Range[Config->NumberOfAccessRanges].RangeLength = Descriptor->u.Memory.Length;
+ Range[Config->NumberOfAccessRanges].RangeStart.QuadPart = Descriptor->u.Memory.Start.QuadPart;
+ Range[Config->NumberOfAccessRanges].RangeInMemory = TRUE;
+ Config->NumberOfAccessRanges++;
+ /* Initialize Memory resource descriptor */
+ Mem->Length = Descriptor->u.Memory.Length;
+ Mem->Start = MappedAddr;
+ InsertTailList(&DeviceExtension->MemoryResourceList, &Mem->Entry);
+ break;
+ }
+ case CmResourceTypeDma:
+ {
+ bUseDMA = TRUE;
+ Config->DmaChannel = Descriptor->u.Dma.Channel;
+ break;
+ }
+ }
+ }
+
+ if (!!bUseInterrupt || DriverObjectExtension->Data.HwInterrupt == NULL || Config->BusInterruptLevel == 0 || Config->BusInterruptVector == 0)
+ {
+ /* requirements not satisfied */
+ DeviceExtension->SynchronizeFunction = StreamClassSynchronize;
+ }
+ else
+ {
+ /* use real sync routine */
+ DeviceExtension->SynchronizeFunction = KeSynchronizeExecution;
+
+ /* connect interrupt */
+ Status = IoConnectInterrupt(&DeviceExtension->Interrupt,
+ StreamClassInterruptRoutine,
+ (PVOID)DeviceExtension,
+ NULL,
+ Config->BusInterruptVector,
+ Config->BusInterruptLevel,
+ Config->BusInterruptLevel,
+ Config->InterruptMode,
+ TRUE,
+ Affinity,
+ FALSE);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Failed to connect interrupt */
+ CompleteIrp(Irp, Status, 0);
+ /* Release request block */
+ ExFreePool(RequestBlock);
+ return Status;
+ }
+
+ /* store interrupt object */
+ Config->InterruptObject = DeviceExtension->Interrupt;
+ }
+
+ /* does the device use DMA */
+ if (bUseDMA && DriverObjectExtension->Data.BusMasterDMA)
+ {
+ /* Zero device description */
+ RtlZeroMemory(&DeviceDesc, sizeof(DEVICE_DESCRIPTION));
+
+ DeviceDesc.Version = DEVICE_DESCRIPTION_VERSION;
+ DeviceDesc.Master = TRUE;
+ DeviceDesc.ScatterGather = TRUE;
+ DeviceDesc.AutoInitialize = FALSE;
+ DeviceDesc.DmaChannel = Config->DmaChannel;
+ DeviceDesc.InterfaceType = Config->AdapterInterfaceType;
+ DeviceDesc.DmaWidth = Width32Bits;
+ DeviceDesc.DmaSpeed = Compatible;
+ DeviceDesc.MaximumLength = (ULONG)-1;
+ DeviceDesc.Dma32BitAddresses = DriverObjectExtension->Data.Dma24BitAddresses;
+
+ Adapter = IoGetDmaAdapter(DeviceExtension->PhysicalDeviceObject, &DeviceDesc, &MapRegisters);
+ if (!Adapter)
+ {
+ /* Failed to claim DMA Adapter */
+ CompleteIrp(Irp, Status, 0);
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Release request block */
+ ExFreePool(RequestBlock);
+ return Status;
+ }
+
+ if (DeviceExtension->DriverExtension->Data.DmaBufferSize)
+ {
+ DeviceExtension->DmaCommonBuffer = Adapter->DmaOperations->AllocateCommonBuffer(Adapter, DeviceExtension->DriverExtension->Data.DmaBufferSize, &DeviceExtension->DmaPhysicalAddress, FALSE);
+ if (!DeviceExtension->DmaCommonBuffer)
+ {
+ /* Failed to allocate a common buffer */
+ CompleteIrp(Irp, Status, 0);
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Release request block */
+ ExFreePool(RequestBlock);
+ return Status;
+ }
+ }
+
+
+ DeviceExtension->MapRegisters = MapRegisters;
+ DeviceExtension->DmaAdapter = Adapter;
+ Config->DmaAdapterObject = (PADAPTER_OBJECT)Adapter;
+ }
+
+
+ /* First forward the request to lower attached device object */
+ Status = ForwardIrpSynchronous(DeviceObject, Irp);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed to start lower devices */
+ CompleteIrp(Irp, Status, 0);
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Release request block */
+ ExFreePool(RequestBlock);
+ return Status;
+ }
+
+ Config->Irp = Irp;
+
+ /* FIXME SYNCHRONIZATION */
+
+ /* Send the request */
+ DriverObjectExtension->Data.HwReceivePacket((PHW_STREAM_REQUEST_BLOCK)RequestBlock);
+ if (RequestBlock->Block.Status == STATUS_PENDING)
+ {
+ /* Request is pending, wait for result */
+ KeWaitForSingleObject(&RequestBlock->Event, Executive, KernelMode, FALSE, NULL);
+ /* Get final status code */
+ Status = RequestBlock->Block.Status;
+ }
+
+ /* Copy stream descriptor size */
+ DeviceExtension->StreamDescriptorSize = Config->StreamDescriptorSize;
+
+ /* check if the request has succeeded or if stream size is valid*/
+ if (!NT_SUCCESS(Status)|| !Config->StreamDescriptorSize)
+ {
+ /* Failed to start device */
+ CompleteIrp(Irp, Status, 0);
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Release request block */
+ ExFreePool(RequestBlock);
+ return Status;
+ }
+
+ /* Allocate a stream Descriptor */
+ StreamDescriptor = ExAllocatePool(NonPagedPool, DeviceExtension->StreamDescriptorSize);
+ if (!StreamDescriptor)
+ {
+ /* Not enough memory */
+ CompleteIrp(Irp, STATUS_INSUFFICIENT_RESOURCES, 0);
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Release request block */
+ ExFreePool(RequestBlock);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Zero stream descriptor */
+ RtlZeroMemory(StreamDescriptor, DeviceExtension->StreamDescriptorSize);
+
+ /* Setup get stream info struct */
+ RequestBlock->Block.Command = SRB_GET_STREAM_INFO;
+ RequestBlock->Block.CommandData.StreamBuffer = StreamDescriptor;
+ KeResetEvent(&RequestBlock->Event);
+
+ /* send the request */
+ DriverObjectExtension->Data.HwReceivePacket((PHW_STREAM_REQUEST_BLOCK)RequestBlock);
+ if (RequestBlock->Block.Status == STATUS_PENDING)
+ {
+ /* Request is pending, wait for result */
+ KeWaitForSingleObject(&RequestBlock->Event, Executive, KernelMode, FALSE, NULL);
+ /* Get final status code */
+ Status = RequestBlock->Block.Status;
+ }
+
+ if (NT_SUCCESS(Status))
+ {
+ /* store stream descriptor */
+ DeviceExtension->StreamDescriptor = StreamDescriptor;
+ }
+ else
+ {
+ /* cleanup resources */
+ ExFreePool(StreamDescriptor);
+ }
+
+ ExFreePool(RequestBlock);
+ /* Complete Irp */
+ CompleteIrp(Irp, Status, 0);
+ /* Return result */
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+StreamClassPnp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+
+ /* Get current irp stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ switch (IoStack->MinorFunction)
+ {
+ case IRP_MN_START_DEVICE:
+ {
+ return StreamClassStartDevice(DeviceObject, Irp);
+ }
+ }
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_NOT_SUPPORTED;
+}
+
+
diff --git a/reactos/drivers/wdm/audio/legacy/stream/stream.h b/reactos/drivers/wdm/audio/legacy/stream/stream.h
new file mode 100644
index 00000000000..742eaf02d52
--- /dev/null
+++ b/reactos/drivers/wdm/audio/legacy/stream/stream.h
@@ -0,0 +1,140 @@
+#ifndef STREAM_H__
+#define STREAM_H__
+
+#include
+#define YDEBUG
+#include
+
+#define STREAMDEBUG_LEVEL DebugLevelMaximum
+
+typedef BOOLEAN (NTAPI *SYNCHRONIZE_FUNC) (IN PKINTERRUPT Interrupt, IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, IN PVOID SynchronizeContext);
+
+typedef struct
+{
+ HW_INITIALIZATION_DATA Data;
+
+}STREAM_CLASS_DRIVER_EXTENSION, *PSTREAM_CLASS_DRIVER_EXTENSION;
+
+typedef struct
+{
+ LIST_ENTRY Entry;
+ PVOID Start;
+ ULONG Length;
+}MEMORY_RESOURCE_LIST, *PMEMORY_RESOURCE_LIST;
+
+typedef struct
+{
+ KSDEVICE_HEADER Header;
+ PDEVICE_OBJECT LowerDeviceObject;
+ PDEVICE_OBJECT PhysicalDeviceObject;
+
+ SYNCHRONIZE_FUNC SynchronizeFunction;
+
+ ULONG MapRegisters;
+ PDMA_ADAPTER DmaAdapter;
+ PVOID DmaCommonBuffer;
+ PHYSICAL_ADDRESS DmaPhysicalAddress;
+
+ PKINTERRUPT Interrupt;
+ KDPC InterruptDpc;
+
+ LIST_ENTRY MemoryResourceList;
+
+ ULONG StreamDescriptorSize;
+ PHW_STREAM_DESCRIPTOR StreamDescriptor;
+ PSTREAM_CLASS_DRIVER_EXTENSION DriverExtension;
+
+ PVOID DeviceExtension;
+ LONG InstanceCount;
+
+}STREAM_DEVICE_EXTENSION, *PSTREAM_DEVICE_EXTENSION;
+
+typedef struct
+{
+ HW_STREAM_REQUEST_BLOCK Block;
+ KEVENT Event;
+}HW_STREAM_REQUEST_BLOCK_EXT, *PHW_STREAM_REQUEST_BLOCK_EXT;
+
+NTSTATUS
+NTAPI
+StreamClassCreateFilter(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassPnp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassPower(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassSystemControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassCleanup(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassFlushBuffers(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassDeviceControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassAddDevice(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT PhysicalDeviceObject);
+
+
+NTSTATUS
+NTAPI
+ForwardIrpSynchronous(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+BOOLEAN
+NTAPI
+StreamClassSynchronize(
+ IN PKINTERRUPT Interrupt,
+ IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
+ IN PVOID SynchronizeContext);
+
+BOOLEAN
+NTAPI
+StreamClassInterruptRoutine(
+ IN PKINTERRUPT Interrupt,
+ IN PVOID ServiceContext);
+
+VOID
+NTAPI
+StreamClassInterruptDpc(
+ IN PKDPC Dpc,
+ IN PVOID DeferredContext,
+ IN PVOID SystemArgument1,
+ IN PVOID SystemArgument2);
+
+VOID
+CompleteIrp(
+ IN PIRP Irp,
+ IN NTSTATUS Status,
+ IN ULONG_PTR Information);
+
+#endif
diff --git a/reactos/drivers/wdm/audio/legacy/stream/stream.rbuild b/reactos/drivers/wdm/audio/legacy/stream/stream.rbuild
new file mode 100644
index 00000000000..e4f632b9469
--- /dev/null
+++ b/reactos/drivers/wdm/audio/legacy/stream/stream.rbuild
@@ -0,0 +1,17 @@
+
+
+
+ .
+
+
+ ntoskrnl
+ ks
+ pseh
+ control.c
+ driver.c
+ dll.c
+ filter.c
+ helper.c
+ pnp.c
+ stream.rc
+
diff --git a/reactos/drivers/wdm/audio/legacy/stream/stream.rc b/reactos/drivers/wdm/audio/legacy/stream/stream.rc
new file mode 100644
index 00000000000..eaf82bbfb22
--- /dev/null
+++ b/reactos/drivers/wdm/audio/legacy/stream/stream.rc
@@ -0,0 +1,5 @@
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION "WDM CODEC Class Device Driver 2.0\0"
+#define REACTOS_STR_INTERNAL_NAME "stream.sys\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "stream.sys\0"
+#include
diff --git a/reactos/drivers/wdm/audio/legacy/stream/stream.spec b/reactos/drivers/wdm/audio/legacy/stream/stream.spec
new file mode 100644
index 00000000000..85cb8dc4b6a
--- /dev/null
+++ b/reactos/drivers/wdm/audio/legacy/stream/stream.spec
@@ -0,0 +1,9 @@
+@ stdcall DllInitialize(long)
+@ stdcall DllUnload()
+@ stdcall StreamClassRegisterAdapter(ptr ptr ptr)
+@ stdcall StreamClassReenumerateStreams(ptr long)
+@ stdcall StreamClassDebugAssert(long long ptr long)
+@ cdecl StreamClassDebugPrint (long str)
+@ cdecl StreamClassDeviceNotification(long ptr)
+@ stdcall StreamClassGetDmaBuffer(ptr)
+@ stdcall StreamClassReadWriteConfig(ptr long ptr long long)
\ No newline at end of file
diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c b/reactos/drivers/wdm/audio/legacy/wdmaud/control.c
index 53a46403cb7..2f13fb7c9ec 100644
--- a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c
+++ b/reactos/drivers/wdm/audio/legacy/wdmaud/control.c
@@ -146,6 +146,7 @@ WdmAudControlOpen(
KSDATAFORMAT_WAVEFORMATEX * DataFormat;
ULONG FilterId;
ULONG PinId;
+ ULONG FreeIndex;
if (DeviceInfo->DeviceType == MIXER_DEVICE_TYPE)
{
@@ -158,6 +159,12 @@ WdmAudControlOpen(
return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
}
+ if (DeviceInfo->u.WaveFormatEx.wFormatTag != WAVE_FORMAT_PCM)
+ {
+ DPRINT("FIXME: Only WAVE_FORMAT_PCM is supported RequestFormat %x\n", DeviceInfo->u.WaveFormatEx.wFormatTag);
+ return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
+ }
+
Status = GetFilterIdAndPinId(DeviceObject, DeviceInfo, ClientInfo, &FilterId, &PinId);
if (!NT_SUCCESS(Status))
{
@@ -166,12 +173,14 @@ WdmAudControlOpen(
}
/* close pin handle which uses same virtual audio device id and pin id */
+ FreeIndex = (ULONG)-1;
for(Index = 0; Index < ClientInfo->NumPins; Index++)
{
- if (ClientInfo->hPins[Index].FilterId == FilterId && ClientInfo->hPins[Index].PinId == PinId && ClientInfo->hPins[Index].Handle)
+ if (ClientInfo->hPins[Index].FilterId == FilterId && ClientInfo->hPins[Index].PinId == PinId && ClientInfo->hPins[Index].Handle && ClientInfo->hPins[Index].Type == DeviceInfo->DeviceType)
{
ZwClose(ClientInfo->hPins[Index].Handle);
ClientInfo->hPins[Index].Handle = NULL;
+ FreeIndex = Index;
}
}
@@ -191,17 +200,6 @@ WdmAudControlOpen(
InstanceInfo->DeviceNumber = FilterId;
DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)InstanceInfo, sizeof(SYSAUDIO_INSTANCE_INFO), NULL, 0, &BytesReturned);
-
- if (!NT_SUCCESS(Status))
- {
- /* failed to acquire audio device */
- DPRINT1("KsSynchronousIoControlDevice failed with %x\n", Status);
- ExFreePool(InstanceInfo);
- return SetIrpIoStatus(Irp, Status, 0);
- }
-
if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE ||
DeviceInfo->DeviceType == MIDI_IN_DEVICE_TYPE ||
DeviceInfo->DeviceType == MIXER_DEVICE_TYPE)
@@ -245,9 +243,6 @@ WdmAudControlOpen(
DataFormat->DataFormat.Reserved = 0;
DataFormat->DataFormat.MajorFormat = KSDATAFORMAT_TYPE_AUDIO;
- if (DeviceInfo->u.WaveFormatEx.wFormatTag != WAVE_FORMAT_PCM)
- DPRINT1("FIXME\n");
-
DataFormat->DataFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
DataFormat->DataFormat.Specifier = KSDATAFORMAT_SPECIFIER_WAVEFORMATEX;
DataFormat->DataFormat.SampleSize = 4;
@@ -259,15 +254,16 @@ WdmAudControlOpen(
{
PWDMAUD_HANDLE Handels;
- for(Index = 0; Index < ClientInfo->NumPins; Index++)
+ if (FreeIndex != (ULONG)-1)
{
- if (ClientInfo->hPins[Index].Handle == PinHandle)
- {
- /* the pin handle has been re-used */
- DeviceInfo->hDevice = PinHandle;
- return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO));
- }
+ /* re-use a free index */
+ ClientInfo->hPins[Index].Handle = PinHandle;
+ ClientInfo->hPins[Index].FilterId = FilterId;
+ ClientInfo->hPins[Index].PinId = PinId;
+ ClientInfo->hPins[Index].Type = DeviceInfo->DeviceType;
+ DeviceInfo->hDevice = PinHandle;
+ return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO));
}
Handels = ExAllocatePool(NonPagedPool, sizeof(WDMAUD_HANDLE) * (ClientInfo->NumPins+1));
@@ -382,14 +378,11 @@ WdmAudControlDeviceType(
}
}
-
- if (NT_SUCCESS(Status))
- DeviceInfo->DeviceCount = Result;
- else
- DeviceInfo->DeviceCount = 0;
+ /* store result count */
+ DeviceInfo->DeviceCount = Result;
DPRINT1("WdmAudControlDeviceType Status %x Devices %u\n", Status, DeviceInfo->DeviceCount);
- return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO));
+ return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
}
NTSTATUS
@@ -418,7 +411,7 @@ WdmAudControlDeviceState(
Property.Id = KSPROPERTY_CONNECTION_STATE;
Property.Flags = KSPROPERTY_TYPE_SET;
- State = DeviceInfo->State;
+ State = DeviceInfo->u.State;
Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&State, sizeof(KSSTATE), &BytesReturned);
@@ -602,6 +595,49 @@ WdmAudIoctlClose(
return STATUS_INVALID_PARAMETER;
}
+NTSTATUS
+NTAPI
+WdmAudFrameSize(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PWDMAUD_DEVICE_INFO DeviceInfo,
+ IN PWDMAUD_CLIENT ClientInfo)
+{
+ PFILE_OBJECT FileObject;
+ KSPROPERTY Property;
+ ULONG BytesReturned;
+ KSALLOCATOR_FRAMING Framing;
+ NTSTATUS Status;
+
+ /* Get sysaudio pin file object */
+ Status = ObReferenceObjectByHandle(DeviceInfo->hDevice, GENERIC_WRITE, IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Invalid buffer handle %x\n", DeviceInfo->hDevice);
+ return SetIrpIoStatus(Irp, Status, 0);
+ }
+
+ /* Setup get framing request */
+ Property.Id = KSPROPERTY_CONNECTION_ALLOCATORFRAMING;
+ Property.Flags = KSPROPERTY_TYPE_GET;
+ Property.Set = KSPROPSETID_Connection;
+
+ Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&Framing, sizeof(KSALLOCATOR_FRAMING), &BytesReturned);
+ /* Did we succeed */
+ if (NT_SUCCESS(Status))
+ {
+ /* Store framesize */
+ DeviceInfo->u.FrameSize = Framing.FrameSize;
+ }
+
+ /* Release file object */
+ ObDereferenceObject(FileObject);
+
+ return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO));
+
+}
+
+
NTSTATUS
NTAPI
WdmAudDeviceControl(
@@ -654,6 +690,9 @@ WdmAudDeviceControl(
return WdmAudCapabilities(DeviceObject, Irp, DeviceInfo, ClientInfo);
case IOCTL_CLOSE_WDMAUD:
return WdmAudIoctlClose(DeviceObject, Irp, DeviceInfo, ClientInfo);
+ case IOCTL_GETFRAMESIZE:
+ return WdmAudFrameSize(DeviceObject, Irp, DeviceInfo, ClientInfo);
+ case IOCTL_GETPOS:
case IOCTL_GETDEVID:
case IOCTL_GETVOLUME:
case IOCTL_SETVOLUME:
@@ -798,4 +837,3 @@ WdmAudWrite(
ObDereferenceObject(FileObject);
return IoStatusBlock.Status;
}
-
diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h b/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h
index af0c9d91d2b..50c91272586 100644
--- a/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h
+++ b/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h
@@ -30,8 +30,6 @@ typedef struct
HANDLE hDevice;
ULONG DeviceCount;
- KSSTATE State;
- ULONG Volume;
ULONG BufferSize;
PUCHAR Buffer;
@@ -41,7 +39,11 @@ typedef struct
WAVEFORMATEX WaveFormatEx;
WAVEOUTCAPSW WaveOutCaps;
AUXCAPSW AuxCaps;
- WAVEINCAPSW WaveInCaps;
+ WAVEINCAPSW WaveInCaps;
+ ULONGLONG Position;
+ KSSTATE State;
+ ULONG Volume;
+ ULONG FrameSize;
}u;
}WDMAUD_DEVICE_INFO, *PWDMAUD_DEVICE_INFO;
@@ -204,5 +206,39 @@ typedef struct
METHOD_BUFFERED, \
FILE_CREATE_TREE_CONNECTION | FILE_ANY_ACCESS)
+/// IOCTL_GETPOS
+///
+/// Description: This IOCTL retrieves the current playback / write position
+///
+/// Arguments: InputBuffer is a pointer to a WDMAUD_DEVICE_INFO structure,
+/// InputBufferSize is size of WDMAUD_DEVICE_INFO structure
+/// Note: The DeviceType and hDevice must be set
+/// Result: The result is returned in Position
+/// ReturnCode: STATUS_SUCCESS indicates success
+/// Prequsites: opened device
+
+#define IOCTL_GETPOS \
+ CTL_CODE(FILE_DEVICE_SOUND, \
+ 9, \
+ METHOD_BUFFERED, \
+ FILE_CREATE_TREE_CONNECTION | FILE_ANY_ACCESS)
+
+/// IOCTL_GETFRAMESIZE
+///
+/// Description: This IOCTL retrieves the frame size requirements for an audio pin
+///
+/// Arguments: InputBuffer is a pointer to a WDMAUD_DEVICE_INFO structure,
+/// InputBufferSize is size of WDMAUD_DEVICE_INFO structure
+/// Note: The DeviceType and hDevice must be set
+/// Result: The result is returned in FrameSize
+/// ReturnCode: STATUS_SUCCESS indicates success
+/// Prequsites: opened device
+
+#define IOCTL_GETFRAMESIZE \
+ CTL_CODE(FILE_DEVICE_SOUND, \
+ 10, \
+ METHOD_BUFFERED, \
+ FILE_CREATE_TREE_CONNECTION | FILE_ANY_ACCESS)
+
#endif
diff --git a/reactos/drivers/wdm/audio/sysaudio/control.c b/reactos/drivers/wdm/audio/sysaudio/control.c
index 6a483b49ea9..e3966d5b85c 100644
--- a/reactos/drivers/wdm/audio/sysaudio/control.c
+++ b/reactos/drivers/wdm/audio/sysaudio/control.c
@@ -20,95 +20,13 @@ const GUID KSDATAFORMAT_SPECIFIER_WAVEFORMATEX = {0x05589f81L, 0xc356, 0x11ce,
NTSTATUS
ComputeCompatibleFormat(
- IN PKSAUDIO_SUBDEVICE_ENTRY Entry,
+ IN PKSAUDIO_DEVICE_ENTRY Entry,
IN ULONG PinId,
IN PSYSAUDIODEVEXT DeviceExtension,
IN PKSDATAFORMAT_WAVEFORMATEX ClientFormat,
OUT PKSDATAFORMAT_WAVEFORMATEX MixerFormat);
-NTSTATUS
-NTAPI
-KspCreateObjectType(
- IN HANDLE ParentHandle,
- IN LPWSTR ObjectType,
- PVOID CreateParameters,
- UINT CreateParametersSize,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE NodeHandle)
-{
- NTSTATUS Status;
- IO_STATUS_BLOCK IoStatusBlock;
- OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING Name;
-
- Name.Length = (wcslen(ObjectType) + 1) * sizeof(WCHAR) + CreateParametersSize;
- Name.MaximumLength += sizeof(WCHAR);
- Name.Buffer = ExAllocatePool(NonPagedPool, Name.MaximumLength);
-
- if (!Name.Buffer)
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- wcscpy(Name.Buffer, ObjectType);
- Name.Buffer[wcslen(ObjectType)] = '\\';
-
- RtlMoveMemory(Name.Buffer + wcslen(ObjectType) +1, CreateParameters, CreateParametersSize);
-
- Name.Buffer[Name.Length / 2] = L'\0';
- InitializeObjectAttributes(&ObjectAttributes, &Name, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE | OBJ_OPENIF, ParentHandle, NULL);
-
-
- Status = IoCreateFile(NodeHandle,
- DesiredAccess,
- &ObjectAttributes,
- &IoStatusBlock,
- NULL,
- 0,
- 0,
- FILE_OPEN,
- FILE_SYNCHRONOUS_IO_NONALERT,
- NULL,
- 0,
- CreateFileTypeNone,
- NULL,
- IO_NO_PARAMETER_CHECKING | IO_FORCE_ACCESS_CHECK);
-
- return Status;
-}
-
-KSDDKAPI
-NTSTATUS
-NTAPI
-KsoCreatePin(
- IN HANDLE FilterHandle,
- IN PKSPIN_CONNECT Connect,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE ConnectionHandle,
- IN LPWSTR ObjectClass)
-{
- WCHAR szBuffer[100];
- UINT ConnectSize = sizeof(KSPIN_CONNECT);
-
- PKSDATAFORMAT_WAVEFORMATEX Format = (PKSDATAFORMAT_WAVEFORMATEX)(Connect + 1);
- if (Format->DataFormat.FormatSize == sizeof(KSDATAFORMAT) ||
- Format->DataFormat.FormatSize == sizeof(KSDATAFORMAT) + sizeof(WAVEFORMATEX))
- {
- ConnectSize += Format->DataFormat.FormatSize;
- }
-
- swprintf(szBuffer, L"%s\\{146F1A80-4791-11D0-A5D6-28DB04C10000}", ObjectClass);
-
- return KspCreateObjectType(FilterHandle,
- szBuffer,
- (PVOID)Connect,
- ConnectSize,
- DesiredAccess,
- ConnectionHandle);
-}
-
-
NTSTATUS
SetIrpIoStatus(
IN PIRP Irp,
@@ -129,38 +47,20 @@ SetIrpIoStatus(
}
-PKSAUDIO_SUBDEVICE_ENTRY
+PKSAUDIO_DEVICE_ENTRY
GetListEntry(
IN PLIST_ENTRY Head,
IN ULONG Index)
{
- PKSAUDIO_DEVICE_ENTRY DeviceEntry;
- PKSAUDIO_SUBDEVICE_ENTRY SubDeviceEntry;
- PLIST_ENTRY SubEntry, Entry = Head->Flink;
-
- while(Entry != Head)
- {
- DeviceEntry = (PKSAUDIO_DEVICE_ENTRY)CONTAINING_RECORD(Entry, KSAUDIO_DEVICE_ENTRY, Entry);
- if (Index < DeviceEntry->NumSubDevices)
- {
- SubEntry = DeviceEntry->SubDeviceList.Flink;
- while(SubEntry != &DeviceEntry->SubDeviceList && Index--)
- SubEntry = SubEntry->Flink;
-
- SubDeviceEntry = (PKSAUDIO_SUBDEVICE_ENTRY)CONTAINING_RECORD(SubEntry, KSAUDIO_SUBDEVICE_ENTRY, Entry);
- return SubDeviceEntry;
- }
- else
- {
- Index -= DeviceEntry->NumSubDevices;
- }
+ PLIST_ENTRY Entry = Head->Flink;
+ while(Index-- && Entry != Head)
Entry = Entry->Flink;
- }
- DPRINT1("Not Found index %u\n", Index);
+ if (Entry == Head)
+ return NULL;
- return NULL;
+ return (PKSAUDIO_DEVICE_ENTRY)CONTAINING_RECORD(Entry, KSAUDIO_DEVICE_ENTRY, Entry);
}
NTSTATUS
@@ -169,7 +69,7 @@ SysAudioOpenVirtualDevice(
IN ULONG DeviceNumber,
PSYSAUDIODEVEXT DeviceExtension)
{
- PKSAUDIO_SUBDEVICE_ENTRY Entry;
+ PKSAUDIO_DEVICE_ENTRY Entry;
PKSOBJECT_CREATE_ITEM CreateItem;
/* access the create item */
@@ -241,7 +141,7 @@ CreateMixerPinAndSetFormat(
HANDLE PinHandle;
PFILE_OBJECT FileObject;
- Status = KsoCreatePin(KMixerHandle, PinConnect, GENERIC_READ | GENERIC_WRITE, &PinHandle, L"KMixer");
+ Status = KsCreatePin(KMixerHandle, PinConnect, GENERIC_READ | GENERIC_WRITE, &PinHandle);
if (!NT_SUCCESS(Status))
{
@@ -303,7 +203,7 @@ CreatePinWorkerRoutine(
/* Let's try to create the audio irp pin */
- Status = KsoCreatePin(WorkerContext->Entry->Handle, WorkerContext->PinConnect, GENERIC_READ | GENERIC_WRITE, &RealPinHandle, WorkerContext->Entry->ObjectClass);
+ Status = KsCreatePin(WorkerContext->Entry->Handle, WorkerContext->PinConnect, GENERIC_READ | GENERIC_WRITE, &RealPinHandle);
if (!NT_SUCCESS(Status))
{
@@ -321,13 +221,16 @@ CreatePinWorkerRoutine(
return;
}
+ /* Zero pin connect */
+ RtlZeroMemory(MixerPinConnect, sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT_WAVEFORMATEX));
+
/* Copy initial connect details */
RtlMoveMemory(MixerPinConnect, WorkerContext->PinConnect, sizeof(KSPIN_CONNECT));
OutputFormat = (PKSDATAFORMAT_WAVEFORMATEX)(MixerPinConnect + 1);
- Status = ComputeCompatibleFormat(WorkerContext->Entry, WorkerContext->PinConnect->PinId, WorkerContext->DeviceExtension, (PKSDATAFORMAT_WAVEFORMATEX)(WorkerContext->PinConnect + 1), OutputFormat);
+ Status = ComputeCompatibleFormat(WorkerContext->Entry, WorkerContext->PinConnect->PinId, WorkerContext->DeviceExtension, InputFormat, OutputFormat);
if (!NT_SUCCESS(Status))
{
DPRINT1("ComputeCompatibleFormat failed with %x\n", Status);
@@ -340,7 +243,7 @@ CreatePinWorkerRoutine(
}
/* Retry with Mixer format */
- Status = KsoCreatePin(WorkerContext->Entry->Handle, MixerPinConnect, GENERIC_READ | GENERIC_WRITE, &RealPinHandle, WorkerContext->Entry->ObjectClass);
+ Status = KsCreatePin(WorkerContext->Entry->Handle, MixerPinConnect, GENERIC_READ | GENERIC_WRITE, &RealPinHandle); //, WorkerContext->Entry->ObjectClass);
if (!NT_SUCCESS(Status))
{
/* This should not fail */
@@ -385,7 +288,7 @@ CreatePinWorkerRoutine(
DPRINT1("creating virtual pin\n");
/* now create the virtual audio pin which is exposed to wdmaud */
- Status = KsoCreatePin(Filter, WorkerContext->PinConnect, GENERIC_READ | GENERIC_WRITE, &VirtualPinHandle, L"SysAudio");
+ Status = KsCreatePin(Filter, WorkerContext->PinConnect, GENERIC_READ | GENERIC_WRITE, &VirtualPinHandle); //, L"SysAudio");
if (!NT_SUCCESS(Status))
{
@@ -449,7 +352,7 @@ HandleSysAudioFilterPinProperties(
{
PIO_STACK_LOCATION IoStack;
NTSTATUS Status;
- PKSAUDIO_SUBDEVICE_ENTRY Entry;
+ PKSAUDIO_DEVICE_ENTRY Entry;
ULONG BytesReturned;
PKSP_PIN Pin;
@@ -536,7 +439,7 @@ HandleSysAudioFilterPinProperties(
NTSTATUS
ComputeCompatibleFormat(
- IN PKSAUDIO_SUBDEVICE_ENTRY Entry,
+ IN PKSAUDIO_DEVICE_ENTRY Entry,
IN ULONG PinId,
IN PSYSAUDIODEVEXT DeviceExtension,
IN PKSDATAFORMAT_WAVEFORMATEX ClientFormat,
@@ -612,6 +515,7 @@ ComputeCompatibleFormat(
{
UNIMPLEMENTED
AudioRange = (PKSDATARANGE_AUDIO)((PUCHAR)AudioRange + AudioRange->DataRange.FormatSize);
+ continue;
}
/* Select best quality available */
@@ -670,7 +574,7 @@ ComputeCompatibleFormat(
NTSTATUS
GetPinInstanceCount(
- PKSAUDIO_SUBDEVICE_ENTRY Entry,
+ PKSAUDIO_DEVICE_ENTRY Entry,
PKSPIN_CINSTANCES PinInstances,
PKSPIN_CONNECT PinConnect)
{
@@ -695,7 +599,7 @@ HandleSysAudioFilterPinCreation(
PDEVICE_OBJECT DeviceObject)
{
ULONG Length;
- PKSAUDIO_SUBDEVICE_ENTRY Entry;
+ PKSAUDIO_DEVICE_ENTRY Entry;
KSPIN_CONNECT * PinConnect;
PIO_STACK_LOCATION IoStack;
PSYSAUDIO_INSTANCE_INFO InstanceInfo;
@@ -842,7 +746,7 @@ SysAudioHandleProperty(
PULONG Index;
PKSPROPERTY Property;
PSYSAUDIODEVEXT DeviceExtension;
- PKSAUDIO_SUBDEVICE_ENTRY Entry;
+ PKSAUDIO_DEVICE_ENTRY Entry;
PSYSAUDIO_INSTANCE_INFO InstanceInfo;
ULONG BytesReturned;
PKSOBJECT_CREATE_ITEM CreateItem;
diff --git a/reactos/drivers/wdm/audio/sysaudio/deviface.c b/reactos/drivers/wdm/audio/sysaudio/deviface.c
index d76cb5f3e81..d9a85676221 100644
--- a/reactos/drivers/wdm/audio/sysaudio/deviface.c
+++ b/reactos/drivers/wdm/audio/sysaudio/deviface.c
@@ -18,7 +18,7 @@ const GUID DMOCATEGORY_ACOUSTIC_ECHO_CANCEL = {0xBF963D80L, 0xC559, 0x11D0, {
VOID
QueryFilterRoutine(
- IN PKSAUDIO_SUBDEVICE_ENTRY DeviceEntry)
+ IN PKSAUDIO_DEVICE_ENTRY DeviceEntry)
{
KSPROPERTY PropertyRequest;
KSP_PIN PinRequest;
@@ -32,15 +32,6 @@ QueryFilterRoutine(
DPRINT("Querying filter...\n");
- Status = KsSynchronousIoControlDevice(DeviceEntry->FileObject, KernelMode, IOCTL_KS_OBJECT_CLASS, NULL, 0, &DeviceEntry->ObjectClass, sizeof(LPWSTR), &BytesReturned);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Failed to query object class Status %x\n", Status);
- return;
- }
-
- DPRINT("ObjectClass %S\n", DeviceEntry->ObjectClass);
-
PropertyRequest.Set = KSPROPSETID_Pin;
PropertyRequest.Flags = KSPROPERTY_TYPE_GET;
PropertyRequest.Id = KSPROPERTY_PIN_CTYPES;
@@ -114,9 +105,6 @@ QueryFilterRoutine(
DPRINT("Num Pins %u Num WaveIn Pins %u Name WaveOut Pins %u\n", DeviceEntry->NumberOfPins, NumWaveInPin, NumWaveOutPin);
}
-
-
-
VOID
NTAPI
FilterPinWorkerRoutine(
@@ -124,21 +112,11 @@ FilterPinWorkerRoutine(
IN PVOID Context)
{
PKSAUDIO_DEVICE_ENTRY DeviceEntry;
- PKSAUDIO_SUBDEVICE_ENTRY SubDeviceEntry;
- PLIST_ENTRY ListEntry;
-
PFILTER_WORKER_CONTEXT Ctx = (PFILTER_WORKER_CONTEXT)Context;
DeviceEntry = Ctx->DeviceEntry;
- ListEntry = DeviceEntry->SubDeviceList.Flink;
- while(ListEntry != &DeviceEntry->SubDeviceList)
- {
- SubDeviceEntry = (PKSAUDIO_SUBDEVICE_ENTRY)CONTAINING_RECORD(ListEntry, KSAUDIO_SUBDEVICE_ENTRY, Entry);
- QueryFilterRoutine(SubDeviceEntry);
- ListEntry = ListEntry->Flink;
- }
-
+ QueryFilterRoutine(DeviceEntry);
/* free work item */
IoFreeWorkItem(Ctx->WorkItem);
@@ -177,7 +155,7 @@ OpenDevice(
if (!NT_SUCCESS(Status))
{
- DPRINT("ZwCreateFile failed with %x\n", Status);
+ DPRINT("ZwCreateFile failed with %x %S\n", Status, DeviceName->Buffer);
return Status;
}
@@ -195,125 +173,92 @@ OpenDevice(
}
NTSTATUS
-NTAPI
-DeviceInterfaceChangeCallback(
- IN PVOID NotificationStructure,
- IN PVOID Context)
+InsertAudioDevice(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PUNICODE_STRING DeviceName,
+ IN LPWSTR ReferenceString)
{
- DEVICE_INTERFACE_CHANGE_NOTIFICATION * Event;
NTSTATUS Status = STATUS_SUCCESS;
+ PFILTER_WORKER_CONTEXT Ctx = NULL;
+ PIO_WORKITEM WorkItem = NULL;
PSYSAUDIODEVEXT DeviceExtension;
PKSAUDIO_DEVICE_ENTRY DeviceEntry = NULL;
- PKSAUDIO_SUBDEVICE_ENTRY SubDeviceEntry;
- PIO_WORKITEM WorkItem = NULL;
- PFILTER_WORKER_CONTEXT Ctx = NULL;
- PDEVICE_OBJECT DeviceObject = (PDEVICE_OBJECT)Context;
+ /* a new device has arrived */
+ DeviceEntry = ExAllocatePool(NonPagedPool, sizeof(KSAUDIO_DEVICE_ENTRY));
+ if (!DeviceEntry)
+ {
+ /* no memory */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* initialize audio device entry */
+ RtlZeroMemory(DeviceEntry, sizeof(KSAUDIO_DEVICE_ENTRY));
+
+ /* allocate filter ctx */
+ Ctx = ExAllocatePool(NonPagedPool, sizeof(FILTER_WORKER_CONTEXT));
+ if (!Ctx)
+ {
+ /* no memory */
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto cleanup;
+ }
+
+ /* allocate work item */
+ WorkItem = IoAllocateWorkItem(DeviceObject);
+ if (!WorkItem)
+ {
+ /* no memory */
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto cleanup;
+ }
+
+ /* set device name */
+ DeviceEntry->DeviceName.Length = 0;
+ DeviceEntry->DeviceName.MaximumLength = DeviceName->MaximumLength + 10 * sizeof(WCHAR);
+
+ /* hack for bug 4566 */
+ if (ReferenceString)
+ {
+ DeviceEntry->DeviceName.MaximumLength += (wcslen(ReferenceString) + 2) * sizeof(WCHAR);
+ }
+
+ DeviceEntry->DeviceName.Buffer = ExAllocatePool(NonPagedPool, DeviceEntry->DeviceName.MaximumLength);
+
+ if (!DeviceEntry->DeviceName.Buffer)
+ {
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto cleanup;
+ }
+
+ RtlAppendUnicodeToString(&DeviceEntry->DeviceName, L"\\??\\");
+ RtlAppendUnicodeStringToString(&DeviceEntry->DeviceName, DeviceName);
+
+ if (ReferenceString)
+ {
+ RtlAppendUnicodeToString(&DeviceEntry->DeviceName, L"\\");
+ RtlAppendUnicodeToString(&DeviceEntry->DeviceName, ReferenceString);
+ }
+
+ Status = OpenDevice(&DeviceEntry->DeviceName, &DeviceEntry->Handle, &DeviceEntry->FileObject);
+
+ if (!NT_SUCCESS(Status))
+ {
+ goto cleanup;
+ }
+
+ Ctx->DeviceEntry = DeviceEntry;
+ Ctx->WorkItem = WorkItem;
+
+ /* fetch device extension */
DeviceExtension = (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension;
+ /* insert new audio device */
+ ExInterlockedInsertTailList(&DeviceExtension->KsAudioDeviceList, &DeviceEntry->Entry, &DeviceExtension->Lock);
+ InterlockedIncrement((PLONG)&DeviceExtension->NumberOfKsAudioDevices);
- Event = (DEVICE_INTERFACE_CHANGE_NOTIFICATION*)NotificationStructure;
-
- if (IsEqualGUIDAligned(&Event->Event,
- &GUID_DEVICE_INTERFACE_ARRIVAL))
- {
-
- /* a new device has arrived */
- DeviceEntry = ExAllocatePool(NonPagedPool, sizeof(KSAUDIO_DEVICE_ENTRY));
- if (!DeviceEntry)
- {
- /* no memory */
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- /* initialize audio device entry */
- RtlZeroMemory(DeviceEntry, sizeof(KSAUDIO_DEVICE_ENTRY));
-
- /* allocate filter ctx */
- Ctx = ExAllocatePool(NonPagedPool, sizeof(FILTER_WORKER_CONTEXT));
- if (!Ctx)
- {
- /* no memory */
- Status = STATUS_INSUFFICIENT_RESOURCES;
- goto cleanup;
- }
-
- /* allocate work item */
- WorkItem = IoAllocateWorkItem(DeviceObject);
- if (!WorkItem)
- {
- /* no memory */
- Status = STATUS_INSUFFICIENT_RESOURCES;
- goto cleanup;
- }
-
- /* set device name */
- DeviceEntry->DeviceName.Length = 0;
- DeviceEntry->DeviceName.MaximumLength = Event->SymbolicLinkName->Length + 10 * sizeof(WCHAR);
- DeviceEntry->DeviceName.Buffer = ExAllocatePool(NonPagedPool, DeviceEntry->DeviceName.MaximumLength);
-
- if (!DeviceEntry->DeviceName.Buffer)
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- goto cleanup;
- }
-
- if (!NT_SUCCESS(RtlAppendUnicodeToString(&DeviceEntry->DeviceName, L"\\??\\")))
- {
- DPRINT1("RtlAppendUnicodeToString failed with %x\n", Status);
- goto cleanup;
- }
-
- if (!NT_SUCCESS(RtlAppendUnicodeStringToString(&DeviceEntry->DeviceName, Event->SymbolicLinkName)))
- {
- DPRINT1("RtlAppendUnicodeStringToString failed with %x\n", Status);
- goto cleanup;
- }
-
- /* FIXME Ros does not support device interface strings */
- /* Workarround: repeatly call IoCreateFile untill ks wont find a create item which has no object header attached */
-
- InitializeListHead(&DeviceEntry->SubDeviceList);
- do
- {
- SubDeviceEntry = ExAllocatePool(NonPagedPool, sizeof(KSAUDIO_SUBDEVICE_ENTRY));
- if (SubDeviceEntry)
- {
- RtlZeroMemory(SubDeviceEntry, sizeof(KSAUDIO_SUBDEVICE_ENTRY));
- Status = OpenDevice(&DeviceEntry->DeviceName, &SubDeviceEntry->Handle, &SubDeviceEntry->FileObject);
- if (NT_SUCCESS(Status))
- {
- InsertTailList(&DeviceEntry->SubDeviceList, &SubDeviceEntry->Entry);
- DeviceEntry->NumSubDevices++;
- /* increment audio device count */
- InterlockedIncrement((PLONG)&DeviceExtension->NumberOfKsAudioDevices);
- }
- else
- {
- ExFreePool(SubDeviceEntry);
- break;
- }
- }
- }while(NT_SUCCESS(Status) && SubDeviceEntry != NULL);
-
- DPRINT("Successfully opened audio device %u Device %S NumberOfSubDevices %u\n", DeviceExtension->NumberOfKsAudioDevices, DeviceEntry->DeviceName.Buffer, DeviceEntry->NumSubDevices);
-
- Ctx->DeviceEntry = DeviceEntry;
- Ctx->WorkItem = WorkItem;
-
- /* fetch device extension */
- DeviceExtension = (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension;
- /* insert new audio device */
- ExInterlockedInsertTailList(&DeviceExtension->KsAudioDeviceList, &DeviceEntry->Entry, &DeviceExtension->Lock);
-
- IoQueueWorkItem(WorkItem, FilterPinWorkerRoutine, DelayedWorkQueue, (PVOID)Ctx);
- return Status;
- }
- else
- {
- DPRINT("Remove interface to audio device!\n");
- UNIMPLEMENTED
- return STATUS_SUCCESS;
- }
+ DPRINT("Successfully opened audio device %u Device %S\n", DeviceExtension->NumberOfKsAudioDevices, DeviceEntry->DeviceName.Buffer);
+ IoQueueWorkItem(WorkItem, FilterPinWorkerRoutine, DelayedWorkQueue, (PVOID)Ctx);
+ return Status;
cleanup:
if (Ctx)
@@ -331,6 +276,93 @@ cleanup:
}
return Status;
+
+}
+
+
+NTSTATUS
+NTAPI
+DeviceInterfaceChangeCallback(
+ IN PVOID NotificationStructure,
+ IN PVOID Context)
+{
+ DEVICE_INTERFACE_CHANGE_NOTIFICATION * Event;
+ NTSTATUS Status = STATUS_SUCCESS;
+ PSYSAUDIODEVEXT DeviceExtension;
+ UNICODE_STRING DeviceName;
+ HANDLE Handle;
+ PFILE_OBJECT FileObject;
+ LPWSTR ReferenceString;
+ ULONG BytesReturned;
+
+
+ PDEVICE_OBJECT DeviceObject = (PDEVICE_OBJECT)Context;
+
+ DeviceExtension = (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension;
+
+ Event = (DEVICE_INTERFACE_CHANGE_NOTIFICATION*)NotificationStructure;
+
+ if (IsEqualGUIDAligned(&Event->Event,
+ &GUID_DEVICE_INTERFACE_ARRIVAL))
+ {
+ /*
+ * 1) Open the filter w/o reference string
+ * 2) Retrieve reference strings with our private IOCTL_KS_OBJECT_CLASS
+ * 3) Append these reference strings to symbolic link we got
+ * * see bug 4566
+ */
+
+ DeviceName.Length = 0;
+ DeviceName.MaximumLength = Event->SymbolicLinkName->Length + 10 * sizeof(WCHAR);
+
+ DeviceName.Buffer = ExAllocatePool(NonPagedPool, DeviceName.MaximumLength);
+
+ if (!DeviceName.Buffer)
+ {
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ RtlAppendUnicodeToString(&DeviceName, L"\\??\\");
+ RtlAppendUnicodeStringToString(&DeviceName, Event->SymbolicLinkName);
+
+
+ Status = OpenDevice(&DeviceName, &Handle, &FileObject);
+ if (!NT_SUCCESS(Status))
+ {
+ ExFreePool(DeviceName.Buffer);
+ return Status;
+ }
+
+ Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_OBJECT_CLASS, NULL, 0, &ReferenceString, sizeof(LPWSTR), &BytesReturned);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("failed Status %x\n", Status);
+
+ ExFreePool(DeviceName.Buffer);
+ ObDereferenceObject(FileObject);
+ ZwClose(Handle);
+ return Status;
+ }
+
+ while(*ReferenceString)
+ {
+ Status = InsertAudioDevice(DeviceObject, Event->SymbolicLinkName, ReferenceString);
+ ReferenceString += wcslen(ReferenceString) + 1;
+ }
+ //ExFreePool(ReferenceString);
+ ObDereferenceObject(FileObject);
+ ZwClose(Handle);
+ ExFreePool(DeviceName.Buffer);
+ return Status;
+ }
+ else
+ {
+ DPRINT("Remove interface to audio device!\n");
+ UNIMPLEMENTED
+ return STATUS_SUCCESS;
+ }
+
+
}
NTSTATUS
diff --git a/reactos/drivers/wdm/audio/sysaudio/dispatcher.c b/reactos/drivers/wdm/audio/sysaudio/dispatcher.c
index 218772bfffb..7eb76cbdb04 100644
--- a/reactos/drivers/wdm/audio/sysaudio/dispatcher.c
+++ b/reactos/drivers/wdm/audio/sysaudio/dispatcher.c
@@ -179,6 +179,25 @@ static KSDISPATCH_TABLE DispatchTable =
Dispatch_fnFastWrite,
};
+NTSTATUS
+NTAPI
+DispatchCreateSysAudioPin(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NTSTATUS Status;
+
+ DPRINT("DispatchCreateSysAudio entered\n");
+ /* create the virtual pin */
+ Status = CreateSysAudioPin(Irp);
+
+ /* store result */
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+}
+
NTSTATUS
NTAPI
DispatchCreateSysAudio(
@@ -188,31 +207,11 @@ DispatchCreateSysAudio(
NTSTATUS Status;
KSOBJECT_HEADER ObjectHeader;
PKSOBJECT_CREATE_ITEM CreateItem;
- PIO_STACK_LOCATION IoStatus;
- LPWSTR Buffer;
- PSYSAUDIODEVEXT DeviceExtension;
+
static LPWSTR KS_NAME_PIN = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}";
- IoStatus = IoGetCurrentIrpStackLocation(Irp);
- Buffer = IoStatus->FileObject->FileName.Buffer;
-
DPRINT("DispatchCreateSysAudio entered\n");
- if (Buffer)
- {
- /* is the request for a new pin */
- if (!wcsncmp(KS_NAME_PIN, Buffer, wcslen(KS_NAME_PIN)))
- {
- Status = CreateDispatcher(Irp);
- DPRINT("Virtual pin Status %x FileObject %p\n", Status, IoStatus->FileObject);
-
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return Status;
- }
- }
-
/* allocate create item */
CreateItem = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
if (!CreateItem)
@@ -223,14 +222,12 @@ DispatchCreateSysAudio(
return STATUS_INSUFFICIENT_RESOURCES;
}
- /* get device extension */
- DeviceExtension = (PSYSAUDIODEVEXT) DeviceObject->DeviceExtension;
-
/* zero create struct */
RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
- /* store create context */
- RtlInitUnicodeString(&CreateItem->ObjectClass, L"SysAudio");
+ /* setup create context */
+ CreateItem->Create = DispatchCreateSysAudioPin;
+ RtlInitUnicodeString(&CreateItem->ObjectClass, KS_NAME_PIN);
/* allocate object header */
Status = KsAllocateObjectHeader(&ObjectHeader, 1, CreateItem, Irp, &DispatchTable);
@@ -259,6 +256,7 @@ SysAudioAllocateDeviceHeader(
RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
CreateItem->Create = DispatchCreateSysAudio;
RtlInitUnicodeString(&CreateItem->ObjectClass, L"SysAudio");
+ CreateItem->Flags = KSCREATE_ITEM_WILDCARD;
Status = KsAllocateDeviceHeader(&DeviceExtension->KsDeviceHeader,
1,
@@ -271,7 +269,6 @@ SysAudioOpenKMixer(
IN SYSAUDIODEVEXT *DeviceExtension)
{
NTSTATUS Status;
-
UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\kmixer");
UNICODE_STRING DevicePath = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\kmixer");
diff --git a/reactos/drivers/wdm/audio/sysaudio/main.c b/reactos/drivers/wdm/audio/sysaudio/main.c
index 628e8d1112b..6cdf2527cf8 100644
--- a/reactos/drivers/wdm/audio/sysaudio/main.c
+++ b/reactos/drivers/wdm/audio/sysaudio/main.c
@@ -34,9 +34,8 @@ SysAudio_Shutdown(
IN PIRP Irp)
{
PKSAUDIO_DEVICE_ENTRY DeviceEntry;
- PKSAUDIO_SUBDEVICE_ENTRY SubDeviceEntry;
PSYSAUDIODEVEXT DeviceExtension;
- PLIST_ENTRY Entry, SubEntry;
+ PLIST_ENTRY Entry;
DPRINT1("SysAudio_Shutdown called\n");
@@ -50,16 +49,6 @@ SysAudio_Shutdown(
DPRINT1("Freeing item %wZ\n", &DeviceEntry->DeviceName);
RtlFreeUnicodeString(&DeviceEntry->DeviceName);
- while(!IsListEmpty(&DeviceEntry->SubDeviceList))
- {
- SubEntry = RemoveHeadList(&DeviceEntry->SubDeviceList);
- SubDeviceEntry = (PKSAUDIO_SUBDEVICE_ENTRY)CONTAINING_RECORD(SubEntry, KSAUDIO_SUBDEVICE_ENTRY, Entry);
-
- ZwClose(SubDeviceEntry->Handle);
- ObDereferenceObject(SubDeviceEntry->FileObject);
- ExFreePool(SubDeviceEntry->Pins);
- ExFreePool(SubDeviceEntry);
- }
ExFreePool(DeviceEntry);
}
diff --git a/reactos/drivers/wdm/audio/sysaudio/pin.c b/reactos/drivers/wdm/audio/sysaudio/pin.c
index 742d38b5bfd..21456926621 100644
--- a/reactos/drivers/wdm/audio/sysaudio/pin.c
+++ b/reactos/drivers/wdm/audio/sysaudio/pin.c
@@ -128,9 +128,9 @@ Pin_fnWrite(
{
PDISPATCH_CONTEXT Context;
PIO_STACK_LOCATION IoStack;
- ULONG BytesReturned;
PFILE_OBJECT FileObject;
NTSTATUS Status;
+ ULONG BytesReturned;
/* Get current stack location */
IoStack = IoGetCurrentIrpStackLocation(Irp);
@@ -159,20 +159,21 @@ Pin_fnWrite(
return Status;
}
- /* Re-dispatch the request to the real target pin */
+ /* call the portcls audio pin */
Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_WRITE_STREAM,
MmGetMdlVirtualAddress(Irp->MdlAddress),
- IoStack->Parameters.Read.Length,
+ IoStack->Parameters.Write.Length,
NULL,
0,
&BytesReturned);
- /* release file object */
+
+ /* Release file object */
ObDereferenceObject(FileObject);
/* Save status and information */
Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Information = BytesReturned;
/* Complete the irp */
IoCompleteRequest(Irp, IO_NO_INCREMENT);
/* Done */
@@ -418,7 +419,7 @@ static KSDISPATCH_TABLE PinTable =
};
NTSTATUS
-CreateDispatcher(
+CreateSysAudioPin(
IN PIRP Irp)
{
NTSTATUS Status;
diff --git a/reactos/drivers/wdm/audio/sysaudio/sysaudio.h b/reactos/drivers/wdm/audio/sysaudio/sysaudio.h
index 9673f21729a..c26ef1140e7 100644
--- a/reactos/drivers/wdm/audio/sysaudio/sysaudio.h
+++ b/reactos/drivers/wdm/audio/sysaudio/sysaudio.h
@@ -22,7 +22,8 @@ typedef struct
typedef struct
{
- LIST_ENTRY Entry; // linked list entry to KSAUDIO_DEVICE_ENTRY
+ LIST_ENTRY Entry; // device entry for KsAudioDeviceList
+ UNICODE_STRING DeviceName; // symbolic link of audio device
HANDLE Handle; // handle to audio sub device
PFILE_OBJECT FileObject; // file objecto to audio sub device
@@ -30,18 +31,6 @@ typedef struct
ULONG NumberOfPins; // number of pins of audio device
PIN_INFO * Pins; // array of PIN_INFO
- LPWSTR ObjectClass; // object class of sub device
-
-}KSAUDIO_SUBDEVICE_ENTRY, *PKSAUDIO_SUBDEVICE_ENTRY;
-
-typedef struct
-{
- LIST_ENTRY Entry; // device entry for KsAudioDeviceList
- UNICODE_STRING DeviceName; // symbolic link of audio device
-
- ULONG NumSubDevices; // number of subdevices
- LIST_ENTRY SubDeviceList; // audio sub device list
-
}KSAUDIO_DEVICE_ENTRY, *PKSAUDIO_DEVICE_ENTRY;
typedef struct
@@ -71,7 +60,7 @@ typedef struct
{
HANDLE Handle; // audio irp pin handle
ULONG PinId; // pin id of device
- PKSAUDIO_SUBDEVICE_ENTRY AudioEntry; // pointer to audio device entry
+ PKSAUDIO_DEVICE_ENTRY AudioEntry; // pointer to audio device entry
HANDLE hMixerPin; // handle to mixer pin
}DISPATCH_CONTEXT, *PDISPATCH_CONTEXT;
@@ -86,7 +75,7 @@ typedef struct
PIRP Irp;
BOOL CreateRealPin;
BOOL CreateMixerPin;
- PKSAUDIO_SUBDEVICE_ENTRY Entry;
+ PKSAUDIO_DEVICE_ENTRY Entry;
KSPIN_CONNECT * PinConnect;
PDISPATCH_CONTEXT DispatchContext;
PSYSAUDIODEVEXT DeviceExtension;
@@ -129,13 +118,13 @@ OpenDevice(
IN PHANDLE HandleOut,
IN PFILE_OBJECT * FileObjectOut);
-PKSAUDIO_SUBDEVICE_ENTRY
+PKSAUDIO_DEVICE_ENTRY
GetListEntry(
IN PLIST_ENTRY Head,
IN ULONG Index);
NTSTATUS
-CreateDispatcher(
+CreateSysAudioPin(
IN PIRP Irp);
ULONG
diff --git a/reactos/hal/hal/hal.c b/reactos/hal/hal/hal.c
index 48efdbf2b79..bd6cf5b0d04 100644
--- a/reactos/hal/hal/hal.c
+++ b/reactos/hal/hal/hal.c
@@ -611,7 +611,7 @@ HalTranslateBusAddress(
return TRUE;
}
-
+#ifndef _M_ARM
VOID
NTAPI
HalpAssignDriveLetters(IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
@@ -669,7 +669,7 @@ HalpSetPartitionInformation(IN PDEVICE_OBJECT DeviceObject,
PartitionNumber,
PartitionType);
}
-
+#endif
BOOLEAN
NTAPI
diff --git a/reactos/hal/hal/hal.pspec b/reactos/hal/hal/hal.pspec
index 0b1a9bce7a1..0a191bee07f 100644
--- a/reactos/hal/hal/hal.pspec
+++ b/reactos/hal/hal/hal.pspec
@@ -1,7 +1,12 @@
#include "include/reactos/msvctarget.h"
+#ifdef _M_ARM
+@ fastcall ExAcquireFastMutex(ptr)
+@ fastcall ExReleaseFastMutex(ptr)
+#else
@ fastcall ExAcquireFastMutex(ptr) ExiAcquireFastMutex
@ fastcall ExReleaseFastMutex(ptr) ExiReleaseFastMutex
+#endif
@ fastcall ExTryToAcquireFastMutex(ptr) ExiTryToAcquireFastMutex
@ fastcall HalClearSoftwareInterrupt(long)
@ fastcall HalRequestSoftwareInterrupt(long)
@@ -69,14 +74,16 @@
@ fastcall HalSweepDcache()
#endif
@ stdcall HalTranslateBusAddress(long long long long ptr ptr)
-@ stdcall IoAssignDriveLetters(ptr str ptr ptr) HalpAssignDriveLetters
@ stdcall IoFlushAdapterBuffers(ptr ptr ptr ptr long long)
@ stdcall IoFreeAdapterChannel(ptr)
@ stdcall IoFreeMapRegisters(ptr ptr long)
@ stdcall IoMapTransfer(ptr ptr ptr ptr ptr long)
+#ifndef _M_ARM
+@ stdcall IoAssignDriveLetters(ptr str ptr ptr) HalpAssignDriveLetters
@ stdcall IoReadPartitionTable(ptr long long ptr) HalpReadPartitionTable
@ stdcall IoSetPartitionInformation(ptr long long long) HalpSetPartitionInformation
@ stdcall IoWritePartitionTable(ptr long long long ptr) HalpWritePartitionTable
+#endif
@ stdcall KeAcquireSpinLock(ptr ptr)
@ extern KdComPortInUse
@ stdcall KeFlushWriteBuffer()
diff --git a/reactos/hal/hal/hal.rbuild b/reactos/hal/hal/hal.rbuild
index 3a651fa6158..d89871d099c 100644
--- a/reactos/hal/hal/hal.rbuild
+++ b/reactos/hal/hal/hal.rbuild
@@ -3,7 +3,7 @@
-
+
include
ntoskrnl
diff --git a/reactos/hal/halarm/generic/hal.c b/reactos/hal/halarm/generic/hal.c
index 2567e0e6186..584d1f63827 100644
--- a/reactos/hal/halarm/generic/hal.c
+++ b/reactos/hal/halarm/generic/hal.c
@@ -21,8 +21,8 @@
#undef KeRaiseIrql
#undef KeReleaseSpinLock
-#define READ_REGISTER_ULONG(r) (*(volatile ULONG * const)(r))
-#define WRITE_REGISTER_ULONG(r, v) (*(volatile ULONG *)(r) = (v))
+#define READ_REGISTER_ULONG(r) (*((volatile ULONG * const)(r)))
+#define WRITE_REGISTER_ULONG(r, v) (*((volatile ULONG *)(r)) = (v))
/* DATA **********************************************************************/
@@ -120,7 +120,7 @@ VOID
NTAPI
HalStopProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
{
- KEBUGCHECK(0);
+ KeBugCheck(0);
return;
}
@@ -131,7 +131,7 @@ VOID
NTAPI
HalStartProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
{
- KEBUGCHECK(0);
+ KeBugCheck(0);
return;
}
@@ -142,7 +142,7 @@ ULONG_PTR
NTAPI
HalSetProfileInterval(IN ULONG_PTR Interval)
{
- KEBUGCHECK(0);
+ KeBugCheck(0);
return Interval;
}
diff --git a/reactos/hal/halppc/generic/dma.c b/reactos/hal/halppc/generic/dma.c
index 0db7c75a7a3..e2a40560b0f 100644
--- a/reactos/hal/halppc/generic/dma.c
+++ b/reactos/hal/halppc/generic/dma.c
@@ -770,7 +770,7 @@ HalGetAdapter(
{
if (!HalpDmaInitializeEisaAdapter(AdapterObject, DeviceDescription))
{
- ObfDereferenceObject(AdapterObject);
+ ObDereferenceObject(AdapterObject);
return NULL;
}
}
@@ -817,7 +817,7 @@ HalPutDmaAdapter(
KeSetEvent(&HalpDmaLock, 0, 0);
}
- ObfDereferenceObject(AdapterObject);
+ ObDereferenceObject(AdapterObject);
}
/**
diff --git a/reactos/hal/halx86/generic/dma.c b/reactos/hal/halx86/generic/dma.c
index 1a9f43e3964..c40d339d7bd 100644
--- a/reactos/hal/halx86/generic/dma.c
+++ b/reactos/hal/halx86/generic/dma.c
@@ -770,7 +770,7 @@ HalGetAdapter(
{
if (!HalpDmaInitializeEisaAdapter(AdapterObject, DeviceDescription))
{
- ObfDereferenceObject(AdapterObject);
+ ObDereferenceObject(AdapterObject);
return NULL;
}
}
@@ -817,7 +817,7 @@ HalPutDmaAdapter(
KeSetEvent(&HalpDmaLock, 0, 0);
}
- ObfDereferenceObject(AdapterObject);
+ ObDereferenceObject(AdapterObject);
}
/**
diff --git a/reactos/hal/halx86/mp/apic.c b/reactos/hal/halx86/mp/apic.c
index 88e3c5bba32..651500a2f61 100644
--- a/reactos/hal/halx86/mp/apic.c
+++ b/reactos/hal/halx86/mp/apic.c
@@ -351,7 +351,7 @@ VOID APICDump(VOID)
BOOLEAN VerifyLocalAPIC(VOID)
{
SIZE_T reg0, reg1;
- ULONG l, h;
+ ULONG l = 0, h = 0;
/* The version register is read-only in a real APIC */
reg0 = APICRead(APIC_VER);
DPRINT1("Getting VERSION: %x\n", reg0);
@@ -416,7 +416,7 @@ BOOLEAN VerifyLocalAPIC(VOID)
#ifdef CONFIG_SMP
VOID APICSendIPI(ULONG Target, ULONG Mode)
{
- ULONG tmp, i, flags;
+ ULONG tmp, i, flags = 0;
/* save flags and disable interrupts */
Ke386SaveFlags(flags);
diff --git a/reactos/hal/halx86/mp/mpsirql.c b/reactos/hal/halx86/mp/mpsirql.c
index 6ff83c14417..a3480180401 100644
--- a/reactos/hal/halx86/mp/mpsirql.c
+++ b/reactos/hal/halx86/mp/mpsirql.c
@@ -28,7 +28,7 @@ KIRQL NTAPI KeGetCurrentIrql (VOID)
*/
{
KIRQL irql;
- ULONG Flags;
+ ULONG Flags = 0;
Ke386SaveFlags(Flags);
_disable();
@@ -53,7 +53,7 @@ VOID KeSetCurrentIrql (KIRQL NewIrql)
* PURPOSE: Sets the current irq level without taking any action
*/
{
- ULONG Flags;
+ ULONG Flags = 0;
if (NewIrql > HIGH_LEVEL)
{
DPRINT1 ("NewIrql %x\n", NewIrql);
@@ -71,7 +71,7 @@ VOID KeSetCurrentIrql (KIRQL NewIrql)
VOID
HalpLowerIrql(KIRQL NewIrql, BOOLEAN FromHalEndSystemInterrupt)
{
- ULONG Flags;
+ ULONG Flags = 0;
UCHAR DpcRequested;
if (NewIrql >= DISPATCH_LEVEL)
{
@@ -188,7 +188,7 @@ KIRQL FASTCALL
KfRaiseIrql (KIRQL NewIrql)
{
KIRQL OldIrql;
- ULONG Flags;
+ ULONG Flags = 0;
Ke386SaveFlags(Flags);
_disable();
@@ -295,7 +295,7 @@ HalBeginSystemInterrupt (KIRQL Irql,
ULONG Vector,
PKIRQL OldIrql)
{
- ULONG Flags;
+ ULONG Flags = 0;
DPRINT("Vector (0x%X) Irql (0x%X)\n", Vector, Irql);
if (KeGetCurrentIrql () >= Irql)
@@ -324,7 +324,7 @@ HalEndSystemInterrupt (KIRQL Irql,
* FUNCTION: Finish a system interrupt and restore the specified irq level.
*/
{
- ULONG Flags;
+ ULONG Flags = 0;
Ke386SaveFlags(Flags);
if (Flags & EFLAGS_INTERRUPT_MASK)
diff --git a/reactos/include/crt/malloc.h b/reactos/include/crt/malloc.h
index 9ea62af81db..18ffa80cdb7 100644
--- a/reactos/include/crt/malloc.h
+++ b/reactos/include/crt/malloc.h
@@ -104,6 +104,8 @@ extern "C" {
#define _ALLOCA_S_MARKER_SIZE 8
#elif defined(__ia64__) || defined(__x86_64)
#define _ALLOCA_S_MARKER_SIZE 16
+#elif defined(__arm__)
+#define _ALLOCA_S_MARKER_SIZE 8
#endif
#if !defined(RC_INVOKED)
diff --git a/reactos/include/crt/mingw32/intrin_arm.h b/reactos/include/crt/mingw32/intrin_arm.h
index d3f854bd840..3e788926cbb 100644
--- a/reactos/include/crt/mingw32/intrin_arm.h
+++ b/reactos/include/crt/mingw32/intrin_arm.h
@@ -34,6 +34,21 @@
#define _ReadWriteBarrier() __sync_synchronize()
+__INTRIN_INLINE char _InterlockedCompareExchange8(volatile char * const Destination, const char Exchange, const char Comperand)
+{
+ return __sync_val_compare_and_swap(Destination, Comperand, Exchange);
+}
+
+__INTRIN_INLINE short _InterlockedCompareExchange16(volatile short * const Destination, const short Exchange, const short Comperand)
+{
+ return __sync_val_compare_and_swap(Destination, Comperand, Exchange);
+}
+
+__INTRIN_INLINE long _InterlockedExchangeAdd16(volatile short * const Addend, const short Value)
+{
+ return __sync_fetch_and_add(Addend, Value);
+}
+
__INTRIN_INLINE long _InterlockedCompareExchange(volatile long * const dest, const long exch, const long comp)
{
long a, b;
@@ -103,7 +118,15 @@ __INTRIN_INLINE long _InterlockedExchange(volatile long * const dest, const long
__INTRIN_INLINE void * _InterlockedExchangePointer(void * volatile * const Target, void * const Value)
{
- return _InterlockedExchange(Target, Value);
+ return (void *)_InterlockedExchange((volatile long * const)Target, (const long)Value);
+}
+
+
+
+__INTRIN_INLINE unsigned char _BitScanReverse(unsigned long * const Index, const unsigned long Mask)
+{
+ *Index = 31 - __builtin_clz(Mask);
+ return Mask ? 1 : 0;
}
__INTRIN_INLINE char _InterlockedAnd8(volatile char * const value, const char mask)
@@ -279,13 +302,17 @@ __INTRIN_INLINE long _InterlockedIncrement16(volatile short * const lpAddend)
return _InterlockedExchangeAdd16(lpAddend, 1) + 1;
}
+__INTRIN_INLINE long _InterlockedAddLargeStatistic(volatile long long * const Addend, const long Value)
+{
+ *Addend += Value;
+ return Value;
+}
+
__INTRIN_INLINE void _disable(void)
{
__asm__ __volatile__
(
- "mrs r1, cpsr;"
- "orr r1, r1, #0x80;"
- "msr cpsr, r1;"
+ "cpsid i @ __cli" : : : "memory", "cc"
);
}
@@ -293,14 +320,22 @@ __INTRIN_INLINE void _enable(void)
{
__asm__ __volatile__
(
- "mrs r1, cpsr;"
- "bic r1, r1, #0x80;"
- "msr cpsr, r1;"
+ "cpsie i @ __sti" : : : "memory", "cc"
);
}
+__INTRIN_INLINE unsigned char _interlockedbittestandset(volatile long * a, const long b)
+{
+ return (_InterlockedOr(a, 1 << b) >> b) & 1;
+}
+
+__INTRIN_INLINE unsigned char _interlockedbittestandreset(volatile long * a, const long b)
+{
+ return (_InterlockedAnd(a, ~(1 << b)) >> b) & 1;
+}
+
#ifndef __MSVCRT__
-__INTRIN_INLINE unsigned long _rotl(const unsigned long value, const unsigned char shift)
+__INTRIN_INLINE unsigned int _rotl(const unsigned int value, int shift)
{
return (((value) << ((int)(shift))) | ((value) >> (32 - (int)(shift))));
}
diff --git a/reactos/include/crt/mingw32/intrin_x86.h b/reactos/include/crt/mingw32/intrin_x86.h
index f23bb34301e..959071821a2 100644
--- a/reactos/include/crt/mingw32/intrin_x86.h
+++ b/reactos/include/crt/mingw32/intrin_x86.h
@@ -841,7 +841,6 @@ __INTRIN_INLINE unsigned short _rotl16(unsigned short value, unsigned char shift
return retval;
}
-#ifndef __MSVCRT__
__INTRIN_INLINE unsigned int _rotl(unsigned int value, int shift)
{
unsigned long retval;
@@ -855,7 +854,6 @@ __INTRIN_INLINE unsigned int _rotr(unsigned int value, int shift)
__asm__("rorl %b[shift], %k[retval]" : [retval] "=rm" (retval) : "[retval]" (value), [shift] "Nc" (shift));
return retval;
}
-#endif
__INTRIN_INLINE unsigned char _rotr8(unsigned char value, unsigned char shift)
{
diff --git a/reactos/include/crt/process.h b/reactos/include/crt/process.h
index a1c001d9ad9..35555e59168 100644
--- a/reactos/include/crt/process.h
+++ b/reactos/include/crt/process.h
@@ -40,7 +40,7 @@ extern "C" {
#pragma push_macro("abort")
#undef abort
#endif
- void __cdecl __declspec(noreturn) abort(void);
+ __declspec(noreturn) void __cdecl abort(void);
#if __MINGW_GNUC_PREREQ(4,4)
#pragma pop_macro("abort")
#undef abort
diff --git a/reactos/include/crt/stddef.h b/reactos/include/crt/stddef.h
index 02b6d7a9e53..8aa692e540a 100644
--- a/reactos/include/crt/stddef.h
+++ b/reactos/include/crt/stddef.h
@@ -287,7 +287,7 @@ typedef long ssize_t;
symbols in the _FOO_T_ family, stays defined even after its
corresponding type is defined). If we define wchar_t, then we
must undef _WCHAR_T_; for BSD/386 1.1 (and perhaps others), if
- we undef _WCHAR_T_, then we must also define rune_t, since
+ we undef _WCHAR_T_, then we must also define rune_t, since
headers like runetype.h assume that if machine/ansi.h is included,
and _BSD_WCHAR_T_ is not defined, then rune_t is available.
machine/ansi.h says, "Note that _WCHAR_T_ and _RUNE_T_ must be of
@@ -390,7 +390,11 @@ typedef __WCHAR_TYPE__ wchar_t;
#ifndef offsetof
/* Offset of member MEMBER in a struct of type TYPE. */
+#if defined(__GNUC__)
#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)
+#else
+#define offsetof(TYPE, MEMBER) ((size_t)&(((TYPE *)0)->MEMBER))
+#endif
#endif /* !offsetof */
diff --git a/reactos/include/crt/stdlib.h b/reactos/include/crt/stdlib.h
index b9de60f28a1..fbff168be07 100644
--- a/reactos/include/crt/stdlib.h
+++ b/reactos/include/crt/stdlib.h
@@ -152,7 +152,7 @@ extern "C" {
_CRTIMP extern char *_sys_errlist[];
_CRTIMP extern int _sys_nerr;
-#if (defined(_X86_) || defined(__x86_64)) // HACK
+//#if !defined(__x86_64)// hack here!
_CRTIMP int *__cdecl __p___argc(void);
_CRTIMP char ***__cdecl __p___argv(void);
_CRTIMP wchar_t ***__cdecl __p___wargv(void);
@@ -160,7 +160,7 @@ extern "C" {
_CRTIMP wchar_t ***__cdecl __p__wenviron(void);
_CRTIMP char **__cdecl __p__pgmptr(void);
_CRTIMP wchar_t **__cdecl __p__wpgmptr(void);
-#endif
+//#endif
#ifndef __argc
#ifdef _MSVCRT_
extern int __argc;
diff --git a/reactos/include/crt/sys/types.h b/reactos/include/crt/sys/types.h
index 6a0dabd07a5..eef90b05782 100644
--- a/reactos/include/crt/sys/types.h
+++ b/reactos/include/crt/sys/types.h
@@ -36,7 +36,7 @@ typedef unsigned int dev_t;
# endif
#endif
-// HACK HACK HACK
+#ifdef _WINE
#ifndef _PID_T_
#define _PID_T_
#ifndef _WIN64
@@ -45,8 +45,12 @@ typedef int _pid_t;
typedef __int64 _pid_t;
#endif
#ifndef NO_OLDNAMES
+#ifndef __pid_t_defined
+#define __pid_t_defined
typedef _pid_t pid_t;
+#endif /* __pid_t_defined */
#endif
#endif /* Not _PID_T_ */
+#endif
#endif /* !_INC_TYPES */
diff --git a/reactos/include/crt/wchar.h b/reactos/include/crt/wchar.h
index 90cf654dbc4..48314556753 100644
--- a/reactos/include/crt/wchar.h
+++ b/reactos/include/crt/wchar.h
@@ -219,6 +219,9 @@ extern "C" {
_CRTIMP int __cdecl __iswcsym(wint_t _C);
_CRTIMP int __cdecl _iswcsym_l(wint_t _C,_locale_t _Locale);
_CRTIMP int __cdecl is_wctype(wint_t _C,wctype_t _Type);
+#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || !defined (NO_OLDNAMES)
+int __cdecl iswblank(wint_t _C);
+#endif
#endif
#ifndef _WDIRECT_DEFINED
diff --git a/reactos/include/crt/wctype.h b/reactos/include/crt/wctype.h
index 93ff61e9e1a..dc903b3236f 100644
--- a/reactos/include/crt/wctype.h
+++ b/reactos/include/crt/wctype.h
@@ -122,7 +122,7 @@ extern "C" {
_CRTIMP int __cdecl __iswcsym(wint_t);
int __cdecl is_wctype(wint_t,wctype_t);
#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || !defined (NO_OLDNAMES)
-int __cdecl isblank(int _C);
+int __cdecl iswblank(wint_t _C);
#endif
#endif
diff --git a/reactos/include/ddk/ddkmapi.h b/reactos/include/ddk/ddkmapi.h
index 4500cc6f58f..cd7f6227165 100644
--- a/reactos/include/ddk/ddkmapi.h
+++ b/reactos/include/ddk/ddkmapi.h
@@ -95,8 +95,8 @@
#define DDNOTIFY_CLOSEVIDEOPORT 0x0200
#define DDNOTIFY_CLOSECAPTURE 0x0400
-typedef DWORD (*LPDXAPI)(DWORD dwFunctionNum, LPVOID lpvInBuffer, DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer);
-typedef ULONG (*LPDD_NOTIFYCALLBACK) (DWORD dwFlags, PVOID pContext, DWORD dwParam1, DWORD dwParam2);
+typedef DWORD (PASCAL *LPDXAPI)(DWORD dwFunctionNum, LPVOID lpvInBuffer, DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer);
+typedef ULONG (PASCAL *LPDD_NOTIFYCALLBACK) (DWORD dwFlags, PVOID pContext, DWORD dwParam1, DWORD dwParam2);
typedef struct _DDCAPBUFFINFO
{
diff --git a/reactos/include/ddk/hidclass.h b/reactos/include/ddk/hidclass.h
index 9dd219412ee..f269c03f4a2 100644
--- a/reactos/include/ddk/hidclass.h
+++ b/reactos/include/ddk/hidclass.h
@@ -98,11 +98,11 @@ enum DeviceObjectState {
DeviceObjectRemoved
};
-typedef VOID DDKAPI (*PHID_STATUS_CHANGE)(
+typedef VOID (DDKAPI *PHID_STATUS_CHANGE)(
PVOID Context,
enum DeviceObjectState State);
-typedef NTSTATUS DDKAPI (*PHIDP_GETCAPS)(
+typedef NTSTATUS (DDKAPI *PHIDP_GETCAPS)(
IN PHIDP_PREPARSED_DATA PreparsedData,
OUT PHIDP_CAPS Capabilities);
diff --git a/reactos/include/ddk/miniport.h b/reactos/include/ddk/miniport.h
index 98a3364ef68..b147c25a62b 100644
--- a/reactos/include/ddk/miniport.h
+++ b/reactos/include/ddk/miniport.h
@@ -58,8 +58,8 @@ typedef struct _VIDEO_ACCESS_RANGE {
} VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE;
#endif
-typedef VOID DDKAPI
-(*PBANKED_SECTION_ROUTINE)(
+typedef VOID
+(DDKAPI *PBANKED_SECTION_ROUTINE)(
IN ULONG ReadBank,
IN ULONG WriteBank,
IN PVOID Context);
diff --git a/reactos/include/ddk/ndis.h b/reactos/include/ddk/ndis.h
index ed47cdd2ba1..0a3039059b8 100644
--- a/reactos/include/ddk/ndis.h
+++ b/reactos/include/ddk/ndis.h
@@ -258,8 +258,8 @@ typedef struct _LOCK_STATE {
/* Timer */
-typedef VOID DDKAPI
-(*PNDIS_TIMER_FUNCTION)(
+typedef VOID
+(DDKAPI *PNDIS_TIMER_FUNCTION)(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
@@ -635,17 +635,17 @@ typedef struct _NDIS_WAN_LINE_UP {
} NDIS_WAN_LINE_UP, *PNDIS_WAN_LINE_UP;
-typedef VOID DDKAPI
-(*ADAPTER_SHUTDOWN_HANDLER)(
+typedef VOID
+(DDKAPI *ADAPTER_SHUTDOWN_HANDLER)(
IN PVOID ShutdownContext);
-typedef NTSTATUS DDKAPI
-(*TDI_REGISTER_CALLBACK)(
+typedef NTSTATUS
+(DDKAPI *TDI_REGISTER_CALLBACK)(
IN PUNICODE_STRING DeviceName,
OUT HANDLE* TdiHandle);
-typedef NTSTATUS DDKAPI
-(*TDI_PNP_HANDLER)(
+typedef NTSTATUS
+(DDKAPI *TDI_PNP_HANDLER)(
IN PUNICODE_STRING UpperComponent,
IN PUNICODE_STRING LowerComponent,
IN PUNICODE_STRING BindList,
@@ -1072,97 +1072,97 @@ typedef struct _WAN_CO_LINKPARAMS {
/* Call Manager */
-typedef VOID DDKAPI
-(*CM_ACTIVATE_VC_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CM_ACTIVATE_VC_COMPLETE_HANDLER)(
IN NDIS_STATUS Status,
IN NDIS_HANDLE CallMgrVcContext,
IN PCO_CALL_PARAMETERS CallParameters);
-typedef NDIS_STATUS DDKAPI
-(*CM_ADD_PARTY_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *CM_ADD_PARTY_HANDLER)(
IN NDIS_HANDLE CallMgrVcContext,
IN OUT PCO_CALL_PARAMETERS CallParameters,
IN NDIS_HANDLE NdisPartyHandle,
OUT PNDIS_HANDLE CallMgrPartyContext);
-typedef NDIS_STATUS DDKAPI
-(*CM_CLOSE_AF_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *CM_CLOSE_AF_HANDLER)(
IN NDIS_HANDLE CallMgrAfContext);
-typedef NDIS_STATUS DDKAPI
-(*CM_CLOSE_CALL_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *CM_CLOSE_CALL_HANDLER)(
IN NDIS_HANDLE CallMgrVcContext,
IN NDIS_HANDLE CallMgrPartyContext OPTIONAL,
IN PVOID CloseData OPTIONAL,
IN UINT Size OPTIONAL);
-typedef NDIS_STATUS DDKAPI
-(*CM_DEREG_SAP_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *CM_DEREG_SAP_HANDLER)(
IN NDIS_HANDLE CallMgrSapContext);
-typedef VOID DDKAPI
-(*CM_DEACTIVATE_VC_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CM_DEACTIVATE_VC_COMPLETE_HANDLER)(
IN NDIS_STATUS Status,
IN NDIS_HANDLE CallMgrVcContext);
-typedef NDIS_STATUS DDKAPI
-(*CM_DROP_PARTY_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *CM_DROP_PARTY_HANDLER)(
IN NDIS_HANDLE CallMgrPartyContext,
IN PVOID CloseData OPTIONAL,
IN UINT Size OPTIONAL);
-typedef VOID DDKAPI
-(*CM_INCOMING_CALL_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CM_INCOMING_CALL_COMPLETE_HANDLER)(
IN NDIS_STATUS Status,
IN NDIS_HANDLE CallMgrVcContext,
IN PCO_CALL_PARAMETERS CallParameters);
-typedef NDIS_STATUS DDKAPI
-(*CM_MAKE_CALL_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *CM_MAKE_CALL_HANDLER)(
IN NDIS_HANDLE CallMgrVcContext,
IN OUT PCO_CALL_PARAMETERS CallParameters,
IN NDIS_HANDLE NdisPartyHandle OPTIONAL,
OUT PNDIS_HANDLE CallMgrPartyContext OPTIONAL);
-typedef NDIS_STATUS DDKAPI
-(*CM_MODIFY_CALL_QOS_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *CM_MODIFY_CALL_QOS_HANDLER)(
IN NDIS_HANDLE CallMgrVcContext,
IN PCO_CALL_PARAMETERS CallParameters);
-typedef NDIS_STATUS DDKAPI
-(*CM_OPEN_AF_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *CM_OPEN_AF_HANDLER)(
IN NDIS_HANDLE CallMgrBindingContext,
IN PCO_ADDRESS_FAMILY AddressFamily,
IN NDIS_HANDLE NdisAfHandle,
OUT PNDIS_HANDLE CallMgrAfContext);
-typedef NDIS_STATUS DDKAPI
-(*CM_REG_SAP_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *CM_REG_SAP_HANDLER)(
IN NDIS_HANDLE CallMgrAfContext,
IN PCO_SAP Sap,
IN NDIS_HANDLE NdisSapHandle,
OUT PNDIS_HANDLE CallMgrSapContext);
-typedef NDIS_STATUS DDKAPI
-(*CO_CREATE_VC_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *CO_CREATE_VC_HANDLER)(
IN NDIS_HANDLE ProtocolAfContext,
IN NDIS_HANDLE NdisVcHandle,
OUT PNDIS_HANDLE ProtocolVcContext);
-typedef NDIS_STATUS DDKAPI
-(*CO_DELETE_VC_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *CO_DELETE_VC_HANDLER)(
IN NDIS_HANDLE ProtocolVcContext);
-typedef VOID DDKAPI
-(*CO_REQUEST_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CO_REQUEST_COMPLETE_HANDLER)(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolAfContext OPTIONAL,
IN NDIS_HANDLE ProtocolVcContext OPTIONAL,
IN NDIS_HANDLE ProtocolPartyContext OPTIONAL,
IN PNDIS_REQUEST NdisRequest);
-typedef NDIS_STATUS DDKAPI
-(*CO_REQUEST_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *CO_REQUEST_HANDLER)(
IN NDIS_HANDLE ProtocolAfContext,
IN NDIS_HANDLE ProtocolVcContext OPTIONAL,
IN NDIS_HANDLE ProtocolPartyContext OPTIONAL,
@@ -1200,81 +1200,81 @@ typedef VOID (*CL_OPEN_AF_COMPLETE_HANDLER)(
IN NDIS_HANDLE ProtocolAfContext,
IN NDIS_HANDLE NdisAfHandle);
-typedef VOID DDKAPI
-(*CL_CLOSE_AF_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CL_CLOSE_AF_COMPLETE_HANDLER)(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolAfContext);
-typedef VOID DDKAPI
-(*CL_REG_SAP_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CL_REG_SAP_COMPLETE_HANDLER)(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolSapContext,
IN PCO_SAP Sap,
IN NDIS_HANDLE NdisSapHandle);
-typedef VOID DDKAPI
-(*CL_DEREG_SAP_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CL_DEREG_SAP_COMPLETE_HANDLER)(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolSapContext);
-typedef VOID DDKAPI
-(*CL_MAKE_CALL_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CL_MAKE_CALL_COMPLETE_HANDLER)(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolVcContext,
IN NDIS_HANDLE NdisPartyHandle OPTIONAL,
IN PCO_CALL_PARAMETERS CallParameters);
-typedef VOID DDKAPI
-(*CL_MODIFY_CALL_QOS_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CL_MODIFY_CALL_QOS_COMPLETE_HANDLER)(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolVcContext,
IN PCO_CALL_PARAMETERS CallParameters);
-typedef VOID DDKAPI
-(*CL_CLOSE_CALL_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CL_CLOSE_CALL_COMPLETE_HANDLER)(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolVcContext,
IN NDIS_HANDLE ProtocolPartyContext OPTIONAL);
-typedef VOID DDKAPI
-(*CL_ADD_PARTY_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CL_ADD_PARTY_COMPLETE_HANDLER)(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolPartyContext,
IN NDIS_HANDLE NdisPartyHandle,
IN PCO_CALL_PARAMETERS CallParameters);
-typedef VOID DDKAPI
-(*CL_DROP_PARTY_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CL_DROP_PARTY_COMPLETE_HANDLER)(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolPartyContext);
-typedef NDIS_STATUS DDKAPI
-(*CL_INCOMING_CALL_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *CL_INCOMING_CALL_HANDLER)(
IN NDIS_HANDLE ProtocolSapContext,
IN NDIS_HANDLE ProtocolVcContext,
IN OUT PCO_CALL_PARAMETERS CallParameters);
-typedef VOID DDKAPI
-(*CL_INCOMING_CALL_QOS_CHANGE_HANDLER)(
+typedef VOID
+(DDKAPI *CL_INCOMING_CALL_QOS_CHANGE_HANDLER)(
IN NDIS_HANDLE ProtocolVcContext,
IN PCO_CALL_PARAMETERS CallParameters);
-typedef VOID DDKAPI
-(*CL_INCOMING_CLOSE_CALL_HANDLER)(
+typedef VOID
+(DDKAPI *CL_INCOMING_CLOSE_CALL_HANDLER)(
IN NDIS_STATUS CloseStatus,
IN NDIS_HANDLE ProtocolVcContext,
IN PVOID CloseData OPTIONAL,
IN UINT Size OPTIONAL);
-typedef VOID DDKAPI
-(*CL_INCOMING_DROP_PARTY_HANDLER)(
+typedef VOID
+(DDKAPI *CL_INCOMING_DROP_PARTY_HANDLER)(
IN NDIS_STATUS DropStatus,
IN NDIS_HANDLE ProtocolPartyContext,
IN PVOID CloseData OPTIONAL,
IN UINT Size OPTIONAL);
-typedef VOID DDKAPI
-(*CL_CALL_CONNECTED_HANDLER)(
+typedef VOID
+(DDKAPI *CL_CALL_CONNECTED_HANDLER)(
IN NDIS_HANDLE ProtocolVcContext);
@@ -1308,65 +1308,65 @@ typedef struct _NDIS_CLIENT_CHARACTERISTICS {
/* Prototypes for NDIS 3.0 protocol characteristics */
-typedef VOID DDKAPI
-(*OPEN_ADAPTER_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *OPEN_ADAPTER_COMPLETE_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status,
IN NDIS_STATUS OpenErrorStatus);
-typedef VOID DDKAPI
-(*CLOSE_ADAPTER_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CLOSE_ADAPTER_COMPLETE_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status);
-typedef VOID DDKAPI
-(*RESET_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *RESET_COMPLETE_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status);
-typedef VOID DDKAPI
-(*REQUEST_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *REQUEST_COMPLETE_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_REQUEST NdisRequest,
IN NDIS_STATUS Status);
-typedef VOID DDKAPI
-(*STATUS_HANDLER)(
+typedef VOID
+(DDKAPI *STATUS_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS GeneralStatus,
IN PVOID StatusBuffer,
IN UINT StatusBufferSize);
-typedef VOID DDKAPI
-(*STATUS_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *STATUS_COMPLETE_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext);
-typedef VOID DDKAPI
-(*SEND_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *SEND_COMPLETE_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status);
-typedef VOID DDKAPI
-(*WAN_SEND_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *WAN_SEND_COMPLETE_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_WAN_PACKET Packet,
IN NDIS_STATUS Status);
-typedef VOID DDKAPI
-(*TRANSFER_DATA_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *TRANSFER_DATA_COMPLETE_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status,
IN UINT BytesTransferred);
-typedef VOID DDKAPI
-(*WAN_TRANSFER_DATA_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *WAN_TRANSFER_DATA_COMPLETE_HANDLER)(
VOID);
-typedef NDIS_STATUS DDKAPI
-(*RECEIVE_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *RECEIVE_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE MacReceiveContext,
IN PVOID HeaderBuffer,
@@ -1375,14 +1375,14 @@ typedef NDIS_STATUS DDKAPI
IN UINT LookaheadBufferSize,
IN UINT PacketSize);
-typedef NDIS_STATUS DDKAPI
-(*WAN_RECEIVE_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *WAN_RECEIVE_HANDLER)(
IN NDIS_HANDLE NdisLinkHandle,
IN PUCHAR Packet,
IN ULONG PacketSize);
-typedef VOID DDKAPI
-(*RECEIVE_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *RECEIVE_COMPLETE_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext);
@@ -1424,32 +1424,32 @@ typedef struct _NDIS30_PROTOCOL_CHARACTERISTICS {
/* Prototypes for NDIS 4.0 protocol characteristics */
-typedef INT DDKAPI
-(*RECEIVE_PACKET_HANDLER)(
+typedef INT
+(DDKAPI *RECEIVE_PACKET_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet);
-typedef VOID DDKAPI
-(*BIND_HANDLER)(
+typedef VOID
+(DDKAPI *BIND_HANDLER)(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE BindContext,
IN PNDIS_STRING DeviceName,
IN PVOID SystemSpecific1,
IN PVOID SystemSpecific2);
-typedef VOID DDKAPI
-(*UNBIND_HANDLER)(
+typedef VOID
+(DDKAPI *UNBIND_HANDLER)(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE UnbindContext);
-typedef NDIS_STATUS DDKAPI
-(*PNP_EVENT_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *PNP_EVENT_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNET_PNP_EVENT NetPnPEvent);
-typedef VOID DDKAPI
-(*UNLOAD_PROTOCOL_HANDLER)(
+typedef VOID
+(DDKAPI *UNLOAD_PROTOCOL_HANDLER)(
VOID);
@@ -1483,28 +1483,28 @@ typedef struct _NDIS40_PROTOCOL_CHARACTERISTICS {
/* Prototypes for NDIS 5.0 protocol characteristics */
-typedef VOID DDKAPI
-(*CO_SEND_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *CO_SEND_COMPLETE_HANDLER)(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolVcContext,
IN PNDIS_PACKET Packet);
-typedef VOID DDKAPI
-(*CO_STATUS_HANDLER)(
+typedef VOID
+(DDKAPI *CO_STATUS_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE ProtocolVcContext OPTIONAL,
IN NDIS_STATUS GeneralStatus,
IN PVOID StatusBuffer,
IN UINT StatusBufferSize);
-typedef UINT DDKAPI
-(*CO_RECEIVE_PACKET_HANDLER)(
+typedef UINT
+(DDKAPI *CO_RECEIVE_PACKET_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE ProtocolVcContext,
IN PNDIS_PACKET Packet);
-typedef VOID DDKAPI
-(*CO_AF_REGISTER_NOTIFY_HANDLER)(
+typedef VOID
+(DDKAPI *CO_AF_REGISTER_NOTIFY_HANDLER)(
IN NDIS_HANDLE ProtocolBindingContext,
IN PCO_ADDRESS_FAMILY AddressFamily);
@@ -1536,11 +1536,11 @@ typedef struct _NDIS50_PROTOCOL_CHARACTERISTICS {
#if defined(NDIS50) || defined(NDIS51)
typedef struct _NDIS_PROTOCOL_CHARACTERISTICS {
- NDIS50_PROTOCOL_CHARACTERISTICS_S;
+ NDIS50_PROTOCOL_CHARACTERISTICS_S
} NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS;
#elif defined(NDIS40)
typedef struct _NDIS_PROTOCOL_CHARACTERISTICS {
- NDIS40_PROTOCOL_CHARACTERISTICS_S;
+ NDIS40_PROTOCOL_CHARACTERISTICS_S
} NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS;
#else /* NDIS30 */
typedef struct _NDIS_PROTOCOL_CHARACTERISTICS {
@@ -2020,9 +2020,12 @@ NdisQueryPacket(
* OUT PNDIS_BUFFER *FirstBuffer OPTIONAL,
* OUT PUINT TotalPacketLength OPTIONAL);
*/
-#define NdisQueryPacketLength(Packet, \
- TotalPacketLength) \
-{ \
+static __inline
+VOID
+NdisQueryPacketLength(
+ IN PNDIS_PACKET Packet,
+ OUT PUINT TotalPacketLength OPTIONAL)
+{
if (!(Packet)->Private.ValidCounts) \
NdisQueryPacket(Packet, NULL, NULL, NULL, TotalPacketLength); \
else \
@@ -2042,7 +2045,7 @@ NdisQueryPacket(
{ \
while (_Buffer->Next != NULL) \
{ \
- _Buffer = _Buffer->Next; \
+ _Buffer = _Buffer->Next; \
} \
(Packet)->Private.Tail = _Buffer; \
} \
@@ -2425,8 +2428,8 @@ NdisUpdateSharedMemory(
#define NdisZeroMemory(Destination, Length) \
RtlZeroMemory(Destination, Length)
-typedef VOID DDKAPI
-(*NDIS_BLOCK_INITIALIZER) (
+typedef VOID
+(DDKAPI *NDIS_BLOCK_INITIALIZER) (
IN PUCHAR Block,
IN SIZE_T NumberOfBytes
);
@@ -3619,28 +3622,28 @@ NdisQueryBufferSafe(
/* Prototypes for NDIS_MINIPORT_CHARACTERISTICS */
-typedef BOOLEAN DDKAPI
-(*W_CHECK_FOR_HANG_HANDLER)(
+typedef BOOLEAN
+(DDKAPI *W_CHECK_FOR_HANG_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext);
-typedef VOID DDKAPI
-(*W_DISABLE_INTERRUPT_HANDLER)(
+typedef VOID
+(DDKAPI *W_DISABLE_INTERRUPT_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext);
-typedef VOID DDKAPI
-(*W_ENABLE_INTERRUPT_HANDLER)(
+typedef VOID
+(DDKAPI *W_ENABLE_INTERRUPT_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext);
-typedef VOID DDKAPI
-(*W_HALT_HANDLER)(
+typedef VOID
+(DDKAPI *W_HALT_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext);
-typedef VOID DDKAPI
-(*W_HANDLE_INTERRUPT_HANDLER)(
+typedef VOID
+(DDKAPI *W_HANDLE_INTERRUPT_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext);
-typedef NDIS_STATUS DDKAPI
-(*W_INITIALIZE_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *W_INITIALIZE_HANDLER)(
OUT PNDIS_STATUS OpenErrorStatus,
OUT PUINT SelectedMediumIndex,
IN PNDIS_MEDIUM MediumArray,
@@ -3648,14 +3651,14 @@ typedef NDIS_STATUS DDKAPI
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_HANDLE WrapperConfigurationContext);
-typedef VOID DDKAPI
-(*W_ISR_HANDLER)(
+typedef VOID
+(DDKAPI *W_ISR_HANDLER)(
OUT PBOOLEAN InterruptRecognized,
OUT PBOOLEAN QueueMiniportHandleInterrupt,
IN NDIS_HANDLE MiniportAdapterContext);
-typedef NDIS_STATUS DDKAPI
-(*W_QUERY_INFORMATION_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *W_QUERY_INFORMATION_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
@@ -3663,31 +3666,31 @@ typedef NDIS_STATUS DDKAPI
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded);
-typedef NDIS_STATUS DDKAPI
-(*W_RECONFIGURE_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *W_RECONFIGURE_HANDLER)(
OUT PNDIS_STATUS OpenErrorStatus,
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_HANDLE WrapperConfigurationContext);
-typedef NDIS_STATUS DDKAPI
-(*W_RESET_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *W_RESET_HANDLER)(
OUT PBOOLEAN AddressingReset,
IN NDIS_HANDLE MiniportAdapterContext);
-typedef NDIS_STATUS DDKAPI
-(*W_SEND_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *W_SEND_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext,
IN PNDIS_PACKET Packet,
IN UINT Flags);
-typedef NDIS_STATUS DDKAPI
-(*WM_SEND_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *WM_SEND_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_HANDLE NdisLinkHandle,
IN PNDIS_WAN_PACKET Packet);
-typedef NDIS_STATUS DDKAPI
-(*W_SET_INFORMATION_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *W_SET_INFORMATION_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
@@ -3695,8 +3698,8 @@ typedef NDIS_STATUS DDKAPI
OUT PULONG BytesRead,
OUT PULONG BytesNeeded);
-typedef NDIS_STATUS DDKAPI
-(*W_TRANSFER_DATA_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *W_TRANSFER_DATA_HANDLER)(
OUT PNDIS_PACKET Packet,
OUT PUINT BytesTransferred,
IN NDIS_HANDLE MiniportAdapterContext,
@@ -3704,8 +3707,8 @@ typedef NDIS_STATUS DDKAPI
IN UINT ByteOffset,
IN UINT BytesToTransfer);
-typedef NDIS_STATUS DDKAPI
-(*WM_TRANSFER_DATA_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *WM_TRANSFER_DATA_HANDLER)(
VOID);
@@ -3736,19 +3739,19 @@ typedef struct _NDIS30_MINIPORT_CHARACTERISTICS {
/* Extensions for NDIS 4.0 miniports */
-typedef VOID DDKAPI
-(*W_SEND_PACKETS_HANDLER)(
+typedef VOID
+(DDKAPI *W_SEND_PACKETS_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext,
IN PPNDIS_PACKET PacketArray,
IN UINT NumberOfPackets);
-typedef VOID DDKAPI
-(*W_RETURN_PACKET_HANDLER)(
+typedef VOID
+(DDKAPI *W_RETURN_PACKET_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext,
IN PNDIS_PACKET Packet);
-typedef VOID DDKAPI
-(*W_ALLOCATE_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *W_ALLOCATE_COMPLETE_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext,
IN PVOID VirtualAddress,
IN PNDIS_PHYSICAL_ADDRESS PhysicalAddress,
@@ -3780,33 +3783,33 @@ typedef struct _NDIS40_MINIPORT_CHARACTERISTICS {
/* Extensions for NDIS 5.0 miniports */
-typedef NDIS_STATUS DDKAPI
-(*W_CO_CREATE_VC_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *W_CO_CREATE_VC_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_HANDLE NdisVcHandle,
OUT PNDIS_HANDLE MiniportVcContext);
-typedef NDIS_STATUS DDKAPI
-(*W_CO_DELETE_VC_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *W_CO_DELETE_VC_HANDLER)(
IN NDIS_HANDLE MiniportVcContext);
-typedef NDIS_STATUS DDKAPI
-(*W_CO_ACTIVATE_VC_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *W_CO_ACTIVATE_VC_HANDLER)(
IN NDIS_HANDLE MiniportVcContext,
IN OUT PCO_CALL_PARAMETERS CallParameters);
-typedef NDIS_STATUS DDKAPI
-(*W_CO_DEACTIVATE_VC_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *W_CO_DEACTIVATE_VC_HANDLER)(
IN NDIS_HANDLE MiniportVcContext);
-typedef VOID DDKAPI
-(*W_CO_SEND_PACKETS_HANDLER)(
+typedef VOID
+(DDKAPI *W_CO_SEND_PACKETS_HANDLER)(
IN NDIS_HANDLE MiniportVcContext,
IN PPNDIS_PACKET PacketArray,
IN UINT NumberOfPackets);
-typedef NDIS_STATUS DDKAPI
-(*W_CO_REQUEST_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *W_CO_REQUEST_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_HANDLE MiniportVcContext OPTIONAL,
IN OUT PNDIS_REQUEST NdisRequest);
@@ -3842,20 +3845,20 @@ typedef struct _NDIS50_MINIPORT_CHARACTERISTICS {
/* Extensions for NDIS 5.1 miniports */
-typedef VOID DDKAPI
-(*W_CANCEL_SEND_PACKETS_HANDLER)(
+typedef VOID
+(DDKAPI *W_CANCEL_SEND_PACKETS_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext,
IN PVOID CancelId);
-typedef VOID DDKAPI
-(*W_PNP_EVENT_NOTIFY_HANDLER)(
+typedef VOID
+(DDKAPI *W_PNP_EVENT_NOTIFY_HANDLER)(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_DEVICE_PNP_EVENT PnPEvent,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength);
-typedef VOID DDKAPI
-(*W_MINIPORT_SHUTDOWN_HANDLER)(
+typedef VOID
+(DDKAPI *W_MINIPORT_SHUTDOWN_HANDLER)(
IN PVOID ShutdownContext);
#ifdef __cplusplus
@@ -3899,13 +3902,13 @@ typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
#endif
-typedef NDIS_STATUS DDKAPI
-(*SEND_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *SEND_HANDLER)(
IN NDIS_HANDLE MacBindingHandle,
IN PNDIS_PACKET Packet);
-typedef NDIS_STATUS DDKAPI
-(*TRANSFER_DATA_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *TRANSFER_DATA_HANDLER)(
IN NDIS_HANDLE MacBindingHandle,
IN NDIS_HANDLE MacReceiveContext,
IN UINT ByteOffset,
@@ -3913,12 +3916,12 @@ typedef NDIS_STATUS DDKAPI
OUT PNDIS_PACKET Packet,
OUT PUINT BytesTransferred);
-typedef NDIS_STATUS DDKAPI
-(*RESET_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *RESET_HANDLER)(
IN NDIS_HANDLE MacBindingHandle);
-typedef NDIS_STATUS DDKAPI
-(*REQUEST_HANDLER)(
+typedef NDIS_STATUS
+(DDKAPI *REQUEST_HANDLER)(
IN NDIS_HANDLE MacBindingHandle,
IN PNDIS_REQUEST NdisRequest);
@@ -3926,12 +3929,12 @@ typedef NDIS_STATUS DDKAPI
/* Structures available only to full MAC drivers */
-typedef BOOLEAN DDKAPI
-(*PNDIS_INTERRUPT_SERVICE)(
+typedef BOOLEAN
+(DDKAPI *PNDIS_INTERRUPT_SERVICE)(
IN PVOID InterruptContext);
-typedef VOID DDKAPI
-(*PNDIS_DEFERRED_PROCESSING)(
+typedef VOID
+(DDKAPI *PNDIS_DEFERRED_PROCESSING)(
IN PVOID SystemSpecific1,
IN PVOID InterruptContext,
IN PVOID SystemSpecific2,
@@ -4024,12 +4027,12 @@ typedef struct _NDIS_BIND_PATHS {
} NDIS_BIND_PATHS, *PNDIS_BIND_PATHS;
-typedef VOID DDKAPI
-(*ETH_RCV_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *ETH_RCV_COMPLETE_HANDLER)(
IN PETH_FILTER Filter);
-typedef VOID DDKAPI
-(*ETH_RCV_INDICATE_HANDLER)(
+typedef VOID
+(DDKAPI *ETH_RCV_INDICATE_HANDLER)(
IN PETH_FILTER Filter,
IN NDIS_HANDLE MacReceiveContext,
IN PCHAR Address,
@@ -4039,12 +4042,12 @@ typedef VOID DDKAPI
IN UINT LookaheadBufferSize,
IN UINT PacketSize);
-typedef VOID DDKAPI
-(*FDDI_RCV_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *FDDI_RCV_COMPLETE_HANDLER)(
IN PFDDI_FILTER Filter);
-typedef VOID DDKAPI
-(*FDDI_RCV_INDICATE_HANDLER)(
+typedef VOID
+(DDKAPI *FDDI_RCV_INDICATE_HANDLER)(
IN PFDDI_FILTER Filter,
IN NDIS_HANDLE MacReceiveContext,
IN PCHAR Address,
@@ -4055,18 +4058,18 @@ typedef VOID DDKAPI
IN UINT LookaheadBufferSize,
IN UINT PacketSize);
-typedef VOID DDKAPI
-(*FILTER_PACKET_INDICATION_HANDLER)(
+typedef VOID
+(DDKAPI *FILTER_PACKET_INDICATION_HANDLER)(
IN NDIS_HANDLE Miniport,
IN PPNDIS_PACKET PacketArray,
IN UINT NumberOfPackets);
-typedef VOID DDKAPI
-(*TR_RCV_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *TR_RCV_COMPLETE_HANDLER)(
IN PTR_FILTER Filter);
-typedef VOID DDKAPI
-(*TR_RCV_INDICATE_HANDLER)(
+typedef VOID
+(DDKAPI *TR_RCV_INDICATE_HANDLER)(
IN PTR_FILTER Filter,
IN NDIS_HANDLE MacReceiveContext,
IN PVOID HeaderBuffer,
@@ -4075,75 +4078,75 @@ typedef VOID DDKAPI
IN UINT LookaheadBufferSize,
IN UINT PacketSize);
-typedef VOID DDKAPI
-(*WAN_RCV_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *WAN_RCV_COMPLETE_HANDLER)(
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE NdisLinkContext);
-typedef VOID DDKAPI
-(*WAN_RCV_HANDLER)(
+typedef VOID
+(DDKAPI *WAN_RCV_HANDLER)(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE NdisLinkContext,
IN PUCHAR Packet,
IN ULONG PacketSize);
-typedef VOID FASTCALL
-(*NDIS_M_DEQUEUE_WORK_ITEM)(
+typedef VOID
+(FASTCALL *NDIS_M_DEQUEUE_WORK_ITEM)(
IN PNDIS_MINIPORT_BLOCK Miniport,
IN NDIS_WORK_ITEM_TYPE WorkItemType,
OUT PVOID *WorkItemContext);
-typedef NDIS_STATUS FASTCALL
-(*NDIS_M_QUEUE_NEW_WORK_ITEM)(
+typedef NDIS_STATUS
+(FASTCALL *NDIS_M_QUEUE_NEW_WORK_ITEM)(
IN PNDIS_MINIPORT_BLOCK Miniport,
IN NDIS_WORK_ITEM_TYPE WorkItemType,
IN PVOID WorkItemContext);
-typedef NDIS_STATUS FASTCALL
-(*NDIS_M_QUEUE_WORK_ITEM)(
+typedef NDIS_STATUS
+(FASTCALL *NDIS_M_QUEUE_WORK_ITEM)(
IN PNDIS_MINIPORT_BLOCK Miniport,
IN NDIS_WORK_ITEM_TYPE WorkItemType,
IN PVOID WorkItemContext);
-typedef VOID DDKAPI
-(*NDIS_M_REQ_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *NDIS_M_REQ_COMPLETE_HANDLER)(
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_STATUS Status);
-typedef VOID DDKAPI
-(*NDIS_M_RESET_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *NDIS_M_RESET_COMPLETE_HANDLER)(
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_STATUS Status,
IN BOOLEAN AddressingReset);
-typedef VOID DDKAPI
-(*NDIS_M_SEND_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *NDIS_M_SEND_COMPLETE_HANDLER)(
IN NDIS_HANDLE MiniportAdapterHandle,
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status);
-typedef VOID DDKAPI
-(*NDIS_M_SEND_RESOURCES_HANDLER)(
+typedef VOID
+(DDKAPI *NDIS_M_SEND_RESOURCES_HANDLER)(
IN NDIS_HANDLE MiniportAdapterHandle);
-typedef BOOLEAN FASTCALL
-(*NDIS_M_START_SENDS)(
+typedef BOOLEAN
+(FASTCALL *NDIS_M_START_SENDS)(
IN PNDIS_MINIPORT_BLOCK Miniport);
-typedef VOID DDKAPI
-(*NDIS_M_STATUS_HANDLER)(
+typedef VOID
+(DDKAPI *NDIS_M_STATUS_HANDLER)(
IN NDIS_HANDLE MiniportHandle,
IN NDIS_STATUS GeneralStatus,
IN PVOID StatusBuffer,
IN UINT StatusBufferSize);
-typedef VOID DDKAPI
-(*NDIS_M_STS_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *NDIS_M_STS_COMPLETE_HANDLER)(
IN NDIS_HANDLE MiniportAdapterHandle);
-typedef VOID DDKAPI
-(*NDIS_M_TD_COMPLETE_HANDLER)(
+typedef VOID
+(DDKAPI *NDIS_M_TD_COMPLETE_HANDLER)(
IN NDIS_HANDLE MiniportAdapterHandle,
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status,
diff --git a/reactos/include/ddk/ntdd8042.h b/reactos/include/ddk/ntdd8042.h
index 916d32254b7..0527ef42462 100644
--- a/reactos/include/ddk/ntdd8042.h
+++ b/reactos/include/ddk/ntdd8042.h
@@ -133,38 +133,38 @@ typedef struct _INTERNAL_I8042_START_INFORMATION {
ULONG Reserved[8];
} INTERNAL_I8042_START_INFORMATION, *PINTERNAL_I8042_START_INFORMATION;
-typedef VOID DDKAPI
-(*PI8042_ISR_WRITE_PORT)(
+typedef VOID
+(DDKAPI *PI8042_ISR_WRITE_PORT)(
IN PVOID Context,
IN UCHAR Value);
-typedef VOID DDKAPI
-(*PI8042_QUEUE_PACKET)(
+typedef VOID
+(DDKAPI *PI8042_QUEUE_PACKET)(
IN PVOID Context);
-typedef NTSTATUS DDKAPI
-(*PI8042_SYNCH_READ_PORT) (
+typedef NTSTATUS
+(DDKAPI *PI8042_SYNCH_READ_PORT) (
IN PVOID Context,
OUT PUCHAR Value,
IN BOOLEAN WaitForACK);
-typedef NTSTATUS DDKAPI
-(*PI8042_SYNCH_WRITE_PORT)(
+typedef NTSTATUS
+(DDKAPI *PI8042_SYNCH_WRITE_PORT)(
IN PVOID Context,
IN UCHAR Value,
IN BOOLEAN WaitForACK);
-typedef NTSTATUS DDKAPI
-(*PI8042_KEYBOARD_INITIALIZATION_ROUTINE)(
+typedef NTSTATUS
+(DDKAPI *PI8042_KEYBOARD_INITIALIZATION_ROUTINE)(
IN PVOID InitializationContext,
IN PVOID SynchFuncContext,
IN PI8042_SYNCH_READ_PORT ReadPort,
IN PI8042_SYNCH_WRITE_PORT WritePort,
OUT PBOOLEAN TurnTranslationOn);
-typedef BOOLEAN DDKAPI
-(*PI8042_KEYBOARD_ISR)(
+typedef BOOLEAN
+(DDKAPI *PI8042_KEYBOARD_ISR)(
PVOID IsrContext,
PKEYBOARD_INPUT_DATA CurrentInput,
POUTPUT_PACKET CurrentOutput,
@@ -182,8 +182,8 @@ typedef struct _INTERNAL_I8042_HOOK_KEYBOARD {
IN PVOID CallContext;
} INTERNAL_I8042_HOOK_KEYBOARD, *PINTERNAL_I8042_HOOK_KEYBOARD;
-typedef BOOLEAN DDKAPI
-(*PI8042_MOUSE_ISR)(
+typedef BOOLEAN
+(DDKAPI *PI8042_MOUSE_ISR)(
PVOID IsrContext,
PMOUSE_INPUT_DATA CurrentInput,
POUTPUT_PACKET CurrentOutput,
diff --git a/reactos/include/ddk/ntddser.h b/reactos/include/ddk/ntddser.h
index 4e0e14ae5ed..39493ed33ea 100644
--- a/reactos/include/ddk/ntddser.h
+++ b/reactos/include/ddk/ntddser.h
@@ -365,12 +365,12 @@ typedef struct _SERENUM_PORT_DESC {
USHORT Reserved[1];
} SERENUM_PORT_DESC, *PSERENUM_PORT_DESC;
-typedef UCHAR NTAPI
-(*PSERENUM_READPORT)(
+typedef UCHAR
+(NTAPI*PSERENUM_READPORT)(
PVOID SerPortAddress);
-typedef VOID NTAPI
-(*PSERENUM_WRITEPORT)(
+typedef VOID
+(NTAPI*PSERENUM_WRITEPORT)(
PVOID SerPortAddress,
UCHAR Value);
diff --git a/reactos/include/ddk/ntddvdeo.h b/reactos/include/ddk/ntddvdeo.h
index 94c4069985c..c4522343e34 100644
--- a/reactos/include/ddk/ntddvdeo.h
+++ b/reactos/include/ddk/ntddvdeo.h
@@ -426,6 +426,17 @@ typedef struct _VIDEO_HARDWARE_STATE {
#define VIDEO_DUALVIEW_PRIMARY 0x80000000
#define VIDEO_DUALVIEW_SECONDARY 0x40000000
+#ifndef _WINDDI_
+typedef struct _ENG_EVENT *PEVENT;
+#endif
+
+typedef struct _ENG_EVENT
+{
+ PVOID pKEvent;
+ ULONG fFlags;
+} ENG_EVENT, *PENG_EVENT;
+
+
#ifdef __cplusplus
}
#endif
diff --git a/reactos/include/ddk/ntdef.h b/reactos/include/ddk/ntdef.h
index 747997b7b69..24082bd10cf 100644
--- a/reactos/include/ddk/ntdef.h
+++ b/reactos/include/ddk/ntdef.h
@@ -155,20 +155,20 @@ typedef unsigned long POINTER_64; // FIXME! HACK!!!
//
// Returns the byte offset of the specified structure's member
//
-#ifndef FIELD_OFFSET
#ifndef __GNUC__
-#define FIELD_OFFSET(Type, Field) \
- ((LONG)(LONG_PTR) (&(((Type *) 0)->Field)))
+#define FIELD_OFFSET(Type, Field) ((LONG)(LONG_PTR)&(((Type*) 0)->Field))
#else
#define FIELD_OFFSET(Type, Field) __builtin_offsetof(Type, Field)
#endif
-#endif
//
// Returns the type's alignment
//
+#if defined(_MSC_VER) && (_MSC_VER >= 1300)
+#define TYPE_ALIGNMENT(t) __alignof(t)
+#else
#define TYPE_ALIGNMENT(t) FIELD_OFFSET( struct { char x; t test; }, test )
-
+#endif
//
// Calling Conventions
diff --git a/reactos/include/ddk/portcls.h b/reactos/include/ddk/portcls.h
index 2425b112ee4..9481dcf4532 100644
--- a/reactos/include/ddk/portcls.h
+++ b/reactos/include/ddk/portcls.h
@@ -138,9 +138,9 @@ extern "C"
#include
#undef NOBITMAP
+#include
#include
#include
-#include
#include
#ifdef __cplusplus
@@ -239,7 +239,7 @@ struct _PCPROPERTY_REQUEST;
typedef struct _PCPROPERTY_REQUEST PCPROPERTY_REQUEST, *PPCPROPERTY_REQUEST;
-typedef NTSTATUS (*PCPFNPROPERTY_HANDLER)(
+typedef NTSTATUS (NTAPI *PCPFNPROPERTY_HANDLER)(
IN PPCPROPERTY_REQUEST PropertyRequest);
typedef struct
@@ -281,7 +281,7 @@ struct _PCPROPERTY_REQUEST
struct _PCEVENT_REQUEST;
-typedef NTSTATUS (*PCPFNEVENT_HANDLER)(
+typedef NTSTATUS (NTAPI *PCPFNEVENT_HANDLER)(
IN struct _PCEVENT_REQUEST* EventRequest);
typedef struct _PCEVENT_ITEM
@@ -307,7 +307,7 @@ typedef struct _PCEVENT_REQUEST
struct _PCMETHOD_REQUEST;
-typedef NTSTATUS (*PCPFNMETHOD_HANDLER)(
+typedef NTSTATUS (NTAPI *PCPFNMETHOD_HANDLER)(
IN struct _PCMETHOD_REQUEST* MethodRequest);
typedef struct _PCMETHOD_ITEM
@@ -834,7 +834,7 @@ typedef enum
struct IInterruptSync;
-typedef NTSTATUS (*PINTERRUPTSYNCROUTINE)(
+typedef NTSTATUS (NTAPI *PINTERRUPTSYNCROUTINE)(
IN struct IInterruptSync* InterruptSync,
IN PVOID DynamicContext);
@@ -2048,7 +2048,7 @@ typedef IPortClsVersion *PPORTCLSVERSION;
PortCls API Functions
*/
-typedef NTSTATUS (*PCPFNSTARTDEVICE)(
+typedef NTSTATUS (NTAPI *PCPFNSTARTDEVICE)(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PRESOURCELIST ResourceList);
diff --git a/reactos/include/ddk/scsiwmi.h b/reactos/include/ddk/scsiwmi.h
index feff7251bbc..c599f48c01b 100644
--- a/reactos/include/ddk/scsiwmi.h
+++ b/reactos/include/ddk/scsiwmi.h
@@ -60,14 +60,14 @@ typedef struct _SCSIWMIGUIDREGINFO {
ULONG Flags;
} SCSIWMIGUIDREGINFO, *PSCSIWMIGUIDREGINFO;
-typedef UCHAR DDKAPI
-(*PSCSIWMI_QUERY_REGINFO)(
+typedef UCHAR
+(DDKAPI *PSCSIWMI_QUERY_REGINFO)(
IN PVOID DeviceContext,
IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
OUT PWCHAR *MofResourceName);
-typedef BOOLEAN DDKAPI
-(*PSCSIWMI_QUERY_DATABLOCK)(
+typedef BOOLEAN
+(DDKAPI *PSCSIWMI_QUERY_DATABLOCK)(
IN PVOID Context,
IN PSCSIWMI_REQUEST_CONTEXT DispatchContext,
IN ULONG GuidIndex,
@@ -77,8 +77,8 @@ typedef BOOLEAN DDKAPI
IN ULONG BufferAvail,
OUT PUCHAR Buffer);
-typedef BOOLEAN DDKAPI
-(*PSCSIWMI_SET_DATABLOCK)(
+typedef BOOLEAN
+(DDKAPI *PSCSIWMI_SET_DATABLOCK)(
IN PVOID DeviceContext,
IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
IN ULONG GuidIndex,
@@ -86,8 +86,8 @@ typedef BOOLEAN DDKAPI
IN ULONG BufferSize,
IN PUCHAR Buffer);
-typedef BOOLEAN DDKAPI
-(*PSCSIWMI_SET_DATAITEM)(
+typedef BOOLEAN
+(DDKAPI *PSCSIWMI_SET_DATAITEM)(
IN PVOID DeviceContext,
IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
IN ULONG GuidIndex,
@@ -96,8 +96,8 @@ typedef BOOLEAN DDKAPI
IN ULONG BufferSize,
IN PUCHAR Buffer);
-typedef BOOLEAN DDKAPI
-(*PSCSIWMI_EXECUTE_METHOD)(
+typedef BOOLEAN
+(DDKAPI *PSCSIWMI_EXECUTE_METHOD)(
IN PVOID DeviceContext,
IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
IN ULONG GuidIndex,
@@ -112,8 +112,8 @@ typedef enum _SCSIWMI_ENABLE_DISABLE_CONTROL {
ScsiWmiDataBlockControl
} SCSIWMI_ENABLE_DISABLE_CONTROL;
-typedef BOOLEAN DDKAPI
-(*PSCSIWMI_FUNCTION_CONTROL)(
+typedef BOOLEAN
+(DDKAPI *PSCSIWMI_FUNCTION_CONTROL)(
IN PVOID DeviceContext,
IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
IN ULONG GuidIndex,
diff --git a/reactos/include/ddk/srb.h b/reactos/include/ddk/srb.h
index 468cbb27cee..5ec20932100 100644
--- a/reactos/include/ddk/srb.h
+++ b/reactos/include/ddk/srb.h
@@ -300,14 +300,14 @@ typedef struct _SCSI_SUPPORTED_CONTROL_TYPE_LIST {
BOOLEAN SupportedTypeList[0];
} SCSI_SUPPORTED_CONTROL_TYPE_LIST, *PSCSI_SUPPORTED_CONTROL_TYPE_LIST;
-typedef SCSI_ADAPTER_CONTROL_STATUS DDKAPI
-(*PHW_ADAPTER_CONTROL)(
+typedef SCSI_ADAPTER_CONTROL_STATUS
+(DDKAPI *PHW_ADAPTER_CONTROL)(
IN PVOID DeviceExtension,
IN SCSI_ADAPTER_CONTROL_TYPE ControlType,
IN PVOID Parameters);
-typedef BOOLEAN DDKAPI
-(*PHW_ADAPTER_STATE)(
+typedef BOOLEAN
+(DDKAPI *PHW_ADAPTER_STATE)(
IN PVOID DeviceExtension,
IN PVOID Context,
IN BOOLEAN SaveState);
@@ -317,8 +317,8 @@ typedef BOOLEAN DDKAPI
#define SP_RETURN_ERROR 2
#define SP_RETURN_BAD_CONFIG 3
-typedef ULONG DDKAPI
-(*PHW_FIND_ADAPTER)(
+typedef ULONG
+(DDKAPI *PHW_FIND_ADAPTER)(
IN PVOID DeviceExtension,
IN PVOID HwContext,
IN PVOID BusInformation,
@@ -326,30 +326,30 @@ typedef ULONG DDKAPI
IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
OUT PBOOLEAN Again);
-typedef BOOLEAN DDKAPI
-(*PHW_INITIALIZE)(
+typedef BOOLEAN
+(DDKAPI *PHW_INITIALIZE)(
IN PVOID DeviceExtension);
-typedef BOOLEAN DDKAPI
-(*PHW_INTERRUPT)(
+typedef BOOLEAN
+(DDKAPI *PHW_INTERRUPT)(
IN PVOID DeviceExtension);
-typedef BOOLEAN DDKAPI
-(*PHW_RESET_BUS)(
+typedef BOOLEAN
+(DDKAPI *PHW_RESET_BUS)(
IN PVOID DeviceExtension,
IN ULONG PathId);
-typedef VOID DDKAPI
-(*PHW_DMA_STARTED)(
+typedef VOID
+(DDKAPI *PHW_DMA_STARTED)(
IN PVOID DeviceExtension);
-typedef BOOLEAN DDKAPI
-(*PHW_STARTIO)(
+typedef BOOLEAN
+(DDKAPI *PHW_STARTIO)(
IN PVOID DeviceExtension,
IN PSCSI_REQUEST_BLOCK Srb);
-typedef VOID DDKAPI
-(*PHW_TIMER)(
+typedef VOID
+(DDKAPI *PHW_TIMER)(
IN PVOID DeviceExtension);
typedef struct _HW_INITIALIZATION_DATA {
diff --git a/reactos/include/ddk/stdunk.h b/reactos/include/ddk/stdunk.h
index 11d48875367..b01ebb4f522 100644
--- a/reactos/include/ddk/stdunk.h
+++ b/reactos/include/ddk/stdunk.h
@@ -94,20 +94,20 @@ class CUnknown : public INonDelegatingUnknown
#else /* Not C++ - this is probably very buggy... */
-STDMETHODCALLTYPE
NTSTATUS
+STDMETHODCALLTYPE
Unknown_QueryInterface(
IUnknown* this,
IN REFIID refiid,
OUT PVOID* output);
-STDMETHODCALLTYPE
ULONG
+STDMETHODCALLTYPE
Unknown_AddRef(
IUnknown* unknown_this);
-STDMETHODCALLTYPE
ULONG
+STDMETHODCALLTYPE
Unknown_Release(
IUnknown* unknown_this);
diff --git a/reactos/include/ddk/strmini.h b/reactos/include/ddk/strmini.h
new file mode 100644
index 00000000000..1cf4cf1ee68
--- /dev/null
+++ b/reactos/include/ddk/strmini.h
@@ -0,0 +1,576 @@
+#ifndef _STREAM_H
+#define _STREAM_H
+
+#include
+#include
+
+#define STREAMAPI __stdcall
+#define STREAM_SYSTEM_TIME_MASK ((STREAM_SYSTEM_TIME)0x00000001FFFFFFFF)
+
+typedef enum
+{
+ DebugLevelFatal = 0,
+ DebugLevelError,
+ DebugLevelWarning,
+ DebugLevelInfo,
+ DebugLevelTrace,
+ DebugLevelVerbose,
+ DebugLevelMaximum
+}STREAM_DEBUG_LEVEL;
+
+
+#if DBG
+
+#define DebugPrint(x) StreamClassDebugPrint x
+#define DEBUG_BREAKPOINT() DbgBreakPoint()
+#define DEBUG_ASSERT(exp) \
+ if ( !(exp) ) { \
+ StreamClassDebugAssert( __FILE__, __LINE__, #exp, exp); \
+ }
+#else
+
+#define DebugPrint(x)
+#define DEBUG_BREAKPOINT()
+#define DEBUG_ASSERT(exp)
+
+#endif
+
+typedef PHYSICAL_ADDRESS STREAM_PHYSICAL_ADDRESS, *PSTREAM_PHYSICAL_ADDRESS;
+typedef unsigned __int64 STREAM_SYSTEM_TIME, *PSTREAM_SYSTEM_TIME;
+typedef unsigned __int64 STREAM_TIMESTAMP, *PSTREAM_TIMESTAMP;
+
+typedef enum
+{
+ TIME_GET_STREAM_TIME,
+ TIME_READ_ONBOARD_CLOCK,
+ TIME_SET_ONBOARD_CLOCK
+}TIME_FUNCTION;
+
+typedef struct _HW_TIME_CONTEXT
+{
+ struct _HW_DEVICE_EXTENSION *HwDeviceExtension;
+ struct _HW_STREAM_OBJECT *HwStreamObject;
+ TIME_FUNCTION Function;
+ ULONGLONG Time;
+ ULONGLONG SystemTime;
+}HW_TIME_CONTEXT, *PHW_TIME_CONTEXT;
+
+typedef struct _HW_EVENT_DESCRIPTOR
+{
+ BOOLEAN Enable;
+ PKSEVENT_ENTRY EventEntry;
+ PKSEVENTDATA EventData;
+ union
+ {
+ struct _HW_STREAM_OBJECT * StreamObject;
+ struct _HW_DEVICE_EXTENSION *DeviceExtension;
+ };
+ ULONG EnableEventSetIndex;
+ PVOID HwInstanceExtension;
+ ULONG Reserved;
+} HW_EVENT_DESCRIPTOR, *PHW_EVENT_DESCRIPTOR;
+
+struct _HW_STREAM_REQUEST_BLOCK;
+
+typedef VOID (STREAMAPI * PHW_RECEIVE_STREAM_DATA_SRB) (IN struct _HW_STREAM_REQUEST_BLOCK * SRB);
+typedef VOID (STREAMAPI * PHW_RECEIVE_STREAM_CONTROL_SRB) (IN struct _HW_STREAM_REQUEST_BLOCK * SRB);
+typedef NTSTATUS (STREAMAPI * PHW_EVENT_ROUTINE) (IN PHW_EVENT_DESCRIPTOR EventDescriptor);
+typedef VOID (STREAMAPI * PHW_CLOCK_FUNCTION) (IN PHW_TIME_CONTEXT HwTimeContext);
+
+typedef struct _HW_CLOCK_OBJECT
+{
+ PHW_CLOCK_FUNCTION HwClockFunction;
+ ULONG ClockSupportFlags;
+ ULONG Reserved[2];
+} HW_CLOCK_OBJECT, *PHW_CLOCK_OBJECT;
+
+#define CLOCK_SUPPORT_CAN_SET_ONBOARD_CLOCK 0x1
+#define CLOCK_SUPPORT_CAN_READ_ONBOARD_CLOCK 0x2
+#define CLOCK_SUPPORT_CAN_RETURN_STREAM_TIME 0x4
+
+typedef struct _HW_STREAM_OBJECT
+{
+ ULONG SizeOfThisPacket;
+ ULONG StreamNumber;
+ PVOID HwStreamExtension;
+ PHW_RECEIVE_STREAM_DATA_SRB ReceiveDataPacket;
+ PHW_RECEIVE_STREAM_CONTROL_SRB ReceiveControlPacket;
+ HW_CLOCK_OBJECT HwClockObject;
+ BOOLEAN Dma;
+ BOOLEAN Pio;
+ PVOID HwDeviceExtension;
+ ULONG StreamHeaderMediaSpecific;
+ ULONG StreamHeaderWorkspace;
+ BOOLEAN Allocator;
+ PHW_EVENT_ROUTINE HwEventRoutine;
+ ULONG Reserved[2];
+} HW_STREAM_OBJECT, *PHW_STREAM_OBJECT;
+
+typedef struct _HW_STREAM_HEADER
+{
+ ULONG NumberOfStreams;
+ ULONG SizeOfHwStreamInformation;
+ ULONG NumDevPropArrayEntries;
+ PKSPROPERTY_SET DevicePropertiesArray;
+ ULONG NumDevEventArrayEntries;
+ PKSEVENT_SET DeviceEventsArray;
+ PKSTOPOLOGY Topology;
+ PHW_EVENT_ROUTINE DeviceEventRoutine;
+ LONG NumDevMethodArrayEntries;
+ PKSMETHOD_SET DeviceMethodsArray;
+}HW_STREAM_HEADER, *PHW_STREAM_HEADER;
+
+typedef struct _HW_STREAM_INFORMATION
+{
+ ULONG NumberOfPossibleInstances;
+ KSPIN_DATAFLOW DataFlow;
+ BOOLEAN DataAccessible;
+ ULONG NumberOfFormatArrayEntries;
+ PKSDATAFORMAT* StreamFormatsArray;
+ PVOID ClassReserved[4];
+ ULONG NumStreamPropArrayEntries;
+ PKSPROPERTY_SET StreamPropertiesArray;
+ ULONG NumStreamEventArrayEntries;
+ PKSEVENT_SET StreamEventsArray;
+ GUID* Category;
+ GUID* Name;
+ ULONG MediumsCount;
+ const KSPIN_MEDIUM* Mediums;
+ BOOLEAN BridgeStream;
+ ULONG Reserved[2];
+}HW_STREAM_INFORMATION, *PHW_STREAM_INFORMATION;
+
+
+typedef struct _HW_STREAM_DESCRIPTOR
+{
+ HW_STREAM_HEADER StreamHeader;
+ HW_STREAM_INFORMATION StreamInfo;
+} HW_STREAM_DESCRIPTOR, *PHW_STREAM_DESCRIPTOR;
+
+typedef struct _STREAM_TIME_REFERENCE
+{
+ STREAM_TIMESTAMP CurrentOnboardClockValue;
+ LARGE_INTEGER OnboardClockFrequency;
+ LARGE_INTEGER CurrentSystemTime;
+ ULONG Reserved[2];
+}STREAM_TIME_REFERENCE, *PSTREAM_TIME_REFERENCE;
+
+typedef struct _STREAM_DATA_INTERSECT_INFO
+{
+ ULONG StreamNumber;
+ PKSDATARANGE DataRange;
+ PVOID DataFormatBuffer;
+ ULONG SizeOfDataFormatBuffer;
+
+}STREAM_DATA_INTERSECT_INFO, *PSTREAM_DATA_INTERSECT_INFO;
+
+typedef struct _STREAM_PROPERTY_DESCRIPTOR
+{
+ PKSPROPERTY Property;
+ ULONG PropertySetID;
+ PVOID PropertyInfo;
+ ULONG PropertyInputSize;
+ ULONG PropertyOutputSize;
+}STREAM_PROPERTY_DESCRIPTOR, *PSTREAM_PROPERTY_DESCRIPTOR;
+
+typedef struct _STREAM_METHOD_DESCRIPTOR
+{
+ ULONG MethodSetID;
+ PKSMETHOD Method;
+ PVOID MethodInfo;
+ LONG MethodInputSize;
+ LONG MethodOutputSize;
+} STREAM_METHOD_DESCRIPTOR, *PSTREAM_METHOD_DESCRIPTOR;
+
+#define STREAM_REQUEST_BLOCK_SIZE sizeof(STREAM_REQUEST_BLOCK)
+
+typedef enum _SRB_COMMAND
+{
+ SRB_READ_DATA,
+ SRB_WRITE_DATA,
+ SRB_GET_STREAM_STATE,
+ SRB_SET_STREAM_STATE,
+ SRB_SET_STREAM_PROPERTY,
+ SRB_GET_STREAM_PROPERTY,
+ SRB_OPEN_MASTER_CLOCK,
+
+ SRB_INDICATE_MASTER_CLOCK,
+ SRB_UNKNOWN_STREAM_COMMAND,
+ SRB_SET_STREAM_RATE,
+ SRB_PROPOSE_DATA_FORMAT,
+ SRB_CLOSE_MASTER_CLOCK,
+ SRB_PROPOSE_STREAM_RATE,
+ SRB_SET_DATA_FORMAT,
+ SRB_GET_DATA_FORMAT,
+ SRB_BEGIN_FLUSH,
+ SRB_END_FLUSH,
+
+ SRB_GET_STREAM_INFO = 0x100,
+ SRB_OPEN_STREAM,
+ SRB_CLOSE_STREAM,
+ SRB_OPEN_DEVICE_INSTANCE,
+ SRB_CLOSE_DEVICE_INSTANCE,
+ SRB_GET_DEVICE_PROPERTY,
+ SRB_SET_DEVICE_PROPERTY,
+ SRB_INITIALIZE_DEVICE,
+ SRB_CHANGE_POWER_STATE,
+ SRB_UNINITIALIZE_DEVICE,
+ SRB_UNKNOWN_DEVICE_COMMAND,
+ SRB_PAGING_OUT_DRIVER,
+ SRB_GET_DATA_INTERSECTION,
+ SRB_INITIALIZATION_COMPLETE,
+ SRB_SURPRISE_REMOVAL
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+ ,SRB_DEVICE_METHOD
+ ,SRB_STREAM_METHOD
+
+#if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1)
+
+ ,SRB_NOTIFY_IDLE_STATE
+
+#endif
+
+#endif
+
+}SRB_COMMAND;
+
+typedef struct
+{
+ PHYSICAL_ADDRESS PhysicalAddress;
+ ULONG Length;
+} KSSCATTER_GATHER, *PKSSCATTER_GATHER;
+
+
+typedef struct _HW_STREAM_REQUEST_BLOCK
+{
+ ULONG SizeOfThisPacket;
+ SRB_COMMAND Command;
+ NTSTATUS Status;
+ PHW_STREAM_OBJECT StreamObject;
+ PVOID HwDeviceExtension;
+ PVOID SRBExtension;
+
+ union _CommandData
+ {
+ PKSSTREAM_HEADER DataBufferArray;
+ PHW_STREAM_DESCRIPTOR StreamBuffer;
+ KSSTATE StreamState;
+ PSTREAM_TIME_REFERENCE TimeReference;
+ PSTREAM_PROPERTY_DESCRIPTOR PropertyInfo;
+ PKSDATAFORMAT OpenFormat;
+ struct _PORT_CONFIGURATION_INFORMATION *ConfigInfo;
+ HANDLE MasterClockHandle;
+ DEVICE_POWER_STATE DeviceState;
+ PSTREAM_DATA_INTERSECT_INFO IntersectInfo;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+ PVOID MethodInfo;
+ LONG FilterTypeIndex;
+#if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1)
+ BOOLEAN Idle;
+#endif
+#endif
+
+ }CommandData;
+
+ ULONG NumberOfBuffers;
+ ULONG TimeoutCounter;
+ ULONG TimeoutOriginal;
+ struct _HW_STREAM_REQUEST_BLOCK *NextSRB;
+
+ PIRP Irp;
+ ULONG Flags;
+ PVOID HwInstanceExtension;
+
+ union
+ {
+ ULONG NumberOfBytesToTransfer;
+ ULONG ActualBytesTransferred;
+ };
+
+ PKSSCATTER_GATHER ScatterGatherBuffer;
+ ULONG NumberOfPhysicalPages;
+ ULONG NumberOfScatterGatherElements;
+ ULONG Reserved[1];
+
+}HW_STREAM_REQUEST_BLOCK, *PHW_STREAM_REQUEST_BLOCK;
+
+#define SRB_HW_FLAGS_DATA_TRANSFER 0x01
+#define SRB_HW_FLAGS_STREAM_REQUEST 0x2
+
+typedef enum
+{
+ PerRequestExtension,
+ DmaBuffer,
+ SRBDataBuffer
+}STREAM_BUFFER_TYPE;
+
+typedef struct _ACCESS_RANGE
+{
+ STREAM_PHYSICAL_ADDRESS RangeStart;
+ ULONG RangeLength;
+ BOOLEAN RangeInMemory;
+ ULONG Reserved;
+}ACCESS_RANGE, *PACCESS_RANGE;
+
+typedef struct _PORT_CONFIGURATION_INFORMATION
+{
+ ULONG SizeOfThisPacket;
+ PVOID HwDeviceExtension;
+ PDEVICE_OBJECT ClassDeviceObject;
+ PDEVICE_OBJECT PhysicalDeviceObject;
+ ULONG SystemIoBusNumber;
+ INTERFACE_TYPE AdapterInterfaceType;
+ ULONG BusInterruptLevel;
+ ULONG BusInterruptVector;
+ KINTERRUPT_MODE InterruptMode;
+ ULONG DmaChannel;
+ ULONG NumberOfAccessRanges;
+ PACCESS_RANGE AccessRanges;
+ ULONG StreamDescriptorSize;
+ PIRP Irp;
+ PKINTERRUPT InterruptObject;
+ PADAPTER_OBJECT DmaAdapterObject;
+ PDEVICE_OBJECT RealPhysicalDeviceObject;
+ ULONG Reserved[1];
+}PORT_CONFIGURATION_INFORMATION, *PPORT_CONFIGURATION_INFORMATION;
+
+typedef VOID (STREAMAPI * PHW_RECEIVE_DEVICE_SRB) (IN PHW_STREAM_REQUEST_BLOCK SRB);
+typedef VOID (STREAMAPI * PHW_CANCEL_SRB) (IN PHW_STREAM_REQUEST_BLOCK SRB);
+typedef VOID (STREAMAPI * PHW_REQUEST_TIMEOUT_HANDLER) (IN PHW_STREAM_REQUEST_BLOCK SRB);
+typedef BOOLEAN (STREAMAPI * PHW_INTERRUPT) (IN PVOID DeviceExtension);
+typedef VOID (STREAMAPI * PHW_TIMER_ROUTINE) (IN PVOID Context);
+typedef VOID (STREAMAPI * PHW_PRIORITY_ROUTINE) (IN PVOID Context);
+typedef VOID (STREAMAPI * PHW_QUERY_CLOCK_ROUTINE) (IN PHW_TIME_CONTEXT TimeContext);
+typedef BOOLEAN (STREAMAPI * PHW_RESET_ADAPTER) (IN PVOID DeviceExtension);
+
+typedef enum _STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE
+{
+ ReadyForNextStreamDataRequest,
+ ReadyForNextStreamControlRequest,
+ HardwareStarved,
+ StreamRequestComplete,
+ SignalMultipleStreamEvents,
+ SignalStreamEvent,
+ DeleteStreamEvent,
+ StreamNotificationMaximum
+}STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE, *PSTREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE;
+
+typedef enum _STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE
+{
+ ReadyForNextDeviceRequest,
+ DeviceRequestComplete,
+ SignalMultipleDeviceEvents,
+ SignalDeviceEvent,
+ DeleteDeviceEvent,
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+ SignalMultipleDeviceInstanceEvents,
+#endif
+ DeviceNotificationMaximum
+} STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE, *PSTREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE;
+
+#define STREAM_CLASS_VERSION_20 0x0200
+
+typedef struct _HW_INITIALIZATION_DATA {
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+ union
+ {
+ ULONG HwInitializationDataSize;
+ struct
+ {
+ USHORT SizeOfThisPacket;
+ USHORT StreamClassVersion;
+ };
+ };
+#else
+ ULONG HwInitializationDataSize;
+#endif
+
+ PHW_INTERRUPT HwInterrupt;
+ PHW_RECEIVE_DEVICE_SRB HwReceivePacket;
+ PHW_CANCEL_SRB HwCancelPacket;
+ PHW_REQUEST_TIMEOUT_HANDLER HwRequestTimeoutHandler;
+ ULONG DeviceExtensionSize;
+ ULONG PerRequestExtensionSize;
+ ULONG PerStreamExtensionSize;
+ ULONG FilterInstanceExtensionSize;
+ BOOLEAN BusMasterDMA;
+ BOOLEAN Dma24BitAddresses;
+ ULONG BufferAlignment;
+ BOOLEAN TurnOffSynchronization;
+ ULONG DmaBufferSize;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+ ULONG NumNameExtensions;
+ PWCHAR *NameExtensionArray;
+#else
+ ULONG Reserved[2];
+#endif
+} HW_INITIALIZATION_DATA, *PHW_INITIALIZATION_DATA;
+
+typedef enum _STREAM_PRIORITY
+{
+ High,
+ Dispatch,
+ Low,
+ LowToHigh
+}STREAM_PRIORITY, *PSTREAM_PRIORITY;
+
+
+VOID
+StreamClassAbortOutstandingRequests(
+ IN PVOID HwDeviceExtension,
+ IN PHW_STREAM_OBJECT HwStreamObject,
+ IN NTSTATUS Status
+);
+
+VOID
+STREAMAPI
+StreamClassCallAtNewPriority(
+ IN PHW_STREAM_OBJECT StreamObject,
+ IN PVOID HwDeviceExtension,
+ IN STREAM_PRIORITY Priority,
+ IN PHW_PRIORITY_ROUTINE PriorityRoutine,
+ IN PVOID Context
+ );
+
+VOID
+STREAMAPI
+StreamClassCompleteRequestAndMarkQueueReady(
+ IN PHW_STREAM_REQUEST_BLOCK Srb
+);
+
+VOID
+STREAMAPI
+StreamClassDebugAssert(
+ IN PCHAR File,
+ IN ULONG Line,
+ IN PCHAR AssertText,
+ IN ULONG AssertValue
+);
+
+VOID
+__cdecl
+StreamClassDebugPrint(
+ IN STREAM_DEBUG_LEVEL DebugPrintLevel,
+ IN PCCHAR DebugMessage,
+ ...
+);
+
+VOID
+__cdecl
+StreamClassDeviceNotification(
+ IN STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE NotificationType,
+ IN PVOID HwDeviceExtension,
+ IN PHW_STREAM_REQUEST_BLOCK pSrb,
+ IN PKSEVENT_ENTRY EventEntry,
+ IN GUID *EventSet,
+ IN ULONG EventId
+);
+
+VOID
+STREAMAPI
+StreamClassFilterReenumerateStreams(
+ IN PVOID HwInstanceExtension,
+ IN ULONG StreamDescriptorSize
+);
+
+PVOID
+STREAMAPI
+StreamClassGetDmaBuffer(
+ IN PVOID HwDeviceExtension
+);
+
+
+PKSEVENT_ENTRY
+StreamClassGetNextEvent(
+ IN PVOID HwInstanceExtension_OR_HwDeviceExtension,
+ IN PHW_STREAM_OBJECT HwStreamObject,
+ IN GUID * EventGuid,
+ IN ULONG EventItem,
+ IN PKSEVENT_ENTRY CurrentEvent
+);
+
+STREAM_PHYSICAL_ADDRESS
+STREAMAPI
+StreamClassGetPhysicalAddress(
+ IN PVOID HwDeviceExtension,
+ IN PHW_STREAM_REQUEST_BLOCK HwSRB,
+ IN PVOID VirtualAddress,
+ IN STREAM_BUFFER_TYPE Type,
+ IN ULONG * Length
+);
+
+VOID
+StreamClassQueryMasterClock(
+ IN PHW_STREAM_OBJECT HwStreamObject,
+ IN HANDLE MasterClockHandle,
+ IN TIME_FUNCTION TimeFunction,
+ IN PHW_QUERY_CLOCK_ROUTINE ClockCallbackRoutine
+);
+
+VOID
+STREAMAPI
+StreamClassQueryMasterClockSync(
+ IN HANDLE MasterClockHandle,
+ IN PHW_TIME_CONTEXT TimeContext
+);
+
+BOOLEAN
+STREAMAPI
+StreamClassReadWriteConfig(
+ IN PVOID HwDeviceExtension,
+ IN BOOLEAN Read,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length
+);
+
+VOID
+STREAMAPI
+StreamClassReenumerateStreams(
+ IN PVOID HwDeviceExtension,
+ IN ULONG StreamDescriptorSize
+);
+
+NTSTATUS
+STREAMAPI
+StreamClassRegisterAdapter(
+ IN PVOID Argument1,
+ IN PVOID Argument2,
+ IN PHW_INITIALIZATION_DATA HwInitializationData
+);
+
+#define StreamClassRegisterMinidriver StreamClassRegisterAdapter
+
+NTSTATUS
+StreamClassRegisterFilterWithNoKSPins(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN const GUID * InterfaceClassGUID,
+ IN ULONG PinCount,
+ IN BOOLEAN * PinDirection,
+ IN KSPIN_MEDIUM * MediumList,
+ IN GUID * CategoryList
+);
+
+VOID
+STREAMAPI
+StreamClassScheduleTimer(
+ IN PHW_STREAM_OBJECT StreamObject,
+ IN PVOID HwDeviceExtension,
+ IN ULONG NumberOfMicroseconds,
+ IN PHW_TIMER_ROUTINE TimerRoutine,
+ IN PVOID Context
+);
+
+VOID
+__cdecl
+StreamClassStreamNotification(
+ IN STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE NotificationType,
+ IN PHW_STREAM_OBJECT StreamObject,
+ IN ...
+);
+
+#endif
diff --git a/reactos/include/ddk/tdikrnl.h b/reactos/include/ddk/tdikrnl.h
index 2c366f6d2d7..6d7128da18a 100644
--- a/reactos/include/ddk/tdikrnl.h
+++ b/reactos/include/ddk/tdikrnl.h
@@ -156,8 +156,8 @@ typedef struct _TDI_REQUEST_KERNEL_SET_INFO {
#define TDI_EVENT_CHAINED_RECEIVE_EXPEDITED 9
#define TDI_EVENT_ERROR_EX 10
-typedef NTSTATUS DDKAPI
-(*PTDI_IND_CONNECT)(
+typedef NTSTATUS
+(DDKAPI *PTDI_IND_CONNECT)(
IN PVOID TdiEventContext,
IN LONG RemoteAddressLength,
IN PVOID RemoteAddress,
@@ -182,8 +182,8 @@ TdiDefaultConnectHandler(
OUT CONNECTION_CONTEXT *ConnectionContext,
OUT PIRP *AcceptIrp);
-typedef NTSTATUS DDKAPI
-(*PTDI_IND_DISCONNECT)(
+typedef NTSTATUS
+(DDKAPI *PTDI_IND_DISCONNECT)(
IN PVOID TdiEventContext,
IN CONNECTION_CONTEXT ConnectionContext,
IN LONG DisconnectDataLength,
@@ -204,13 +204,13 @@ TdiDefaultDisconnectHandler(
IN PVOID DisconnectInformation,
IN ULONG DisconnectFlags);
-typedef NTSTATUS DDKAPI
-(*PTDI_IND_ERROR)(
+typedef NTSTATUS
+(DDKAPI *PTDI_IND_ERROR)(
IN PVOID TdiEventContext,
IN NTSTATUS Status);
-typedef NTSTATUS DDKAPI
-(*PTDI_IND_ERROR_EX)(
+typedef NTSTATUS
+(DDKAPI *PTDI_IND_ERROR_EX)(
IN PVOID TdiEventContext,
IN NTSTATUS Status,
IN PVOID Buffer);
@@ -222,8 +222,8 @@ TdiDefaultErrorHandler(
IN PVOID TdiEventContext,
IN NTSTATUS Status);
-typedef NTSTATUS DDKAPI
-(*PTDI_IND_RECEIVE)(
+typedef NTSTATUS
+(DDKAPI *PTDI_IND_RECEIVE)(
IN PVOID TdiEventContext,
IN CONNECTION_CONTEXT ConnectionContext,
IN ULONG ReceiveFlags,
@@ -246,8 +246,8 @@ TdiDefaultReceiveHandler(
IN PVOID Tsdu,
OUT PIRP *IoRequestPacket);
-typedef NTSTATUS DDKAPI
-(*PTDI_IND_RECEIVE_DATAGRAM)(
+typedef NTSTATUS
+(DDKAPI *PTDI_IND_RECEIVE_DATAGRAM)(
IN PVOID TdiEventContext,
IN LONG SourceAddressLength,
IN PVOID SourceAddress,
@@ -275,8 +275,8 @@ TdiDefaultRcvDatagramHandler(
IN PVOID Tsdu,
OUT PIRP *IoRequestPacket);
-typedef NTSTATUS DDKAPI
-(*PTDI_IND_RECEIVE_EXPEDITED)(
+typedef NTSTATUS
+(DDKAPI *PTDI_IND_RECEIVE_EXPEDITED)(
IN PVOID TdiEventContext,
IN CONNECTION_CONTEXT ConnectionContext,
IN ULONG ReceiveFlags,
@@ -299,8 +299,8 @@ TdiDefaultRcvExpeditedHandler(
IN PVOID Tsdu,
OUT PIRP *IoRequestPacket);
-typedef NTSTATUS DDKAPI
-(*PTDI_IND_CHAINED_RECEIVE)(
+typedef NTSTATUS
+(DDKAPI *PTDI_IND_CHAINED_RECEIVE)(
IN PVOID TdiEventContext,
IN CONNECTION_CONTEXT ConnectionContext,
IN ULONG ReceiveFlags,
@@ -321,8 +321,8 @@ TdiDefaultChainedReceiveHandler(
IN PMDL Tsdu,
IN PVOID TsduDescriptor);
-typedef NTSTATUS DDKAPI
-(*PTDI_IND_CHAINED_RECEIVE_DATAGRAM)(
+typedef NTSTATUS
+(DDKAPI *PTDI_IND_CHAINED_RECEIVE_DATAGRAM)(
IN PVOID TdiEventContext,
IN LONG SourceAddressLength,
IN PVOID SourceAddress,
@@ -349,8 +349,8 @@ TdiDefaultChainedRcvDatagramHandler(
IN PMDL Tsdu,
IN PVOID TsduDescriptor);
-typedef NTSTATUS DDKAPI
-(*PTDI_IND_CHAINED_RECEIVE_EXPEDITED)(
+typedef NTSTATUS
+(DDKAPI *PTDI_IND_CHAINED_RECEIVE_EXPEDITED)(
IN PVOID TdiEventContext,
IN CONNECTION_CONTEXT ConnectionContext,
IN ULONG ReceiveFlags,
@@ -371,8 +371,8 @@ TdiDefaultChainedRcvExpeditedHandler(
IN PMDL Tsdu,
IN PVOID TsduDescriptor);
-typedef NTSTATUS DDKAPI
-(*PTDI_IND_SEND_POSSIBLE)(
+typedef NTSTATUS
+(DDKAPI *PTDI_IND_SEND_POSSIBLE)(
IN PVOID TdiEventContext,
IN PVOID ConnectionContext,
IN ULONG BytesAvailable);
@@ -866,49 +866,49 @@ typedef struct _TDI_PNP_CONTEXT {
UCHAR ContextData[1];
} TDI_PNP_CONTEXT, *PTDI_PNP_CONTEXT;
-typedef VOID DDKAPI
-(*TDI_ADD_ADDRESS_HANDLER)(
+typedef VOID
+(DDKAPI *TDI_ADD_ADDRESS_HANDLER)(
IN PTA_ADDRESS Address);
-typedef VOID DDKAPI
-(*TDI_ADD_ADDRESS_HANDLER_V2)(
+typedef VOID
+(DDKAPI *TDI_ADD_ADDRESS_HANDLER_V2)(
IN PTA_ADDRESS Address,
IN PUNICODE_STRING DeviceName,
IN PTDI_PNP_CONTEXT Context);
-typedef VOID DDKAPI
-(*TDI_BINDING_HANDLER)(
+typedef VOID
+(DDKAPI *TDI_BINDING_HANDLER)(
IN TDI_PNP_OPCODE PnPOpcode,
IN PUNICODE_STRING DeviceName,
IN PWSTR MultiSZBindList);
-typedef VOID DDKAPI
-(*TDI_BIND_HANDLER)(
+typedef VOID
+(DDKAPI *TDI_BIND_HANDLER)(
IN PUNICODE_STRING DeviceName);
-typedef VOID DDKAPI
-(*TDI_DEL_ADDRESS_HANDLER)(
+typedef VOID
+(DDKAPI *TDI_DEL_ADDRESS_HANDLER)(
IN PTA_ADDRESS Address);
-typedef VOID DDKAPI
-(*TDI_DEL_ADDRESS_HANDLER_V2)(
+typedef VOID
+(DDKAPI *TDI_DEL_ADDRESS_HANDLER_V2)(
IN PTA_ADDRESS Address,
IN PUNICODE_STRING DeviceName,
IN PTDI_PNP_CONTEXT Context);
-typedef NTSTATUS DDKAPI
-(*TDI_PNP_POWER_HANDLER)(
+typedef NTSTATUS
+(DDKAPI *TDI_PNP_POWER_HANDLER)(
IN PUNICODE_STRING DeviceName,
IN PNET_PNP_EVENT PowerEvent,
IN PTDI_PNP_CONTEXT Context1,
IN PTDI_PNP_CONTEXT Context2);
-typedef VOID DDKAPI
-(*TDI_UNBIND_HANDLER)(
+typedef VOID
+(DDKAPI *TDI_UNBIND_HANDLER)(
IN PUNICODE_STRING DeviceName);
-typedef VOID DDKAPI
-(*ProviderPnPPowerComplete)(
+typedef VOID
+(DDKAPI *ProviderPnPPowerComplete)(
IN PNET_PNP_EVENT NetEvent,
IN NTSTATUS ProviderStatus);
diff --git a/reactos/include/ddk/video.h b/reactos/include/ddk/video.h
index dc5fbb0ef50..71a8f9c45c3 100644
--- a/reactos/include/ddk/video.h
+++ b/reactos/include/ddk/video.h
@@ -44,7 +44,6 @@ extern "C" {
typedef LONG VP_STATUS;
typedef VP_STATUS *PVP_STATUS;
typedef struct __DMA_PARAMETERS * PDMA;
-typedef struct _VIDEO_PORT_EVENT *PEVENT;
typedef struct _VIDEO_PORT_SPIN_LOCK *PSPIN_LOCK;
typedef struct __VP_DMA_ADAPTER *PVP_DMA_ADAPTER;
@@ -144,15 +143,15 @@ typedef struct _VP_SCATTER_GATHER_LIST {
VP_SCATTER_GATHER_ELEMENT Elements[0];
} VP_SCATTER_GATHER_LIST, *PVP_SCATTER_GATHER_LIST;
-typedef VOID DDKAPI
-(*PEXECUTE_DMA)(
+typedef VOID
+(DDKAPI *PEXECUTE_DMA)(
IN PVOID HwDeviceExtension,
IN PVP_DMA_ADAPTER VpDmaAdapter,
IN PVP_SCATTER_GATHER_LIST SGList,
IN PVOID Context);
-typedef PVOID DDKAPI
-(*PVIDEO_PORT_GET_PROC_ADDRESS)(
+typedef PVOID
+(DDKAPI *PVIDEO_PORT_GET_PROC_ADDRESS)(
IN PVOID HwDeviceExtension,
IN PUCHAR FunctionName);
@@ -188,16 +187,16 @@ typedef struct _VIDEO_PORT_CONFIG_INFO {
ULONGLONG SystemMemorySize;
} VIDEO_PORT_CONFIG_INFO, *PVIDEO_PORT_CONFIG_INFO;
-typedef VP_STATUS DDKAPI
-(*PVIDEO_HW_FIND_ADAPTER)(
+typedef VP_STATUS
+(DDKAPI *PVIDEO_HW_FIND_ADAPTER)(
IN PVOID HwDeviceExtension,
IN PVOID HwContext,
IN PWSTR ArgumentString,
IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo,
OUT PUCHAR Again);
-typedef VP_STATUS DDKAPI
-(*PVIDEO_HW_POWER_GET)(
+typedef VP_STATUS
+(DDKAPI *PVIDEO_HW_POWER_GET)(
IN PVOID HwDeviceExtension,
IN ULONG HwId,
IN OUT PVIDEO_POWER_MANAGEMENT VideoPowerControl);
@@ -257,15 +256,15 @@ typedef struct _VIDEO_ACCESS_RANGE {
} VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE;
#endif
-typedef VOID DDKAPI
-(*PVIDEO_HW_LEGACYRESOURCES)(
+typedef VOID
+(DDKAPI *PVIDEO_HW_LEGACYRESOURCES)(
IN ULONG VendorId,
IN ULONG DeviceId,
IN OUT PVIDEO_ACCESS_RANGE *LegacyResourceList,
IN OUT PULONG LegacyResourceCount);
-typedef VP_STATUS DDKAPI
-(*PMINIPORT_QUERY_DEVICE_ROUTINE)(
+typedef VP_STATUS
+(DDKAPI *PMINIPORT_QUERY_DEVICE_ROUTINE)(
IN PVOID HwDeviceExtension,
IN PVOID Context,
IN VIDEO_DEVICE_DATA_TYPE DeviceDataType,
diff --git a/reactos/include/ddk/winddi.h b/reactos/include/ddk/winddi.h
index 38dd9510851..ceeb206dbb9 100644
--- a/reactos/include/ddk/winddi.h
+++ b/reactos/include/ddk/winddi.h
@@ -84,7 +84,9 @@ DECLARE_HANDLE(DHSURF);
DECLARE_HANDLE(DHPDEV);
DECLARE_HANDLE(HDRVOBJ);
+#ifndef __NTDDVDEO_H
typedef struct _ENG_EVENT *PEVENT;
+#endif
#define OPENGL_CMD 4352
#define OPENGL_GETINFO 4353
diff --git a/reactos/include/ddk/winddk.h b/reactos/include/ddk/winddk.h
index df3ca22299c..4769caea5b5 100644
--- a/reactos/include/ddk/winddk.h
+++ b/reactos/include/ddk/winddk.h
@@ -187,6 +187,7 @@ struct _COMPRESSED_DATA_INFO;
#if (_M_IX86)
#define KIP0PCRADDRESS 0xffdff000
+
#endif
#define KERNEL_STACK_SIZE 12288
@@ -5182,7 +5183,7 @@ extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
#define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
#define MM_SYSTEM_SPACE_END 0xFFFFFFFF
-
+
#elif defined(__x86_64__)
#define CONTEXT_AMD64 0x100000
@@ -5563,6 +5564,10 @@ KeGetCurrentProcessorNumber(VOID)
#error Unknown architecture
#endif
+#define MM_DONT_ZERO_ALLOCATION 0x00000001
+#define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
+
+
#define EFLAG_SIGN 0x8000
#define EFLAG_ZERO 0x4000
#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
@@ -5637,11 +5642,26 @@ KeTestSpinLock(
#if defined (_X86_)
+#if defined(WIN9X_COMPAT_SPINLOCK)
+
NTKERNELAPI
VOID
NTAPI
KeInitializeSpinLock(
- IN PKSPIN_LOCK SpinLock);
+ IN PKSPIN_LOCK SpinLock
+);
+
+#else
+
+FORCEINLINE
+VOID
+KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
+{
+ /* Clear the lock */
+ *SpinLock = 0;
+}
+
+#endif
NTHALAPI
KIRQL
@@ -5673,8 +5693,50 @@ KefReleaseSpinLockFromDpcLevel(
#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
-#else // !defined (_X86_)
-
+#define KeGetDcacheFillSize() 1L
+
+#elif defined(_M_ARM) // !defined (_X86_)
+
+ NTHALAPI
+ KIRQL
+ FASTCALL
+ KfAcquireSpinLock(
+ IN PKSPIN_LOCK SpinLock);
+
+ NTHALAPI
+ VOID
+ FASTCALL
+ KfReleaseSpinLock(
+ IN PKSPIN_LOCK SpinLock,
+ IN KIRQL NewIrql);
+
+
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ KefAcquireSpinLockAtDpcLevel(
+ IN PKSPIN_LOCK SpinLock);
+
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ KefReleaseSpinLockFromDpcLevel(
+ IN PKSPIN_LOCK SpinLock);
+
+
+#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
+#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
+#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
+#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
+
+ NTKERNELAPI
+ VOID
+ NTAPI
+ KeInitializeSpinLock(
+ IN PKSPIN_LOCK SpinLock);
+
+#else
+
FORCEINLINE
VOID
NTAPI
@@ -5707,13 +5769,9 @@ KeAcquireSpinLockRaiseToDpc(
#define KeAcquireSpinLock(SpinLock, OldIrql) \
*(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
-
+
#endif // !defined (_X86_)
-#define KeGetDcacheFillSize() 1L
-
-
-
/*
** Utillity functions
*/
@@ -10220,6 +10278,7 @@ DbgPrint(
IN PCCH Format,
IN ...);
+NTSYSAPI
ULONG
DDKCDECLAPI
DbgPrintEx(
@@ -10690,6 +10749,13 @@ Exfi386InterlockedExchangeUlong(
#define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
#endif /* _X86_ */
+
+#ifdef _M_ARM
+//
+// NT-ARM is not documented
+//
+#include
+#endif
#ifdef __cplusplus
}
diff --git a/reactos/include/host/typedefs.h b/reactos/include/host/typedefs.h
index 193ec7a3dd6..a1feea86362 100644
--- a/reactos/include/host/typedefs.h
+++ b/reactos/include/host/typedefs.h
@@ -219,9 +219,9 @@ typedef const UNICODE_STRING *PCUNICODE_STRING;
#define NT_SUCCESS(x) ((x)>=0)
#if !defined(__GNUC__)
-#define FIELD_OFFSET(t,f) ((LONG_PTR)&(((t*)0)->f))
+#define FIELD_OFFSET(t,f) ((LONG)(LONG_PTR)&(((t*) 0)->f))
#else
-#define FIELD_OFFSET(t,f) __builtin_offsetof(t,f)
+#define FIELD_OFFSET(t,f) ((LONG)__builtin_offsetof(t,f))
#endif
#define RTL_CONSTANT_STRING(s) { sizeof(s)-sizeof((s)[0]), sizeof(s), s }
#define CONTAINING_RECORD(address, type, field) ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
diff --git a/reactos/include/ndk/arm/mmtypes.h b/reactos/include/ndk/arm/mmtypes.h
index 255d89921f1..98755647fc6 100644
--- a/reactos/include/ndk/arm/mmtypes.h
+++ b/reactos/include/ndk/arm/mmtypes.h
@@ -26,7 +26,9 @@ Author:
//
// Page-related Macros
//
+#ifndef PAGE_SIZE
#define PAGE_SIZE 0x1000
+#endif
#define PAGE_SHIFT 12L
#define MM_ALLOCATION_GRANULARITY 0x10000
#define MM_ALLOCATION_GRANULARITY_SHIFT 16L
@@ -183,7 +185,7 @@ typedef struct _MMPTE_LIST
ULONG filler1:1;
} MMPTE_LIST;
-typedef struct _MMPTE_HARDWARE
+typedef struct _MMPDE_HARDWARE // FIXFIX: Find a way to make this more portable
{
union
{
@@ -191,81 +193,50 @@ typedef struct _MMPTE_HARDWARE
{
struct
{
- ULONG Type:2;
- ULONG Unused:30;
- } Fault;
- struct
- {
- ULONG Type:2;
- ULONG Ignored:2;
- ULONG Reserved:1;
+ ULONG Valid:1;
+ ULONG Section:1;
+ ULONG Sbz:3;
ULONG Domain:4;
- ULONG Ignored1:1;
- ULONG BaseAddress:22;
+ ULONG EccEnabled:1;
+ ULONG PageFrameNumber:22;
} Coarse;
struct
{
- ULONG Type:2;
+ ULONG Coarse:1;
+ ULONG Valid:1;
ULONG Buffered:1;
ULONG Cached:1;
ULONG Reserved:1;
ULONG Domain:4;
- ULONG Ignored:1;
+ ULONG EccEnabled:1;
ULONG Access:2;
- ULONG Ignored1:8;
- ULONG BaseAddress:12;
+ ULONG ExtendedAccess:3;
+ ULONG Sbz:3;
+ ULONG SuperSection:1;
+ ULONG Sbz1:1;
+ ULONG PageFrameNumber:12;
} Section;
- struct
- {
- ULONG Type:2;
- ULONG Reserved:3;
- ULONG Domain:4;
- ULONG Ignored:3;
- ULONG BaseAddress:20;
- } Fine;
- } L1;
- union
- {
- struct
- {
- ULONG Type:2;
- ULONG Unused:30;
- } Fault;
- struct
- {
- ULONG Type:2;
- ULONG Buffered:1;
- ULONG Cached:1;
- ULONG Access0:2;
- ULONG Access1:2;
- ULONG Access2:2;
- ULONG Access3:2;
- ULONG Ignored:4;
- ULONG BaseAddress:16;
- } Large;
- struct
- {
- ULONG Type:2;
- ULONG Buffered:1;
- ULONG Cached:1;
- ULONG Access0:2;
- ULONG Access1:2;
- ULONG Access2:2;
- ULONG Access3:2;
- ULONG BaseAddress:20;
- } Small;
- struct
- {
- ULONG Type:2;
- ULONG Buffered:1;
- ULONG Cached:1;
- ULONG Access0:2;
- ULONG Ignored:4;
- ULONG BaseAddress:22;
- } Tiny;
- } L2;
- ULONG AsUlong;
+ ULONG AsUlong;
+ } Hard;
+ } u;
+} MMPDE_HARDWARE, *PMMPDE_HARDWARE;
+
+typedef union _MMPTE_HARDWARE
+{
+ struct
+ {
+ ULONG ExecuteNever:1;
+ ULONG Valid:1;
+ ULONG Buffered:1;
+ ULONG Cached:1;
+ ULONG Access:2;
+ ULONG TypeExtension:3;
+ ULONG ExtendedAccess:1;
+ ULONG Shared:1;
+ ULONG NonGlobal:1;
+ ULONG PageFrameNumber:20;
};
+ ULONG AsUlong;
} MMPTE_HARDWARE, *PMMPTE_HARDWARE;
//
diff --git a/reactos/include/ndk/dbgkfuncs.h b/reactos/include/ndk/dbgkfuncs.h
index a00efca82cd..6301eaabd66 100644
--- a/reactos/include/ndk/dbgkfuncs.h
+++ b/reactos/include/ndk/dbgkfuncs.h
@@ -43,7 +43,7 @@ NtCreateDebugObject(
OUT PHANDLE DebugHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
- IN BOOLEAN KillProcessOnExit
+ IN ULONG Flags
);
NTSYSCALLAPI
@@ -99,7 +99,7 @@ ZwCreateDebugObject(
OUT PHANDLE DebugHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
- IN BOOLEAN KillProcessOnExit
+ IN ULONG Flags
);
NTSYSAPI
diff --git a/reactos/include/ndk/dbgktypes.h b/reactos/include/ndk/dbgktypes.h
index daf536bc12f..0be007dc67b 100644
--- a/reactos/include/ndk/dbgktypes.h
+++ b/reactos/include/ndk/dbgktypes.h
@@ -43,6 +43,12 @@ Author:
#define DEBUG_EVENT_PROTECT_FAILED (0x10)
#define DEBUG_EVENT_SUSPEND (0x20)
+//
+// NtCreateDebugObject Flags
+//
+#define DBGK_KILL_PROCESS_ON_EXIT (0x1)
+#define DBGK_ALL_FLAGS (DBGK_KILL_PROCESS_ON_EXIT)
+
//
// Debug Object Information Classes for NtQueryDebugObject
//
diff --git a/reactos/include/ndk/ketypes.h b/reactos/include/ndk/ketypes.h
index d6aeca7332b..ddaa77b33cd 100644
--- a/reactos/include/ndk/ketypes.h
+++ b/reactos/include/ndk/ketypes.h
@@ -43,6 +43,16 @@ Author:
// Processor Architectures
//
#define PROCESSOR_ARCHITECTURE_INTEL 0
+#define PROCESSOR_ARCHITECTURE_MIPS 1
+#define PROCESSOR_ARCHITECTURE_ALPHA 2
+#define PROCESSOR_ARCHITECTURE_PPC 3
+#define PROCESSOR_ARCHITECTURE_SHX 4
+#define PROCESSOR_ARCHITECTURE_ARM 5
+#define PROCESSOR_ARCHITECTURE_IA64 6
+#define PROCESSOR_ARCHITECTURE_ALPHA64 7
+#define PROCESSOR_ARCHITECTURE_MSIL 8
+#define PROCESSOR_ARCHITECTURE_AMD64 9
+#define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
//
// Object Type Mask for Kernel Dispatcher Objects
diff --git a/reactos/include/ndk/pstypes.h b/reactos/include/ndk/pstypes.h
index 3abe1d1a27c..1e3f2f2ce81 100644
--- a/reactos/include/ndk/pstypes.h
+++ b/reactos/include/ndk/pstypes.h
@@ -1062,7 +1062,6 @@ typedef struct _PSP_RATE_APC
typedef struct _ETHREAD
{
KTHREAD Tcb;
- PVOID Padding;
LARGE_INTEGER CreateTime;
union
{
diff --git a/reactos/include/psdk/delayimp.h b/reactos/include/psdk/delayimp.h
new file mode 100644
index 00000000000..986ff444fb8
--- /dev/null
+++ b/reactos/include/psdk/delayimp.h
@@ -0,0 +1,88 @@
+#ifndef _delayimp_h
+#define _delayimp_h
+
+#ifdef __GNUC__
+/* Hack, for bug in ld. Will be removed soon. */
+#define __ImageBase _image_base__
+#endif
+
+#define DELAYLOAD_VERSION 0x200
+
+typedef DWORD RVA;
+typedef IMAGE_THUNK_DATA *PImgThunkData;
+typedef const IMAGE_THUNK_DATA *PCImgThunkData;
+
+enum DLAttr
+{
+ dlattrRva = 0x1,
+};
+
+/* Notification codes */
+enum
+{
+ dliStartProcessing,
+ dliNotePreLoadLibrary,
+ dliNotePreGetProcAddress,
+ dliFailLoadLib,
+ dliFailGetProc,
+ dliNoteEndProcessing,
+};
+
+typedef struct ImgDelayDescr
+{
+ DWORD grAttrs;
+ RVA rvaDLLName;
+ RVA rvaHmod;
+ RVA rvaIAT;
+ RVA rvaINT;
+ RVA rvaBoundIAT;
+ RVA rvaUnloadIAT;
+ DWORD dwTimeStamp;
+} ImgDelayDescr, *PImgDelayDescr;
+typedef const ImgDelayDescr *PCImgDelayDescr;
+
+typedef struct DelayLoadProc
+{
+ BOOL fImportByName;
+ union
+ {
+ LPCSTR szProcName;
+ DWORD dwOrdinal;
+ };
+} DelayLoadProc;
+
+typedef struct DelayLoadInfo
+{
+ DWORD cb;
+ PCImgDelayDescr pidd;
+ FARPROC *ppfn;
+ LPCSTR szDll;
+ DelayLoadProc dlp;
+ HMODULE hmodCur;
+ FARPROC pfnCur;
+ DWORD dwLastError;
+} DelayLoadInfo, *PDelayLoadInfo;
+
+typedef FARPROC (WINAPI *PfnDliHook)(unsigned, PDelayLoadInfo);
+
+static __inline__
+unsigned
+IndexFromPImgThunkData(PCImgThunkData pData, PCImgThunkData pBase)
+{
+ return pData - pBase;
+}
+
+extern const IMAGE_DOS_HEADER __ImageBase;
+
+static __inline__
+PVOID
+PFromRva(RVA rva)
+{
+ return (PVOID)(((ULONG_PTR)(rva)) + ((ULONG_PTR)&__ImageBase));
+}
+
+
+extern PfnDliHook __pfnDliNotifyHook2;
+extern PfnDliHook __pfnDliFailureHook2;
+
+#endif /* not _delayimp_h */
diff --git a/reactos/include/psdk/dlgs.h b/reactos/include/psdk/dlgs.h
index 302794c5f2d..3ce96f5ec27 100644
--- a/reactos/include/psdk/dlgs.h
+++ b/reactos/include/psdk/dlgs.h
@@ -16,6 +16,11 @@ extern "C" {
#define FORMATDLGORD30 1544
#define RUNDLGORD 1545
+#ifdef _WINE
+#define OFN_DONTADDTORECENT 0x02000000
+#define OFN_ENABLEINCLUDENOTIFY 0x00400000
+#endif
+
#if (WINVER >= 0x0400)
#define PAGESETUPDLGORD 1546
#define NEWFILEOPENORD 1547
diff --git a/reactos/include/psdk/ks.h b/reactos/include/psdk/ks.h
index d8b80a55c0a..ee61049ae6d 100644
--- a/reactos/include/psdk/ks.h
+++ b/reactos/include/psdk/ks.h
@@ -249,17 +249,6 @@ typedef KSIDENTIFIER KSDEGRADE, *PKSDEGRADE;
typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE;
typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM;
-#if !defined( _MSC_VER )
-typedef struct {
- ULONG FormatSize;
- ULONG Flags;
- ULONG SampleSize;
- ULONG Reserved;
- GUID MajorFormat;
- GUID SubFormat;
- GUID Specifier;
-} KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
-#else
typedef union {
struct {
ULONG FormatSize;
@@ -272,7 +261,7 @@ typedef union {
};
LONGLONG Alignment;
} KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
-#endif
+
typedef struct
{
@@ -553,8 +542,10 @@ typedef enum
Properties/Methods/Events
*/
-#define KSPROPSETID_StreamAllocator \
+#define STATIC_KSPROPSETID_StreamAllocator\
0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
+DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4", KSPROPSETID_StreamAllocator);
+#define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator)
typedef enum
{
@@ -1113,7 +1104,7 @@ typedef enum
#if defined(_NTDDK_)
/* MOVE ME */
-typedef NTSTATUS (*PFNKSCONTEXT_DISPATCH)(
+typedef NTSTATUS (NTAPI *PFNKSCONTEXT_DISPATCH)(
IN PVOID Context,
IN PIRP Irp);
#endif
@@ -1268,20 +1259,20 @@ typedef struct
#define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) (*(PKSATTRIBUTE_LIST*)&(Irp)->Tail.Overlay.DriverContext[2])
typedef
-VOID
-(*PFNREFERENCEDEVICEOBJECT)(
+VOID
+(NTAPI *PFNREFERENCEDEVICEOBJECT)(
IN PVOID Context
);
typedef
-VOID
-(*PFNDEREFERENCEDEVICEOBJECT)(
+VOID
+(NTAPI *PFNDEREFERENCEDEVICEOBJECT)(
IN PVOID Context
);
typedef
NTSTATUS
-(*PFNQUERYREFERENCESTRING)(
+(NTAPI *PFNQUERYREFERENCESTRING)(
IN PVOID Context,
IN OUT PWCHAR *String
);
@@ -1445,7 +1436,7 @@ typedef struct {
} KSPROPERTY_VALUES, *PKSPROPERTY_VALUES;
#if defined(_NTDDK_)
-typedef NTSTATUS (*PFNKSHANDLER)(
+typedef NTSTATUS (NTAPI *PFNKSHANDLER)(
IN PIRP Irp,
IN PKSIDENTIFIER Request,
IN OUT PVOID Data);
@@ -1474,7 +1465,7 @@ typedef struct
typedef
BOOLEAN
-(*PFNKSFASTHANDLER)(
+(NTAPI *PFNKSFASTHANDLER)(
IN PFILE_OBJECT FileObject,
IN PKSIDENTIFIER Request,
IN ULONG RequestLength,
@@ -1547,13 +1538,27 @@ typedef struct
typedef struct
{
- ULONG CountItems; // count of FramingItem-s below.
+ ULONG CountItems;
ULONG PinFlags;
KS_COMPRESSION OutputCompression;
- ULONG PinWeight; // this pin framing's Weight graph-wide
+ ULONG PinWeight;
KS_FRAMING_ITEM FramingItem[1];
} KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX;
+#define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER 0x00000001
+#define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY 0x00000002
+#define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY 0x00000004
+#define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE 0x00000008
+#define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY 0x80000000
+
+#define KSALLOCATOR_OPTIONF_COMPATIBLE 0x00000001
+#define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY 0x00000002
+#define KSALLOCATOR_OPTIONF_VALID 0x00000003
+
+#define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT 0x00000010
+#define KSALLOCATOR_FLAG_DEVICE_SPECIFIC 0x00000020
+#define KSALLOCATOR_FLAG_CAN_ALLOCATE 0x00000040
+#define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO 0x00000080
/* ===============================================================
Quality
@@ -1730,6 +1735,11 @@ typedef struct
Objects ??? SORT ME!
*/
+#define KSCREATE_ITEM_SECURITYCHANGED 0x1
+#define KSCREATE_ITEM_WILDCARD 0x2
+#define KSCREATE_ITEM_NOPARAMETERS 0x4
+#define KSCREATE_ITEM_FREEONSTOP 0x8
+
typedef struct
{
PDRIVER_DISPATCH Create;
@@ -1745,7 +1755,7 @@ typedef struct
PKSOBJECT_CREATE_ITEM CreateItemsList;
} KSOBJECT_CREATE, *PKSOBJECT_CREATE;
-typedef VOID (*PFNKSITEMFREECALLBACK)(
+typedef VOID (NTAPI *PFNKSITEMFREECALLBACK)(
IN PKSOBJECT_CREATE_ITEM CreateItem);
#endif
@@ -1857,14 +1867,14 @@ typedef struct
LONGLONG Interval;
} KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL;
-typedef NTSTATUS (*PFNKSADDEVENT)(
+typedef NTSTATUS (NTAPI *PFNKSADDEVENT)(
IN PIRP Irp,
IN PKSEVENTDATA EventData,
IN struct _KSEVENT_ENTRY* EventEntry);
typedef
VOID
-(*PFNKSREMOVEEVENT)(
+(NTAPI *PFNKSREMOVEEVENT)(
IN PFILE_OBJECT FileObject,
IN struct _KSEVENT_ENTRY* EventEntry
);
@@ -1917,28 +1927,69 @@ typedef struct _KSSTREAM_POINTER_OFFSET KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POIN
typedef struct _KSMAPPING KSMAPPING, *PKSMAPPING;
typedef struct _KSPROCESSPIN KSPROCESSPIN, *PKSPROCESSPIN;
+#define IOCTL_KS_HANDSHAKE CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+typedef struct {
+ GUID ProtocolId;
+ PVOID Argument1;
+ PVOID Argument2;
+} KSHANDSHAKE, *PKSHANDSHAKE;
+
typedef
NTSTATUS
-(*PFNKSPINIRP)(
+(NTAPI *PFNKSPINHANDSHAKE)(
+ IN PKSPIN Pin,
+ IN PKSHANDSHAKE In,
+ IN PKSHANDSHAKE Out
+ );
+
+typedef
+void
+(NTAPI *PFNKSPINPOWER)(
+ IN PKSPIN Pin,
+ IN DEVICE_POWER_STATE State
+ );
+
+typedef
+void
+(NTAPI *PFNKSPINFRAMERETURN)(
+ IN PKSPIN Pin,
+ IN PVOID Data OPTIONAL,
+ IN ULONG Size OPTIONAL,
+ IN PMDL Mdl OPTIONAL,
+ IN PVOID Context OPTIONAL,
+ IN NTSTATUS Status
+ );
+
+typedef
+void
+(NTAPI *PFNKSPINIRPCOMPLETION)(
IN PKSPIN Pin,
IN PIRP Irp
);
typedef
NTSTATUS
-(*PFNKSPIN)(
+(NTAPI *PFNKSPINIRP)(
+ IN PKSPIN Pin,
+ IN PIRP Irp
+ );
+
+typedef
+NTSTATUS
+(NTAPI *PFNKSPIN)(
IN PKSPIN Pin
);
typedef
void
-(*PFNKSPINVOID)(
+(NTAPI *PFNKSPINVOID)(
IN PKSPIN Pin
);
typedef
void
-(*PFNKSSTREAMPOINTER)(
+(NTAPI *PFNKSSTREAMPOINTER)(
IN PKSSTREAM_POINTER StreamPointer
);
@@ -1949,7 +2000,7 @@ typedef struct {
typedef
NTSTATUS
-(*PFNKSPINSETDATAFORMAT)(
+(NTAPI *PFNKSPINSETDATAFORMAT)(
IN PKSPIN Pin,
IN PKSDATAFORMAT OldFormat OPTIONAL,
IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL,
@@ -1959,7 +2010,7 @@ NTSTATUS
typedef
NTSTATUS
-(*PFNKSPINSETDEVICESTATE)(
+(NTAPI *PFNKSPINSETDEVICESTATE)(
IN PKSPIN Pin,
IN KSSTATE ToState,
IN KSSTATE FromState
@@ -1984,7 +2035,7 @@ typedef struct
typedef
BOOLEAN
-(*PFNKSPINSETTIMER)(
+(NTAPI *PFNKSPINSETTIMER)(
IN PKSPIN Pin,
IN PKTIMER Timer,
IN LARGE_INTEGER DueTime,
@@ -1993,7 +2044,7 @@ BOOLEAN
typedef
BOOLEAN
-(*PFNKSPINCANCELTIMER)(
+(NTAPI *PFNKSPINCANCELTIMER)(
IN PKSPIN Pin,
IN PKTIMER Timer
);
@@ -2007,7 +2058,7 @@ LONGLONG
typedef
void
-(*PFNKSPINRESOLUTION)(
+(NTAPI *PFNKSPINRESOLUTION)(
IN PKSPIN Pin,
OUT PKSRESOLUTION Resolution
);
@@ -2021,19 +2072,19 @@ struct _KSCLOCK_DISPATCH {
typedef
NTSTATUS
-(*PFNKSPININITIALIZEALLOCATOR)(
+(NTAPI *PFNKSPININITIALIZEALLOCATOR)(
IN PKSPIN Pin,
IN PKSALLOCATOR_FRAMING AllocatorFraming,
OUT PVOID* Context
);
-typedef PVOID (*PFNKSDELETEALLOCATOR)(
+typedef PVOID (NTAPI *PFNKSDELETEALLOCATOR)(
IN PVOID Context);
-typedef PVOID (*PFNKSDEFAULTALLOCATE)(
+typedef PVOID (NTAPI *PFNKSDEFAULTALLOCATE)(
IN PVOID Context);
-typedef PVOID (*PFNKSDEFAULTFREE)(
+typedef PVOID (NTAPI *PFNKSDEFAULTFREE)(
IN PVOID Context,
IN PVOID Buffer);
@@ -2085,7 +2136,7 @@ typedef struct
typedef
NTSTATUS
-(*PFNKSINTERSECTHANDLER)(
+(NTAPI *PFNKSINTERSECTHANDLER)(
IN PIRP Irp,
IN PKSP_PIN Pin,
IN PKSDATARANGE DataRange,
@@ -2094,7 +2145,7 @@ NTSTATUS
typedef
NTSTATUS
-(*PFNKSINTERSECTHANDLEREX)(
+(NTAPI *PFNKSINTERSECTHANDLEREX)(
IN PVOID Context,
IN PIRP Irp,
IN PKSP_PIN Pin,
@@ -2315,7 +2366,7 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\
typedef
void
-(*PFNKSFREE)(
+(NTAPI *PFNKSFREE)(
IN PVOID Data
);
@@ -2407,18 +2458,18 @@ DEFINE_KSPROPERTY_TABLE(TopologySet) {\
/* TODO */
typedef void* UNKNOWN;
-typedef PVOID (*PFNKSINITIALIZEALLOCATOR)(
+typedef PVOID (NTAPI *PFNKSINITIALIZEALLOCATOR)(
IN PVOID InitialContext,
IN PKSALLOCATOR_FRAMING AllocatorFraming,
OUT PVOID* Context);
#if defined(_NTDDK_)
-typedef NTSTATUS (*PFNKSALLOCATOR)(
+typedef NTSTATUS (NTAPI *PFNKSALLOCATOR)(
IN PIRP Irp,
IN ULONG BufferSize,
IN BOOLEAN InputOperation);
-typedef NTSTATUS (*PFNKINTERSECTHANDLEREX)(
+typedef NTSTATUS (NTAPI *PFNKINTERSECTHANDLEREX)(
IN PVOID Context,
IN PIRP Irp,
IN PKSP_PIN Pin,
@@ -2427,19 +2478,29 @@ typedef NTSTATUS (*PFNKINTERSECTHANDLEREX)(
IN ULONG DataBufferSize,
OUT PVOID Data OPTIONAL,
OUT PULONG DataSize);
+
+
+typedef
+NTSTATUS
+(NTAPI *PFNALLOCATOR_ALLOCATEFRAME)(
+ IN PFILE_OBJECT FileObject,
+ PVOID *Frame
+ );
+
+typedef
+VOID
+(NTAPI *PFNALLOCATOR_FREEFRAME)(
+ IN PFILE_OBJECT FileObject,
+ IN PVOID Frame
+ );
+
+typedef struct {
+ PFNALLOCATOR_ALLOCATEFRAME AllocateFrame;
+ PFNALLOCATOR_FREEFRAME FreeFrame;
+} KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
+
#endif
-typedef UNKNOWN PFNALLOCATORE_ALLOCATEFRAME;
-typedef UNKNOWN PFNALLOCATOR_FREEFRAME;
-
-/*
-typedef struct
-{
- PFNALLOCATOR_ALLOCATEFRAME AllocateFrame;
- PFNALLOCATOR_FREEFRAME FreeFrame;
-}
-*/
-
typedef struct
{
KSALLOCATOR_FRAMING Framing;
@@ -2479,6 +2540,19 @@ struct _KSMAPPING {
};
#endif
+typedef enum {
+ KSSTREAM_POINTER_STATE_UNLOCKED = 0,
+ KSSTREAM_POINTER_STATE_LOCKED
+} KSSTREAM_POINTER_STATE;
+
+typedef struct _KSGATE KSGATE, *PKSGATE;
+typedef struct _KSPROCESSPIN_INDEXENTRY KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
+
+struct _KSGATE {
+ LONG Count;
+ PKSGATE NextGate;
+};
+
struct _KSSTREAM_POINTER_OFFSET
{
#if defined(_NTDDK_)
@@ -2520,11 +2594,11 @@ struct _KSPROCESSPIN
BOOLEAN Terminate;
};
-typedef struct
+struct _KSPROCESSPIN_INDEXENTRY
{
PKSPROCESSPIN* Pins;
ULONG Count;
-} KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
+};
#endif
/* ===============================================================
@@ -2542,32 +2616,32 @@ typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
-typedef NTSTATUS (*PFNKSDEVICECREATE)(
+typedef NTSTATUS (NTAPI *PFNKSDEVICECREATE)(
IN PKSDEVICE Device);
-typedef NTSTATUS (*PFNKSDEVICEPNPSTART)(
+typedef NTSTATUS (NTAPI *PFNKSDEVICEPNPSTART)(
IN PKSDEVICE Device,
IN PIRP Irp,
IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL,
IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL);
-typedef NTSTATUS (*PFNKSDEVICE)(
+typedef NTSTATUS (NTAPI *PFNKSDEVICE)(
IN PKSDEVICE Device);
-typedef NTSTATUS (*PFNKSDEVICEIRP)(
+typedef NTSTATUS (NTAPI *PFNKSDEVICEIRP)(
IN PKSDEVICE Device,
IN PIRP Irp);
-typedef VOID (*PFNKSDEVICEIRPVOID)(
+typedef VOID (NTAPI *PFNKSDEVICEIRPVOID)(
IN PKSDEVICE Device,
IN PIRP Irp);
-typedef NTSTATUS (*PFNKSDEVICEQUERYCAPABILITIES)(
+typedef NTSTATUS (NTAPI *PFNKSDEVICEQUERYCAPABILITIES)(
IN PKSDEVICE Device,
IN PIRP Irp,
IN OUT PDEVICE_CAPABILITIES Capabilities);
-typedef NTSTATUS (*PFNKSDEVICEQUERYPOWER)(
+typedef NTSTATUS (NTAPI *PFNKSDEVICEQUERYPOWER)(
IN PKSDEVICE Device,
IN PIRP Irp,
IN DEVICE_POWER_STATE DeviceTo,
@@ -2576,7 +2650,7 @@ typedef NTSTATUS (*PFNKSDEVICEQUERYPOWER)(
IN SYSTEM_POWER_STATE SystemFrom,
IN POWER_ACTION Action);
-typedef VOID (*PFNKSDEVICESETPOWER)(
+typedef VOID (NTAPI *PFNKSDEVICESETPOWER)(
IN PKSDEVICE Device,
IN PIRP Irp,
IN DEVICE_POWER_STATE To,
@@ -2629,15 +2703,22 @@ struct _KSFILTER
PVOID Context;
};
-typedef NTSTATUS (*PFNKSFILTERIRP)(
+typedef
+void
+(NTAPI *PFNKSFILTERPOWER)(
+ IN PKSFILTER Filter,
+ IN DEVICE_POWER_STATE State
+ );
+
+typedef NTSTATUS (NTAPI *PFNKSFILTERIRP)(
IN PKSFILTER Filter,
IN PIRP Irp);
-typedef NTSTATUS (*PFNKSFILTERPROCESS)(
- IN PKSFILTER FIlter,
+typedef NTSTATUS (NTAPI *PFNKSFILTERPROCESS)(
+ IN PKSFILTER Filter,
IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex);
-typedef NTSTATUS (*PFNKSFILTERVOID)(
+typedef NTSTATUS (NTAPI *PFNKSFILTERVOID)(
IN PKSFILTER Filter);
struct _KSFILTER_DISPATCH
@@ -2677,9 +2758,11 @@ struct _KSFILTER_DESCRIPTOR
struct _KSDEVICE_DESCRIPTOR
{
- const KSDEVICE_DISPATCH* Dispatch;
- ULONG FilterDescriptorsCount;
- const KSFILTER_DESCRIPTOR*const* FilterDescriptors;
+ const KSDEVICE_DISPATCH* Dispatch;
+ ULONG FilterDescriptorsCount;
+ const KSFILTER_DESCRIPTOR*const* FilterDescriptors;
+ ULONG Version;
+ ULONG Flags;
};
struct _KSFILTERFACTORY {
@@ -2693,12 +2776,12 @@ struct _KSFILTERFACTORY {
Minidriver Callbacks
*/
#if defined(_NTDDK_)
-typedef NTSTATUS (*KStrMethodHandler)(
+typedef NTSTATUS (NTAPI *KStrMethodHandler)(
IN PIRP Irp,
IN PKSIDENTIFIER Request,
IN OUT PVOID Data);
-typedef NTSTATUS (*KStrSupportHandler)(
+typedef NTSTATUS (NTAPI *KStrSupportHandler)(
IN PIRP Irp,
IN PKSIDENTIFIER Request,
IN OUT PVOID Data);
@@ -2743,13 +2826,13 @@ KsValidateAllocatorFramingEx(
Clock Functions
*/
#if defined(_NTDDK_)
-typedef BOOLEAN (*PFNKSSETTIMER)(
+typedef BOOLEAN (NTAPI *PFNKSSETTIMER)(
IN PVOID Context,
IN PKTIMER Timer,
IN LARGE_INTEGER DueTime,
IN PKDPC Dpc);
-typedef BOOLEAN (*PFNKSCANCELTIMER)(
+typedef BOOLEAN (NTAPI *PFNKSCANCELTIMER)(
IN PVOID Context,
IN PKTIMER Timer);
@@ -2913,10 +2996,29 @@ KsFastPropertyHandler(
#define KSSTREAM_SYNCHRONOUS 0x00001000
#define KSSTREAM_FAILUREEXCEPTION 0x00002000
+typedef
+BOOLEAN
+(NTAPI *PFNKSGENERATEEVENTCALLBACK)(
+ IN PVOID Context,
+ IN PKSEVENT_ENTRY EventEntry
+ );
+
KSDDKAPI NTSTATUS NTAPI
KsGenerateEvent(
IN PKSEVENT_ENTRY EntryEvent);
+KSDDKAPI void NTAPI
+KsGenerateEvents(
+ IN PVOID Object,
+ IN const GUID* EventSet OPTIONAL,
+ IN ULONG EventId,
+ IN ULONG DataSize,
+ IN PVOID Data OPTIONAL,
+ IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
+ IN PVOID CallBackContext OPTIONAL
+ );
+
+
KSDDKAPI NTSTATUS NTAPI
KsEnableEventWithAllocator(
IN PIRP Irp,
@@ -3047,7 +3149,7 @@ KsHandleSizedListQuery(
IRP Helper Functions
*/
-typedef NTSTATUS (*PFNKSIRPLISTCALLBACK)(
+typedef NTSTATUS (NTAPI *PFNKSIRPLISTCALLBACK)(
IN PIRP Irp,
IN PVOID Context);
@@ -3468,7 +3570,19 @@ KsInitializeDriver(
typedef struct _KSFILTERFACTORY KSFILTERFACTORY, *PKSFILTERFACTORY; //FIXME
-typedef void (*PFNKSFILTERFACTORYPOWER)(
+
+
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsInitializeDevice (
+ IN PDEVICE_OBJECT FunctionalDeviceObject,
+ IN PDEVICE_OBJECT PhysicalDeviceObject,
+ IN PDEVICE_OBJECT NextDeviceObject,
+ IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL);
+
+
+typedef void (NTAPI *PFNKSFILTERFACTORYPOWER)(
IN PKSFILTERFACTORY FilterFactory,
IN DEVICE_POWER_STATE State);
@@ -3557,7 +3671,7 @@ KsCreateFilterFactory(
IN ULONG CreateItemFlags,
IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
- OUT PKSFILTERFACTORY FilterFactory OPTIONAL);
+ OUT PKSFILTERFACTORY *FilterFactory OPTIONAL);
KSDDKAPI
NTSTATUS
@@ -3567,6 +3681,23 @@ KsDefaultAddEventHandler(
IN PKSEVENTDATA EventData,
IN OUT PKSEVENT_ENTRY EventEntry);
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsDispatchQuerySecurity(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp
+ );
+
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsDispatchSetSecurity(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp
+ );
+
+
#define KsDeleteFilterFactory(FilterFactory) \
KsFreeObjectCreateItemsByContext( \
@@ -3608,9 +3739,9 @@ KsGetOuterUnknown(
IN PVOID Object
);
-
+static
+__inline
PUNKNOWN
-NTAPI
KsDeviceGetOuterUnknown(
IN PKSDEVICE Device)
{
@@ -3624,6 +3755,78 @@ KsDeviceRegisterAggregatedClientUnknown(
IN PKSDEVICE Device,
IN PUNKNOWN ClientUnknown);
+
+#endif
+
+#if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
+
+typedef interface IKsReferenceClock* PIKSREFERENCECLOCK;
+
+#undef INTERFACE
+#define INTERFACE IKsReferenceClock
+DECLARE_INTERFACE_(IKsReferenceClock,IUnknown)
+{
+ DEFINE_ABSTRACT_UNKNOWN() // For C
+
+ STDMETHOD_(LONGLONG,GetTime)(THIS
+ ) PURE;
+ STDMETHOD_(LONGLONG,GetPhysicalTime)(THIS
+ ) PURE;
+ STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_
+ OUT PLONGLONG SystemTime
+ ) PURE;
+ STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_
+ OUT PLONGLONG SystemTime
+ ) PURE;
+ STDMETHOD_(NTSTATUS, GetResolution)(THIS_
+ OUT PKSRESOLUTION Resolution
+ ) PURE;
+ STDMETHOD_(NTSTATUS, GetState)(THIS_
+ OUT PKSSTATE State
+ ) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE IKsControl
+
+DEFINE_GUID(IID_IKsControl, 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96);
+
+DECLARE_INTERFACE_(IKsControl,IUnknown)
+{
+ STDMETHOD_(NTSTATUS, QueryInterface)( THIS_
+ REFIID InterfaceId,
+ PVOID* Interface)PURE;
+
+ STDMETHOD_(ULONG, AddRef)(THIS) PURE;
+
+ STDMETHOD_(ULONG, Release)(THIS) PURE;
+
+ STDMETHOD_(NTSTATUS, KsProperty)(THIS_
+ IN PKSPROPERTY Property,
+ IN ULONG PropertyLength,
+ IN OUT PVOID PropertyData,
+ IN ULONG DataLength,
+ OUT ULONG* BytesReturned
+ ) PURE;
+ STDMETHOD_(NTSTATUS, KsMethod)(THIS_
+ IN PKSMETHOD Method,
+ IN ULONG MethodLength,
+ IN OUT PVOID MethodData,
+ IN ULONG DataLength,
+ OUT ULONG* BytesReturned
+ ) PURE;
+ STDMETHOD_(NTSTATUS, KsEvent)(THIS_
+ IN PKSEVENT Event OPTIONAL,
+ IN ULONG EventLength,
+ IN OUT PVOID EventData,
+ IN ULONG DataLength,
+ OUT ULONG* BytesReturned
+ ) PURE;
+};
+
+#undef INTERFACE
+typedef IKsControl* PIKSCONTROL;
+
#endif
KSDDKAPI
@@ -3667,7 +3870,7 @@ NTAPI
KsFilterAddTopologyConnections(
IN PKSFILTER Filter,
IN ULONG NewConnectionsCount,
- IN const KSTOPOLOGY_CONNECTION* NewTopologyConnections);
+ IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections);
KSDDKAPI
VOID
@@ -3681,7 +3884,7 @@ NTSTATUS
NTAPI
KsFilterCreateNode(
IN PKSFILTER Filter,
- IN const KSNODE_DESCRIPTOR* NodeDescriptor,
+ IN const KSNODE_DESCRIPTOR *const NodeDescriptor,
OUT PULONG NodeID);
KSDDKAPI
@@ -3689,7 +3892,7 @@ NTSTATUS
NTAPI
KsFilterCreatePinFactory(
IN PKSFILTER Filter,
- IN const KSPIN_DESCRIPTOR_EX* PinDescriptor,
+ IN const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
OUT PULONG PinID);
KSDDKAPI
diff --git a/reactos/include/psdk/ksmedia.h b/reactos/include/psdk/ksmedia.h
index 28973c71fe7..2f90af88e1c 100644
--- a/reactos/include/psdk/ksmedia.h
+++ b/reactos/include/psdk/ksmedia.h
@@ -396,10 +396,14 @@ DEFINE_GUIDSTRUCT("1D262760-E957-11CF-A5D6-28DB04C10000", KSDATAFORMAT_SUBTYPE_M
#define KSDATAFORMAT_SUBTYPE_MIDI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MIDI)
#define STATIC_KSDATAFORMAT_SUBTYPE_PCM\
- 0x00000001L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
+ 0x00000001L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
DEFINE_GUIDSTRUCT("00000001-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_PCM);
#define KSDATAFORMAT_SUBTYPE_PCM DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_PCM)
+#define STATIC_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT\
+ 0x00000003L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
+DEFINE_GUIDSTRUCT("00000003-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_IEEE_FLOAT);
+#define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)
#define STATIC_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX\
0x05589f81L, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a
diff --git a/reactos/include/psdk/mmsystem.h b/reactos/include/psdk/mmsystem.h
index 24a22bd2c67..a3d7a97ebcb 100644
--- a/reactos/include/psdk/mmsystem.h
+++ b/reactos/include/psdk/mmsystem.h
@@ -126,6 +126,11 @@ extern "C" {
#define DRV_RESTART DRVCNF_RESTART
#define DRV_MCI_FIRST DRV_RESERVED
#define DRV_MCI_LAST (DRV_RESERVED+0xFFF)
+#ifdef _WINE
+#define DRV_SUCCESS 0x0001
+#define DRV_FAILURE 0x0000
+#define DRV_EXITAPPLICATION 0x000C
+#endif
#define CALLBACK_TYPEMASK 0x70000
#define CALLBACK_NULL 0
#define CALLBACK_WINDOW 0x10000
@@ -368,6 +373,7 @@ extern "C" {
#define MIXERCONTROL_CONTROLTYPE_MONO (MIXERCONTROL_CONTROLTYPE_BOOLEAN+3)
#define MIXERCONTROL_CONTROLTYPE_LOUDNESS (MIXERCONTROL_CONTROLTYPE_BOOLEAN+4)
#define MIXERCONTROL_CONTROLTYPE_STEREOENH (MIXERCONTROL_CONTROLTYPE_BOOLEAN+5)
+#define MIXERCONTROL_CONTROLTYPE_BASS_BOOST (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 0x00002277)
#define MIXERCONTROL_CONTROLTYPE_BUTTON (MIXERCONTROL_CT_CLASS_SWITCH|MIXERCONTROL_CT_SC_SWITCH_BUTTON|MIXERCONTROL_CT_UNITS_BOOLEAN)
#define MIXERCONTROL_CONTROLTYPE_DECIBELS (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_DECIBELS)
#define MIXERCONTROL_CONTROLTYPE_SIGNED (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_SIGNED)
@@ -904,6 +910,12 @@ extern "C" {
#define MCI_OVLY_WHERE_DESTINATION 0x40000
#define MCI_OVLY_WHERE_FRAME 0x80000
#define MCI_OVLY_WHERE_VIDEO 0x100000
+#ifdef _WINE
+#define MCI_OPEN_DRIVER 0x0801
+#define MCI_CLOSE_DRIVER 0x0802
+#define MCI_SOUND 0x0812
+#define MCI_SOUND_NAME 0x00000100L
+#endif
#define NEWTRANSPARENT 3
#define QUERYROPSUPPORT 40
#define SELECTDIB 41
@@ -921,6 +933,18 @@ extern "C" {
#define SEEK_END 2
#endif
+#ifdef _WINE
+#define MAXWAVEDRIVERS 10
+#define MAXMIDIDRIVERS 10
+#define MAXAUXDRIVERS 10
+#define MAXMCIDRIVERS 32
+#define MAXMIXERDRIVERS 10
+#endif
+
+#ifdef _WINE
+typedef LPCSTR HPCSTR;
+#endif
+
typedef DWORD MCIERROR;
typedef UINT MCIDEVICEID;
typedef UINT(CALLBACK *YIELDPROC)(MCIDEVICEID,DWORD);
@@ -1131,6 +1155,9 @@ typedef struct midievent_tag {
DWORD dwEvent;
DWORD dwParms[1];
} MIDIEVENT;
+#ifdef _WINE
+typedef struct midievent_tag *LPMIDIEVENT;
+#endif
typedef struct midistrmbuffver_tag {
DWORD dwVersion;
@@ -1507,6 +1534,24 @@ typedef struct tagMCI_SEEK_PARMS {
DWORD dwTo;
} MCI_SEEK_PARMS, *PMCI_SEEK_PARMS,*LPMCI_SEEK_PARMS;
+#ifdef _WINE
+typedef struct tagMCI_SOUND_PARMSA {
+ DWORD_PTR dwCallback;
+ LPCSTR lpstrSoundName;
+} MCI_SOUND_PARMSA, *LPMCI_SOUND_PARMSA;
+
+typedef struct tagMCI_SOUND_PARMSW {
+ DWORD_PTR dwCallback;
+ LPCWSTR lpstrSoundName;
+} MCI_SOUND_PARMSW, *LPMCI_SOUND_PARMSW;
+
+#ifdef UNICODE
+typedef MCI_SOUND_PARMSW MCI_SOUND_PARMS;
+#else
+typedef MCI_SOUND_PARMSA MCI_SOUND_PARMS;
+#endif
+#endif
+
typedef struct tagMCI_STATUS_PARMS {
DWORD_PTR dwCallback;
DWORD_PTR dwReturn;
diff --git a/reactos/include/psdk/ntgdi.h b/reactos/include/psdk/ntgdi.h
index a27339ee806..e8050217a23 100644
--- a/reactos/include/psdk/ntgdi.h
+++ b/reactos/include/psdk/ntgdi.h
@@ -2085,6 +2085,7 @@ NtGdiOpenDCW(
IN DEVMODEW *pdm, // See note for NtGdiResetDC
IN PUNICODE_STRING pustrLogAddr,
IN ULONG iType,
+ IN BOOL bDisplay,
IN OPTIONAL HANDLE hspool,
IN OPTIONAL VOID *pDriverInfo2, // this is "typedef struct _DRIVER_INFO_2W DRIVER_INFO_2W;"
OUT VOID *pUMdhpdev
diff --git a/reactos/include/psdk/prsht.h b/reactos/include/psdk/prsht.h
index 987653d1226..91f3e76de14 100644
--- a/reactos/include/psdk/prsht.h
+++ b/reactos/include/psdk/prsht.h
@@ -63,6 +63,10 @@ extern "C" {
#else
#define PSH_WIZARD97 0x01000000
#endif
+#ifdef _WINE
+#define PSH_WIZARD97_OLD 0x00002000
+#define PSH_WIZARD97_NEW 0x01000000
+#endif
#endif /* _WIN32_IE >= 0x0400 */
#if (_WIN32_IE >= 0x0500)
#define PSH_WIZARD_LITE 0x400000
diff --git a/reactos/include/psdk/svcguid.h b/reactos/include/psdk/svcguid.h
index da4ef82c236..f14970e6838 100644
--- a/reactos/include/psdk/svcguid.h
+++ b/reactos/include/psdk/svcguid.h
@@ -5,6 +5,11 @@
extern "C" {
#endif
+#define SVCID_HOSTNAME { 0x0002a800, 0, 0, { 0xC0,0,0,0,0,0,0,0x46 } }
+#define SVCID_INET_HOSTADDRBYINETSTRING { 0x0002a801, 0, 0, { 0xC0,0,0,0,0,0,0,0x46 } }
+#define SVCID_INET_HOSTADDRBYNAME { 0x0002a803, 0, 0, { 0xC0,0,0,0,0,0,0,0x46 } }
+#define SVCID_INET_SERVICEBYNAME { 0x0002a802, 0, 0, { 0xC0,0,0,0,0,0,0,0x46 } }
+
#define SVCID_NETWARE(_SapId) \
{ (0x000B << 16) | (_SapId), 0, 0, { 0xC0,0,0,0,0,0,0,0x46 } }
@@ -24,6 +29,213 @@ extern "C" {
(_g)->Data4[6] = 0x0; \
(_g)->Data4[7] = 0x46; }
+#define SVCID_PRINT_QUEUE SVCID_NETWARE(0x3)
+#define SVCID_FILE_SERVER SVCID_NETWARE(0x4)
+#define SVCID_JOB_SERVER SVCID_NETWARE(0x5)
+#define SVCID_GATEWAY SVCID_NETWARE(0x6)
+#define SVCID_PRINT_SERVER SVCID_NETWARE(0x7)
+#define SVCID_ARCHIVE_QUEUE SVCID_NETWARE(0x8)
+#define SVCID_ARCHIVE_SERVER SVCID_NETWARE(0x9)
+#define SVCID_JOB_QUEUE SVCID_NETWARE(0xA)
+#define SVCID_ADMINISTRATION SVCID_NETWARE(0xB)
+#define SVCID_NAS_SNA_GATEWAY SVCID_NETWARE(0x21)
+#define SVCID_REMOTE_BRIDGE_SERVER SVCID_NETWARE(0x24)
+#define SVCID_TIME_SYNCHRONIZATION_SERVER SVCID_NETWARE(0x2D)
+#define SVCID_ARCHIVE_SERVER_DYNAMIC_SAP SVCID_NETWARE(0x2E)
+#define SVCID_ADVERTISING_PRINT_SERVER SVCID_NETWARE(0x47)
+#define SVCID_BTRIEVE_VAP SVCID_NETWARE(0x4B)
+#define SVCID_DIRECTORY_SERVER SVCID_NETWARE(0x278)
+#define SVCID_NETWARE_386 SVCID_NETWARE(0x107)
+#define SVCID_HP_PRINT_SERVER SVCID_NETWARE(0x30C)
+#define SVCID_SNA_SERVER SVCID_NETWARE(0x444)
+#define SVCID_SAA_SERVER SVCID_NETWARE(0x130)
+
+#define SVCID_TCP_RR(Port, Type) { (0x0009 << 16) | (Port), 0, Type, { 0xC0,0,0,0,0,0,0,0x46 } }
+
+#define SVCID_DNS(Type) SVCID_TCP_RR(53, Type)
+
+#define SVCID_DNS_TYPE_A SVCID_DNS(0x0001)
+#define SVCID_DNS_TYPE_NS SVCID_DNS(0x0002)
+#define SVCID_DNS_TYPE_MD SVCID_DNS(0x0003)
+#define SVCID_DNS_TYPE_MF SVCID_DNS(0x0004)
+#define SVCID_DNS_TYPE_CNAME SVCID_DNS(0x0005)
+#define SVCID_DNS_TYPE_SOA SVCID_DNS(0x0006)
+#define SVCID_DNS_TYPE_MB SVCID_DNS(0x0007)
+#define SVCID_DNS_TYPE_MG SVCID_DNS(0x0008)
+#define SVCID_DNS_TYPE_MR SVCID_DNS(0x0009)
+#define SVCID_DNS_TYPE_NULL SVCID_DNS(0x000a)
+#define SVCID_DNS_TYPE_WKS SVCID_DNS(0x000b)
+#define SVCID_DNS_TYPE_PTR SVCID_DNS(0x000c)
+#define SVCID_DNS_TYPE_HINFO SVCID_DNS(0x000d)
+#define SVCID_DNS_TYPE_MINFO SVCID_DNS(0x000e)
+#define SVCID_DNS_TYPE_MX SVCID_DNS(0x000f)
+#define SVCID_DNS_TYPE_TEXT SVCID_DNS(0x0010)
+#define SVCID_DNS_TYPE_RP SVCID_DNS(0x0011)
+#define SVCID_DNS_TYPE_AFSDB SVCID_DNS(0x0012)
+#define SVCID_DNS_TYPE_X25 SVCID_DNS(0x0013)
+#define SVCID_DNS_TYPE_ISDN SVCID_DNS(0x0014)
+#define SVCID_DNS_TYPE_RT SVCID_DNS(0x0015)
+#define SVCID_DNS_TYPE_NSAP SVCID_DNS(0x0016)
+#define SVCID_DNS_TYPE_NSAPPTR SVCID_DNS(0x0017)
+#define SVCID_DNS_TYPE_SIG SVCID_DNS(0x0018)
+#define SVCID_DNS_TYPE_KEY SVCID_DNS(0x0019)
+#define SVCID_DNS_TYPE_PX SVCID_DNS(0x001a)
+#define SVCID_DNS_TYPE_GPOS SVCID_DNS(0x001b)
+#define SVCID_DNS_TYPE_AAAA SVCID_DNS(0x001c)
+#define SVCID_DNS_TYPE_LOC SVCID_DNS(0x001d)
+#define SVCID_DNS_TYPE_NXT SVCID_DNS(0x001e)
+#define SVCID_DNS_TYPE_SRV SVCID_DNS(0x0021)
+#define SVCID_DNS_TYPE_ATMA SVCID_DNS(0x0022)
+
+#define SVCID_TCP(Port) SVCID_TCP_RR(Port, 0)
+
+#define SVCID_ECHO_TCP SVCID_TCP(7)
+#define SVCID_DISCARD_TCP SVCID_TCP(9)
+#define SVCID_SYSTAT_TCP SVCID_TCP(11)
+#define SVCID_SYSTAT_TCP SVCID_TCP(11)
+#define SVCID_DAYTIME_TCP SVCID_TCP(13)
+#define SVCID_NETSTAT_TCP SVCID_TCP(15)
+#define SVCID_QOTD_TCP SVCID_TCP(17)
+#define SVCID_CHARGEN_TCP SVCID_TCP(19)
+#define SVCID_FTP_DATA_TCP SVCID_TCP(20)
+#define SVCID_FTP_TCP SVCID_TCP(21)
+#define SVCID_TELNET_TCP SVCID_TCP(23)
+#define SVCID_SMTP_TCP SVCID_TCP(25)
+#define SVCID_TIME_TCP SVCID_TCP(37)
+#define SVCID_NAME_TCP SVCID_TCP(42)
+#define SVCID_WHOIS_TCP SVCID_TCP(43)
+#define SVCID_DOMAIN_TCP SVCID_TCP(53)
+#define SVCID_NAMESERVER_TCP SVCID_TCP(53)
+#define SVCID_MTP_TCP SVCID_TCP(57)
+#define SVCID_RJE_TCP SVCID_TCP(77)
+#define SVCID_FINGER_TCP SVCID_TCP(79)
+#define SVCID_LINK_TCP SVCID_TCP(87)
+#define SVCID_SUPDUP_TCP SVCID_TCP(95)
+#define SVCID_HOSTNAMES_TCP SVCID_TCP(101)
+#define SVCID_ISO_TSAP_TCP SVCID_TCP(102)
+#define SVCID_DICTIONARY_TCP SVCID_TCP(103)
+#define SVCID_X400_TCP SVCID_TCP(103)
+#define SVCID_X400_SND_TCP SVCID_TCP(104)
+#define SVCID_CSNET_NS_TCP SVCID_TCP(105)
+#define SVCID_POP_TCP SVCID_TCP(109)
+#define SVCID_POP2_TCP SVCID_TCP(109)
+#define SVCID_POP3_TCP SVCID_TCP(110)
+#define SVCID_PORTMAP_TCP SVCID_TCP(111)
+#define SVCID_SUNRPC_TCP SVCID_TCP(111)
+#define SVCID_AUTH_TCP SVCID_TCP(113)
+#define SVCID_SFTP_TCP SVCID_TCP(115)
+#define SVCID_PATH_TCP SVCID_TCP(117)
+#define SVCID_UUCP_PATH_TCP SVCID_TCP(117)
+#define SVCID_NNTP_TCP SVCID_TCP(119)
+#define SVCID_NBSESSION_TCP SVCID_TCP(139)
+#define SVCID_NEWS_TCP SVCID_TCP(144)
+#define SVCID_TCPREPO_TCP SVCID_TCP(158)
+#define SVCID_PRINT_SRV_TCP SVCID_TCP(170)
+#define SVCID_VMNET_TCP SVCID_TCP(175)
+#define SVCID_VMNET0_TCP SVCID_TCP(400)
+#define SVCID_EXEC_TCP SVCID_TCP(512)
+#define SVCID_LOGIN_TCP SVCID_TCP(513)
+#define SVCID_SHELL_TCP SVCID_TCP(514)
+#define SVCID_PRINTER_TCP SVCID_TCP(515)
+#define SVCID_EFS_TCP SVCID_TCP(520)
+#define SVCID_TEMPO_TCP SVCID_TCP(526)
+#define SVCID_COURIER_TCP SVCID_TCP(530)
+#define SVCID_CONFERENCE_TCP SVCID_TCP(531)
+#define SVCID_NETNEWS_TCP SVCID_TCP(532)
+#define SVCID_UUCP_TCP SVCID_TCP(540)
+#define SVCID_KLOGIN_TCP SVCID_TCP(543)
+#define SVCID_KSHELL_TCP SVCID_TCP(544)
+#define SVCID_REMOTEFS_TCP SVCID_TCP(556)
+#define SVCID_GARCON_TCP SVCID_TCP(600)
+#define SVCID_MAITRD_TCP SVCID_TCP(601)
+#define SVCID_BUSBOY_TCP SVCID_TCP(602)
+#define SVCID_KERBEROS_TCP SVCID_TCP(750)
+#define SVCID_KERBEROS_MASTER_TCP SVCID_TCP(751)
+#define SVCID_KRB_PROP_TCP SVCID_TCP(754)
+#define SVCID_ERLOGIN_TCP SVCID_TCP(888)
+#define SVCID_KPOP_TCP SVCID_TCP(1109)
+#define SVCID_INGRESLOCK_TCP SVCID_TCP(1524)
+#define SVCID_KNETD_TCP SVCID_TCP(2053)
+#define SVCID_EKLOGIN_TCP SVCID_TCP(2105)
+#define SVCID_RMT_TCP SVCID_TCP(5555)
+#define SVCID_MTB_TCP SVCID_TCP(5556)
+#define SVCID_MAN_TCP SVCID_TCP(9535)
+#define SVCID_W_TCP SVCID_TCP(9536)
+#define SVCID_MANTST_TCP SVCID_TCP(9537)
+#define SVCID_BNEWS_TCP SVCID_TCP(10000)
+#define SVCID_QUEUE_TCP SVCID_TCP(10001)
+#define SVCID_POKER_TCP SVCID_TCP(10002)
+#define SVCID_GATEWAY_TCP SVCID_TCP(10003)
+#define SVCID_REMP_TCP SVCID_TCP(10004)
+#define SVCID_QMASTER_TCP SVCID_TCP(10012)
+
+#define SVCID_UDP_RR(Port, Type) { (0x000A << 16) | (Port), 0, Type, { 0xC0,0,0,0,0,0,0,0x46 } }
+#define SVCID_UDP(Port) SVCID_UDP_RR(Port, 0)
+
+#define SVCID_ECHO_UDP SVCID_UDP(7)
+#define SVCID_DISCARD_UDP SVCID_UDP(9)
+#define SVCID_DAYTIME_UDP SVCID_UDP(13)
+#define SVCID_QOTD_UDP SVCID_UDP(17)
+#define SVCID_CHARGEN_UDP SVCID_UDP(19)
+#define SVCID_TIME_UDP SVCID_UDP(37)
+#define SVCID_RLP_UDP SVCID_UDP(39)
+#define SVCID_NAME_UDP SVCID_UDP(42)
+#define SVCID_DOMAIN_UDP SVCID_UDP(53)
+#define SVCID_NAMESERVER_UDP SVCID_UDP(53)
+#define SVCID_BOOTP_UDP SVCID_UDP(67)
+#define SVCID_TFTP_UDP SVCID_UDP(69)
+#define SVCID_PORTMAP_UDP SVCID_UDP(111)
+#define SVCID_SUNRPC_UDP SVCID_UDP(111)
+#define SVCID_NTP_UDP SVCID_UDP(123)
+#define SVCID_NBNAME_UDP SVCID_UDP(137)
+#define SVCID_NBDATAGRAM_UDP SVCID_UDP(138)
+#define SVCID_SGMP_UDP SVCID_UDP(153)
+#define SVCID_SNMP_UDP SVCID_UDP(161)
+#define SVCID_SNMP_TRAP_UDP SVCID_UDP(162)
+#define SVCID_LOAD_UDP SVCID_UDP(315)
+#define SVCID_SYTEK_UDP SVCID_UDP(500)
+#define SVCID_BIFF_UDP SVCID_UDP(512)
+#define SVCID_WHO_UDP SVCID_UDP(513)
+#define SVCID_SYSLOG_UDP SVCID_UDP(514)
+#define SVCID_TALK_UDP SVCID_UDP(517)
+#define SVCID_NTALK_UDP SVCID_UDP(518)
+#define SVCID_ROUTE_UDP SVCID_UDP(520)
+#define SVCID_TIMED_UDP SVCID_UDP(525)
+#define SVCID_RVD_CONTROL_UDP SVCID_UDP(531)
+#define SVCID_NETWALL_UDP SVCID_UDP(533)
+#define SVCID_NEW_RWHO_UDP SVCID_UDP(550)
+#define SVCID_RMONITOR_UDP SVCID_UDP(560)
+#define SVCID_MONITOR_UDP SVCID_UDP(561)
+#define SVCID_ACCTMASTER_UDP SVCID_UDP(700)
+#define SVCID_ACCTSLAVE_UDP SVCID_UDP(701)
+#define SVCID_ACCT_UDP SVCID_UDP(702)
+#define SVCID_ACCTLOGIN_UDP SVCID_UDP(703)
+#define SVCID_ACCTPRINTER_UDP SVCID_UDP(704)
+#define SVCID_ELCSD_UDP SVCID_UDP(704)
+#define SVCID_ACCTINFO_UDP SVCID_UDP(705)
+#define SVCID_ACCTSLAVE2_UDP SVCID_UDP(706)
+#define SVCID_ACCTDISK_UDP SVCID_UDP(707)
+#define SVCID_KERBEROS_UDP SVCID_UDP(750)
+#define SVCID_KERBEROS_MASTER_UDP SVCID_UDP(751)
+#define SVCID_PASSWD_SERVER_UDP SVCID_UDP(752)
+#define SVCID_USERREG_SERVER_UDP SVCID_UDP(753)
+#define SVCID_PHONE_UDP SVCID_UDP(1167)
+#define SVCID_MAZE_UDP SVCID_UDP(1666)
+#define SVCID_NFS_UDP SVCID_UDP(2049)
+#define SVCID_RSCS0_UDP SVCID_UDP(10000)
+#define SVCID_RSCS1_UDP SVCID_UDP(10001)
+#define SVCID_RSCS2_UDP SVCID_UDP(10002)
+#define SVCID_RSCS3_UDP SVCID_UDP(10003)
+#define SVCID_RSCS4_UDP SVCID_UDP(10004)
+#define SVCID_RSCS5_UDP SVCID_UDP(10005)
+#define SVCID_RSCS6_UDP SVCID_UDP(10006)
+#define SVCID_RSCS7_UDP SVCID_UDP(10007)
+#define SVCID_RSCS8_UDP SVCID_UDP(10008)
+#define SVCID_RSCS9_UDP SVCID_UDP(10009)
+#define SVCID_RSCSA_UDP SVCID_UDP(10010)
+#define SVCID_RSCSB_UDP SVCID_UDP(10011)
+#define SVCID_QMASTER_UDP SVCID_UDP(10012)
+
#ifdef __cplusplus
}
#endif
diff --git a/reactos/include/psdk/winbase.h b/reactos/include/psdk/winbase.h
index 64cb5a2c428..cf889169d5c 100644
--- a/reactos/include/psdk/winbase.h
+++ b/reactos/include/psdk/winbase.h
@@ -572,6 +572,7 @@ extern "C" {
#endif
#ifndef RC_INVOKED
+
#ifndef _FILETIME_
#define _FILETIME_
typedef struct _FILETIME {
@@ -579,6 +580,7 @@ typedef struct _FILETIME {
DWORD dwHighDateTime;
} FILETIME,*PFILETIME,*LPFILETIME;
#endif
+
typedef struct _BY_HANDLE_FILE_INFORMATION {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
@@ -590,7 +592,8 @@ typedef struct _BY_HANDLE_FILE_INFORMATION {
DWORD nNumberOfLinks;
DWORD nFileIndexHigh;
DWORD nFileIndexLow;
-} BY_HANDLE_FILE_INFORMATION,*LPBY_HANDLE_FILE_INFORMATION;
+} BY_HANDLE_FILE_INFORMATION,*PBY_HANDLE_FILE_INFORMATION,*LPBY_HANDLE_FILE_INFORMATION;
+
typedef struct _DCB {
DWORD DCBlength;
DWORD BaudRate;
@@ -621,6 +624,7 @@ typedef struct _DCB {
char EvtChar;
WORD wReserved1;
} DCB,*LPDCB;
+
typedef struct _COMM_CONFIG {
DWORD dwSize;
WORD wVersion;
@@ -631,6 +635,7 @@ typedef struct _COMM_CONFIG {
DWORD dwProviderSize;
WCHAR wcProviderData[1];
} COMMCONFIG,*LPCOMMCONFIG;
+
typedef struct _COMMPROP {
WORD wPacketLength;
WORD wPacketVersion;
@@ -651,6 +656,7 @@ typedef struct _COMMPROP {
DWORD dwProvSpec2;
WCHAR wcProvChar[1];
} COMMPROP,*LPCOMMPROP;
+
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
@@ -658,6 +664,7 @@ typedef struct _COMMTIMEOUTS {
DWORD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
+
typedef struct _COMSTAT {
DWORD fCtsHold:1;
DWORD fDsrHold:1;
@@ -670,7 +677,9 @@ typedef struct _COMSTAT {
DWORD cbInQue;
DWORD cbOutQue;
} COMSTAT,*LPCOMSTAT;
+
typedef DWORD (WINAPI *LPTHREAD_START_ROUTINE)(LPVOID);
+
typedef struct _CREATE_PROCESS_DEBUG_INFO {
HANDLE hFile;
HANDLE hProcess;
@@ -683,21 +692,26 @@ typedef struct _CREATE_PROCESS_DEBUG_INFO {
LPVOID lpImageName;
WORD fUnicode;
} CREATE_PROCESS_DEBUG_INFO,*LPCREATE_PROCESS_DEBUG_INFO;
+
typedef struct _CREATE_THREAD_DEBUG_INFO {
HANDLE hThread;
LPVOID lpThreadLocalBase;
LPTHREAD_START_ROUTINE lpStartAddress;
} CREATE_THREAD_DEBUG_INFO,*LPCREATE_THREAD_DEBUG_INFO;
+
typedef struct _EXCEPTION_DEBUG_INFO {
EXCEPTION_RECORD ExceptionRecord;
DWORD dwFirstChance;
} EXCEPTION_DEBUG_INFO,*LPEXCEPTION_DEBUG_INFO;
+
typedef struct _EXIT_THREAD_DEBUG_INFO {
DWORD dwExitCode;
} EXIT_THREAD_DEBUG_INFO,*LPEXIT_THREAD_DEBUG_INFO;
+
typedef struct _EXIT_PROCESS_DEBUG_INFO {
DWORD dwExitCode;
} EXIT_PROCESS_DEBUG_INFO,*LPEXIT_PROCESS_DEBUG_INFO;
+
typedef struct _LOAD_DLL_DEBUG_INFO {
HANDLE hFile;
LPVOID lpBaseOfDll;
@@ -706,18 +720,22 @@ typedef struct _LOAD_DLL_DEBUG_INFO {
LPVOID lpImageName;
WORD fUnicode;
} LOAD_DLL_DEBUG_INFO,*LPLOAD_DLL_DEBUG_INFO;
+
typedef struct _UNLOAD_DLL_DEBUG_INFO {
LPVOID lpBaseOfDll;
} UNLOAD_DLL_DEBUG_INFO,*LPUNLOAD_DLL_DEBUG_INFO;
+
typedef struct _OUTPUT_DEBUG_STRING_INFO {
LPSTR lpDebugStringData;
WORD fUnicode;
WORD nDebugStringLength;
} OUTPUT_DEBUG_STRING_INFO,*LPOUTPUT_DEBUG_STRING_INFO;
+
typedef struct _RIP_INFO {
DWORD dwError;
DWORD dwType;
} RIP_INFO,*LPRIP_INFO;
+
typedef struct _DEBUG_EVENT {
DWORD dwDebugEventCode;
DWORD dwProcessId;
@@ -734,6 +752,7 @@ typedef struct _DEBUG_EVENT {
RIP_INFO RipInfo;
} u;
} DEBUG_EVENT,*LPDEBUG_EVENT;
+
typedef struct _OVERLAPPED {
ULONG_PTR Internal;
ULONG_PTR InternalHigh;
@@ -741,6 +760,7 @@ typedef struct _OVERLAPPED {
DWORD OffsetHigh;
HANDLE hEvent;
} OVERLAPPED,*POVERLAPPED,*LPOVERLAPPED;
+
typedef struct _STARTUPINFOA {
DWORD cb;
LPSTR lpReserved;
@@ -761,6 +781,7 @@ typedef struct _STARTUPINFOA {
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFOA,*LPSTARTUPINFOA;
+
typedef struct _STARTUPINFOW {
DWORD cb;
LPWSTR lpReserved;
@@ -781,12 +802,14 @@ typedef struct _STARTUPINFOW {
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFOW,*LPSTARTUPINFOW;
+
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
-} PROCESS_INFORMATION,*LPPROCESS_INFORMATION;
+} PROCESS_INFORMATION,*PPROCESS_INFORMATION,*LPPROCESS_INFORMATION;
+
typedef struct _CRITICAL_SECTION_DEBUG {
WORD Type;
WORD CreatorBackTraceIndex;
@@ -799,7 +822,8 @@ typedef struct _CRITICAL_SECTION_DEBUG {
//#else
//WORD SpareWORD;
//#endif
-} CRITICAL_SECTION_DEBUG,*PCRITICAL_SECTION_DEBUG;
+} CRITICAL_SECTION_DEBUG,*PCRITICAL_SECTION_DEBUG,*LPCRITICAL_SECTION_DEBUG;
+
typedef struct _CRITICAL_SECTION {
PCRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
@@ -808,6 +832,7 @@ typedef struct _CRITICAL_SECTION {
HANDLE LockSemaphore;
ULONG_PTR SpinCount;
} CRITICAL_SECTION,*PCRITICAL_SECTION,*LPCRITICAL_SECTION;
+
#ifndef _SYSTEMTIME_
#define _SYSTEMTIME_
typedef struct _SYSTEMTIME {
@@ -856,15 +881,18 @@ typedef struct _WIN32_FIND_DATAW {
WCHAR cFileName[MAX_PATH];
WCHAR cAlternateFileName[14];
} WIN32_FIND_DATAW,*PWIN32_FIND_DATAW,*LPWIN32_FIND_DATAW;
+
#if (_WIN32_WINNT >= 0x0501)
typedef enum _STREAM_INFO_LEVELS {
FindStreamInfoStandard
} STREAM_INFO_LEVELS;
+
typedef struct _WIN32_FIND_STREAM_DATA {
LARGE_INTEGER StreamSize;
WCHAR cStreamName[MAX_PATH + 36];
} WIN32_FIND_STREAM_DATA, *PWIN32_FIND_STREAM_DATA;
#endif
+
typedef struct _WIN32_STREAM_ID {
DWORD dwStreamId;
DWORD dwStreamAttributes;
@@ -872,11 +900,13 @@ typedef struct _WIN32_STREAM_ID {
DWORD dwStreamNameSize;
WCHAR cStreamName[ANYSIZE_ARRAY];
} WIN32_STREAM_ID, *LPWIN32_STREAM_ID;
+
#if (_WIN32_WINNT >= 0x0600)
typedef enum _FILE_ID_TYPE {
FileIdType,
MaximumFileIdType
} FILE_ID_TYPE, *PFILE_ID_TYPE;
+
typedef struct _FILE_ID_DESCRIPTOR {
DWORD dwSize;
FILE_ID_TYPE Type;
@@ -885,30 +915,36 @@ typedef struct _FILE_ID_DESCRIPTOR {
} DUMMYUNIONNAME;
} FILE_ID_DESCRIPTOR, *LPFILE_ID_DESCRIPTOR;
#endif
+
typedef enum _FINDEX_INFO_LEVELS {
FindExInfoStandard,
FindExInfoMaxInfoLevel
} FINDEX_INFO_LEVELS;
+
typedef enum _FINDEX_SEARCH_OPS {
FindExSearchNameMatch,
FindExSearchLimitToDirectories,
FindExSearchLimitToDevices,
FindExSearchMaxSearchOp
} FINDEX_SEARCH_OPS;
+
typedef struct tagHW_PROFILE_INFOA {
DWORD dwDockInfo;
CHAR szHwProfileGuid[HW_PROFILE_GUIDLEN];
CHAR szHwProfileName[MAX_PROFILE_LEN];
} HW_PROFILE_INFOA,*LPHW_PROFILE_INFOA;
+
typedef struct tagHW_PROFILE_INFOW {
DWORD dwDockInfo;
WCHAR szHwProfileGuid[HW_PROFILE_GUIDLEN];
WCHAR szHwProfileName[MAX_PROFILE_LEN];
} HW_PROFILE_INFOW,*LPHW_PROFILE_INFOW;
+
typedef enum _GET_FILEEX_INFO_LEVELS {
GetFileExInfoStandard,
GetFileExMaxInfoLevel
} GET_FILEEX_INFO_LEVELS;
+
typedef struct _SYSTEM_INFO {
_ANONYMOUS_UNION union {
DWORD dwOemId;
@@ -927,6 +963,7 @@ typedef struct _SYSTEM_INFO {
WORD wProcessorLevel;
WORD wProcessorRevision;
} SYSTEM_INFO,*LPSYSTEM_INFO;
+
typedef struct _SYSTEM_POWER_STATUS {
BYTE ACLineStatus;
BYTE BatteryFlag;
@@ -935,6 +972,7 @@ typedef struct _SYSTEM_POWER_STATUS {
DWORD BatteryLifeTime;
DWORD BatteryFullLifeTime;
} SYSTEM_POWER_STATUS,*LPSYSTEM_POWER_STATUS;
+
typedef struct _TIME_ZONE_INFORMATION {
LONG Bias;
WCHAR StandardName[32];
@@ -943,7 +981,8 @@ typedef struct _TIME_ZONE_INFORMATION {
WCHAR DaylightName[32];
SYSTEMTIME DaylightDate;
LONG DaylightBias;
-} TIME_ZONE_INFORMATION,*LPTIME_ZONE_INFORMATION;
+} TIME_ZONE_INFORMATION,*PTIME_ZONE_INFORMATION,*LPTIME_ZONE_INFORMATION;
+
typedef struct _MEMORYSTATUS {
DWORD dwLength;
DWORD dwMemoryLoad;
@@ -954,6 +993,7 @@ typedef struct _MEMORYSTATUS {
DWORD dwTotalVirtual;
DWORD dwAvailVirtual;
} MEMORYSTATUS,*LPMEMORYSTATUS;
+
#if (_WIN32_WINNT >= 0x0500)
typedef struct _MEMORYSTATUSEX {
DWORD dwLength;
@@ -967,6 +1007,7 @@ typedef struct _MEMORYSTATUSEX {
DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;
#endif
+
#ifndef _LDT_ENTRY_DEFINED
#define _LDT_ENTRY_DEFINED
typedef struct _LDT_ENTRY {
@@ -994,6 +1035,7 @@ typedef struct _LDT_ENTRY {
} HighWord;
} LDT_ENTRY,*PLDT_ENTRY,*LPLDT_ENTRY;
#endif
+
typedef struct _PROCESS_HEAP_ENTRY {
PVOID lpData;
DWORD cbData;
@@ -1012,7 +1054,8 @@ typedef struct _PROCESS_HEAP_ENTRY {
LPVOID lpLastBlock;
} Region;
} DUMMYUNIONNAME;
-} PROCESS_HEAP_ENTRY,*LPPROCESS_HEAP_ENTRY;
+} PROCESS_HEAP_ENTRY,*PPROCESS_HEAP_ENTRY,*LPPROCESS_HEAP_ENTRY;
+
typedef struct _OFSTRUCT {
BYTE cBytes;
BYTE fFixedDisk;
@@ -1021,6 +1064,7 @@ typedef struct _OFSTRUCT {
WORD Reserved2;
CHAR szPathName[OFS_MAXPATHNAME];
} OFSTRUCT,*LPOFSTRUCT,*POFSTRUCT;
+
#if (_WIN32_WINNT >= 0x0501)
typedef struct tagACTCTXA {
ULONG cbSize;
@@ -1034,6 +1078,7 @@ typedef struct tagACTCTXA {
HMODULE hModule;
} ACTCTXA,*PACTCTXA;
typedef const ACTCTXA *PCACTCTXA;
+
typedef struct tagACTCTXW {
ULONG cbSize;
DWORD dwFlags;
@@ -1046,6 +1091,30 @@ typedef struct tagACTCTXW {
HMODULE hModule;
} ACTCTXW,*PACTCTXW;
typedef const ACTCTXW *PCACTCTXW;
+
+typedef struct tagACTCTX_SECTION_KEYED_DATA_2600 {
+ ULONG cbSize;
+ ULONG ulDataFormatVersion;
+ PVOID lpData;
+ ULONG ulLength;
+ PVOID lpSectionGlobalData;
+ ULONG ulSectionGlobalDataLength;
+ PVOID lpSectionBase;
+ ULONG ulSectionTotalLength;
+ HANDLE hActCtx;
+ ULONG ulAssemblyRosterIndex;
+} ACTCTX_SECTION_KEYED_DATA_2600, *PACTCTX_SECTION_KEYED_DATA_2600;
+typedef const ACTCTX_SECTION_KEYED_DATA_2600 *PCACTCTX_SECTION_KEYED_DATA_2600;
+
+typedef struct tagACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA {
+ PVOID lpInformation;
+ PVOID lpSectionBase;
+ ULONG ulSectionLength;
+ PVOID lpSectionGlobalDataBase;
+ ULONG ulSectionGlobalDataLength;
+} ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, *PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA;
+typedef const ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA *PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA;
+
typedef struct tagACTCTX_SECTION_KEYED_DATA {
ULONG cbSize;
ULONG ulDataFormatVersion;
@@ -1057,18 +1126,27 @@ typedef struct tagACTCTX_SECTION_KEYED_DATA {
ULONG ulSectionTotalLength;
HANDLE hActCtx;
ULONG ulAssemblyRosterIndex;
+ /* Non 2600 extra fields */
+ ULONG ulFlags;
+ ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA AssemblyMetadata;
} ACTCTX_SECTION_KEYED_DATA,*PACTCTX_SECTION_KEYED_DATA;
+
typedef const ACTCTX_SECTION_KEYED_DATA *PCACTCTX_SECTION_KEYED_DATA;
+
typedef struct _ACTIVATION_CONTEXT_BASIC_INFORMATION {
HANDLE hActCtx;
DWORD dwFlags;
} ACTIVATION_CONTEXT_BASIC_INFORMATION, *PACTIVATION_CONTEXT_BASIC_INFORMATION;
typedef const struct _ACTIVATION_CONTEXT_BASIC_INFORMATION *PCACTIVATION_CONTEXT_BASIC_INFORMATION;
+
+typedef BOOL (WINAPI *PQUERYACTCTXW_FUNC)(DWORD,HANDLE,PVOID,ULONG,PVOID,SIZE_T,SIZE_T *);
+
typedef enum {
LowMemoryResourceNotification ,
HighMemoryResourceNotification
} MEMORY_RESOURCE_NOTIFICATION_TYPE;
#endif /* (_WIN32_WINNT >= 0x0501) */
+
#if (_WIN32_WINNT >= 0x0500)
typedef enum _COMPUTER_NAME_FORMAT {
ComputerNameNetBIOS,
@@ -1082,12 +1160,17 @@ typedef enum _COMPUTER_NAME_FORMAT {
ComputerNameMax
} COMPUTER_NAME_FORMAT;
#endif /* (_WIN32_WINNT >= 0x0500) */
+
#if (_WIN32_WINNT >= 0x0600)
typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK;
typedef RTL_CONDITION_VARIABLE CONDITION_VARIABLE, *PCONDITION_VARIABLE;
#endif
+
typedef DWORD(WINAPI *LPPROGRESS_ROUTINE)(LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,DWORD,DWORD,HANDLE,HANDLE,LPVOID);
-typedef void(WINAPI *LPFIBER_START_ROUTINE)(PVOID);
+
+typedef VOID (WINAPI *PFIBER_START_ROUTINE)( LPVOID lpFiberParameter );
+typedef PFIBER_START_ROUTINE LPFIBER_START_ROUTINE;
+
typedef VOID (WINAPI *PFLS_CALLBACK_FUNCTION)(PVOID);
typedef BOOL(CALLBACK *ENUMRESLANGPROCA)(HMODULE,LPCSTR,LPCSTR,WORD,LONG_PTR);
typedef BOOL(CALLBACK *ENUMRESLANGPROCW)(HMODULE,LPCWSTR,LPCWSTR,WORD,LONG_PTR);
diff --git a/reactos/include/psdk/wincrypt.h b/reactos/include/psdk/wincrypt.h
index a1c84d65125..e0a393068be 100644
--- a/reactos/include/psdk/wincrypt.h
+++ b/reactos/include/psdk/wincrypt.h
@@ -92,7 +92,7 @@ typedef struct _HMAC_INFO {
BYTE* pbOuterString;
DWORD cbOuterString;
} HMAC_INFO, *PHMAC_INFO;
-
+
typedef struct _CRYPTOAPI_BLOB {
DWORD cbData;
BYTE* pbData;
@@ -1046,6 +1046,7 @@ typedef struct _CERT_CHAIN_PARA {
DWORD dwUrlRetrievalTimeout;
BOOL fCheckRevocationFreshnessTime;
DWORD dwRevocationFreshnessTime;
+ LPFILETIME pftCacheResync;
#endif
} CERT_CHAIN_PARA, *PCERT_CHAIN_PARA;
@@ -1956,7 +1957,7 @@ static const WCHAR MS_ENH_RSA_AES_PROV_W[] = { 'M','i','c','r','o','s'
#define CRYPT_MODE_OFB 3
#define CRYPT_MODE_CFB 4
-#define CRYPT_ENCRYPT 0x0001
+#define CRYPT_ENCRYPT 0x0001
#define CRYPT_DECRYPT 0x0002
#define CRYPT_EXPORT 0x0004
#define CRYPT_READ 0x0008
@@ -2111,10 +2112,10 @@ static const WCHAR MS_ENH_RSA_AES_PROV_W[] = { 'M','i','c','r','o','s'
#define CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH \
L"Software\\Policies\\Microsoft\\SystemCertificates"
#else
-static const WCHAR CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH[] =
+static const WCHAR CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH[] =
{'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
'S','y','s','t','e','m','C','e','r','t','i','f','i','c','a','t','e','s',0 };
-static const WCHAR CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH[] =
+static const WCHAR CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH[] =
{'S','o','f','t','w','a','r','e','\\','P','o','l','i','c','i','e','s','\\',
'M','i','c','r','o','s','o','f','t','\\','S','y','s','t','e','m','C','e','r',
't','i','f','i','c','a','t','e','s',0 };
@@ -2371,7 +2372,7 @@ static const WCHAR CRYPT_OID_REG_FLAGS_VALUE_NAME[] =
# define CERT_PHYSICAL_STORE_AUTH_ROOT_NAME \
L".AuthRoot"
#else
-static const WCHAR CERT_PHYSICAL_STORE_DEFAULT_NAME[] =
+static const WCHAR CERT_PHYSICAL_STORE_DEFAULT_NAME[] =
{'.','D','e','f','a','u','l','t','0'};
static const WCHAR CERT_PHYSICAL_STORE_GROUP_POLICY_NAME[] =
{'.','G','r','o','u','p','P','o','l','i','c','y',0};
@@ -3821,7 +3822,7 @@ WINADVAPI BOOL WINAPI CryptGetUserKey (HCRYPTPROV, DWORD, HCRYPTKEY *);
WINADVAPI BOOL WINAPI CryptHashData (HCRYPTHASH, CONST BYTE *, DWORD, DWORD);
WINADVAPI BOOL WINAPI CryptHashSessionKey (HCRYPTHASH, HCRYPTKEY, DWORD);
WINADVAPI BOOL WINAPI CryptImportKey (HCRYPTPROV, CONST BYTE *, DWORD, HCRYPTKEY, DWORD, HCRYPTKEY *);
-WINADVAPI BOOL WINAPI CryptReleaseContext (HCRYPTPROV, DWORD);
+WINADVAPI BOOL WINAPI CryptReleaseContext (HCRYPTPROV, ULONG_PTR);
WINADVAPI BOOL WINAPI CryptSetHashParam (HCRYPTHASH, DWORD, CONST BYTE *, DWORD);
WINADVAPI BOOL WINAPI CryptSetKeyParam (HCRYPTKEY, DWORD, CONST BYTE *, DWORD);
WINADVAPI BOOL WINAPI CryptSetProviderA (LPCSTR, DWORD);
diff --git a/reactos/include/psdk/winnetwk.h b/reactos/include/psdk/winnetwk.h
index a39744919a7..c391472adce 100644
--- a/reactos/include/psdk/winnetwk.h
+++ b/reactos/include/psdk/winnetwk.h
@@ -287,6 +287,24 @@ DWORD WINAPI WNetRestoreConnectionA(HWND,LPCSTR);
DWORD WINAPI WNetRestoreConnectionW(HWND,LPCWSTR);
DWORD APIENTRY MultinetGetConnectionPerformanceA(LPNETRESOURCEA,LPNETCONNECTINFOSTRUCT);
DWORD APIENTRY MultinetGetConnectionPerformanceW(LPNETRESOURCEW,LPNETCONNECTINFOSTRUCT);
+
+#ifdef _WINE
+typedef struct tagPASSWORD_CACHE_ENTRY
+{
+ WORD cbEntry;
+ WORD cbResource;
+ WORD cbPassword;
+ BYTE iEntry;
+ BYTE nType;
+ BYTE abResource[1];
+} PASSWORD_CACHE_ENTRY;
+
+typedef BOOL (CALLBACK *ENUMPASSWORDPROC)(PASSWORD_CACHE_ENTRY *, DWORD);
+DWORD WINAPI WNetCachePassword( LPSTR, WORD, LPSTR, WORD, BYTE, WORD );
+UINT WINAPI WNetEnumCachedPasswords( LPSTR, WORD, BYTE, ENUMPASSWORDPROC, DWORD);
+DWORD WINAPI WNetGetCachedPassword( LPSTR, WORD, LPSTR, LPWORD, BYTE );
+#endif
+
#ifdef UNICODE
#define PFNPROCESSPOLICIES PFNPROCESSPOLICIESW
#define PFNRECONCILEPROFILE PFNRECONCILEPROFILEW
diff --git a/reactos/include/psdk/winnls.h b/reactos/include/psdk/winnls.h
index 4d956d1f54d..b63760ffae7 100644
--- a/reactos/include/psdk/winnls.h
+++ b/reactos/include/psdk/winnls.h
@@ -174,6 +174,9 @@ extern "C" {
#endif
#define CP_ACP 0
+#ifdef _WINE
+#define CP_UNIXCP CP_ACP
+#endif
#define CP_OEMCP 1
#define CP_MACCP 2
#define CP_THREAD_ACP 3
diff --git a/reactos/include/psdk/winnt.h b/reactos/include/psdk/winnt.h
index 80f7d3b54f4..8cf875588a1 100644
--- a/reactos/include/psdk/winnt.h
+++ b/reactos/include/psdk/winnt.h
@@ -73,11 +73,13 @@ extern "C" {
#endif
#endif
+/*#ifdef _WINE*/
#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)))
#define __WINE_ALLOC_SIZE(x) __attribute__((__alloc_size__(x)))
#else
#define __WINE_ALLOC_SIZE(x)
#endif
+/*#endif*/
#ifndef FORCEINLINE
#if (_MSC_VER >= 1200)
@@ -884,6 +886,27 @@ typedef enum {
#define LANG_YI 0x78
#define LANG_YORUBA 0x6a
#define LANG_ZULU 0x35
+
+#ifdef _WINE
+#define LANG_ESPERANTO 0x8f
+#define LANG_WALON 0x90
+#define LANG_CORNISH 0x91
+
+#define LANG_GAELIC 0x94
+#define LANG_MALTESE 0x3a
+#define LANG_ROMANSH 0x17
+#define LANG_SAAMI 0x3b
+#define LANG_LOWER_SORBIAN 0x2e
+#define LANG_UPPER_SORBIAN 0x2e
+#define LANG_SUTU 0x30
+#define LANG_TAJIK 0x28
+#define LANG_TSONGA 0x31
+#define LANG_TSWANA 0x32
+#define LANG_VENDA 0x33
+#define LANG_XHOSA 0x34
+#define LANG_ZULU 0x35
+#endif
+
#define SUBLANG_CUSTOM_UNSPECIFIED 0x04
#define SUBLANG_CUSTOM_DEFAULT 0x03
#define SUBLANG_UI_CUSTOM_DEFAULT 0x05
@@ -1291,10 +1314,10 @@ typedef enum {
#define RTL_CRITSECT_TYPE 0
#define RTL_RESOURCE_TYPE 1
/* Also in winddk.h */
-#ifndef __GNUC__
-#define FIELD_OFFSET(t,f) ((LONG_PTR)&(((t*)0)->f))
+#if !defined(__GNUC__)
+#define FIELD_OFFSET(t,f) ((LONG)(LONG_PTR)&(((t*) 0)->f))
#else
-#define FIELD_OFFSET(t,f) __builtin_offsetof(t,f)
+#define FIELD_OFFSET(t,f) ((LONG)__builtin_offsetof(t,f))
#endif
#ifndef CONTAINING_RECORD
#define CONTAINING_RECORD(address, type, field) \
@@ -2826,6 +2849,10 @@ typedef struct _CONTEXT {
} CONTEXT;
#elif defined(ARM)
+#ifndef PAGE_SIZE
+#define PAGE_SIZE 0x1000 // FIXME: This should probably go elsewhere
+#endif
+
/* The following flags control the contents of the CONTEXT structure. */
#define CONTEXT_ARM 0x0000040
@@ -2949,12 +2976,14 @@ typedef union _ULARGE_INTEGER {
typedef struct _LUID {
LARGE_INTEGER_ORDER(LONG)
} LUID, *PLUID;
-#pragma pack(push,4)
+
+#include
typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid;
DWORD Attributes;
} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
-#pragma pack(pop)
+#include
+
typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
typedef struct _PRIVILEGE_SET {
@@ -3053,6 +3082,8 @@ typedef enum tagTOKEN_TYPE {
TokenPrimary = 1,
TokenImpersonation
} TOKEN_TYPE,*PTOKEN_TYPE;
+
+#include
typedef struct _TOKEN_STATISTICS {
LUID TokenId;
LUID AuthenticationId;
@@ -3065,6 +3096,8 @@ typedef struct _TOKEN_STATISTICS {
DWORD PrivilegeCount;
LUID ModifiedId;
} TOKEN_STATISTICS, *PTOKEN_STATISTICS;
+#include
+
typedef struct _TOKEN_USER {
SID_AND_ATTRIBUTES User;
} TOKEN_USER, *PTOKEN_USER;
@@ -3432,6 +3465,7 @@ typedef struct _EVENTLOGRECORD {
DWORD DataLength;
DWORD DataOffset;
} EVENTLOGRECORD,*PEVENTLOGRECORD;
+
typedef struct _OSVERSIONINFOA {
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
@@ -3440,6 +3474,7 @@ typedef struct _OSVERSIONINFOA {
DWORD dwPlatformId;
CHAR szCSDVersion[128];
} OSVERSIONINFOA,*POSVERSIONINFOA,*LPOSVERSIONINFOA;
+
typedef struct _OSVERSIONINFOW {
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
@@ -3448,6 +3483,7 @@ typedef struct _OSVERSIONINFOW {
DWORD dwPlatformId;
WCHAR szCSDVersion[128];
} OSVERSIONINFOW,*POSVERSIONINFOW,*LPOSVERSIONINFOW;
+
typedef struct _OSVERSIONINFOEXA {
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
@@ -3461,6 +3497,7 @@ typedef struct _OSVERSIONINFOEXA {
BYTE wProductType;
BYTE wReserved;
} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
+
typedef struct _OSVERSIONINFOEXW {
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
@@ -3474,7 +3511,8 @@ typedef struct _OSVERSIONINFOEXW {
BYTE wProductType;
BYTE wReserved;
} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW;
-#pragma pack(push,2)
+
+#include
typedef struct _IMAGE_VXD_HEADER {
WORD e32_magic;
BYTE e32_border;
@@ -3528,8 +3566,8 @@ typedef struct _IMAGE_VXD_HEADER {
WORD e32_devid;
WORD e32_ddkver;
} IMAGE_VXD_HEADER,*PIMAGE_VXD_HEADER;
-#pragma pack(pop)
-#pragma pack(push,4)
+#include
+
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
@@ -3539,10 +3577,12 @@ typedef struct _IMAGE_FILE_HEADER {
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
+
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
+
typedef struct _IMAGE_OPTIONAL_HEADER32 {
WORD Magic;
BYTE MajorLinkerVersion;
@@ -3576,6 +3616,7 @@ typedef struct _IMAGE_OPTIONAL_HEADER32 {
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32;
+
typedef struct _IMAGE_OPTIONAL_HEADER64 {
WORD Magic;
BYTE MajorLinkerVersion;
@@ -3608,6 +3649,7 @@ typedef struct _IMAGE_OPTIONAL_HEADER64 {
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER64,*PIMAGE_OPTIONAL_HEADER64;
+
typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
WORD Magic;
BYTE MajorLinkerVersion;
@@ -3623,8 +3665,8 @@ typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
DWORD CprMask[4];
DWORD GpValue;
} IMAGE_ROM_OPTIONAL_HEADER,*PIMAGE_ROM_OPTIONAL_HEADER;
-#pragma pack(pop)
-#pragma pack(push,2)
+
+#include
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic;
WORD e_cblp;
@@ -3646,6 +3688,7 @@ typedef struct _IMAGE_DOS_HEADER {
WORD e_res2[10];
LONG e_lfanew;
} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
+
typedef struct _IMAGE_OS2_HEADER {
WORD ne_magic;
CHAR ne_ver;
@@ -3678,18 +3721,20 @@ typedef struct _IMAGE_OS2_HEADER {
WORD ne_swaparea;
WORD ne_expver;
} IMAGE_OS2_HEADER,*PIMAGE_OS2_HEADER;
-#pragma pack(pop)
-#pragma pack(push,4)
+#include
+
typedef struct _IMAGE_NT_HEADERS32 {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32,*PIMAGE_NT_HEADERS32;
+
typedef struct _IMAGE_NT_HEADERS64 {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER64 OptionalHeader;
} IMAGE_NT_HEADERS64,*PIMAGE_NT_HEADERS64;
+
#ifdef _WIN64
typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;
typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER;
@@ -3701,10 +3746,12 @@ typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER;
typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS;
typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
#endif
+
typedef struct _IMAGE_ROM_HEADERS {
IMAGE_FILE_HEADER FileHeader;
IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
} IMAGE_ROM_HEADERS,*PIMAGE_ROM_HEADERS;
+
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
@@ -3720,8 +3767,8 @@ typedef struct _IMAGE_SECTION_HEADER {
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
-#pragma pack(pop)
-#pragma pack(push,2)
+
+#include
typedef struct _IMAGE_SYMBOL {
union {
BYTE ShortName[8];
@@ -3737,6 +3784,15 @@ typedef struct _IMAGE_SYMBOL {
BYTE StorageClass;
BYTE NumberOfAuxSymbols;
} IMAGE_SYMBOL,*PIMAGE_SYMBOL;
+
+typedef struct _IMAGE_LINENUMBER {
+ union {
+ DWORD SymbolTableIndex;
+ DWORD VirtualAddress;
+ } Type;
+ WORD Linenumber;
+} IMAGE_LINENUMBER,*PIMAGE_LINENUMBER;
+
typedef union _IMAGE_AUX_SYMBOL {
struct {
DWORD TagIndex;
@@ -3837,6 +3893,7 @@ typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
DWORD RvaToFirstByteOfData;
DWORD RvaToLastByteOfData;
} IMAGE_COFF_SYMBOLS_HEADER,*PIMAGE_COFF_SYMBOLS_HEADER;
+
typedef struct _IMAGE_RELOCATION {
_ANONYMOUS_UNION union {
DWORD VirtualAddress;
@@ -3845,23 +3902,13 @@ typedef struct _IMAGE_RELOCATION {
DWORD SymbolTableIndex;
WORD Type;
} IMAGE_RELOCATION,*PIMAGE_RELOCATION;
-#pragma pack(pop)
-#pragma pack(push,4)
+#include
+
typedef struct _IMAGE_BASE_RELOCATION {
DWORD VirtualAddress;
DWORD SizeOfBlock;
} IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION;
-#pragma pack(pop)
-#pragma pack(push,2)
-typedef struct _IMAGE_LINENUMBER {
- union {
- DWORD SymbolTableIndex;
- DWORD VirtualAddress;
- } Type;
- WORD Linenumber;
-} IMAGE_LINENUMBER,*PIMAGE_LINENUMBER;
-#pragma pack(pop)
-#pragma pack(push,4)
+
typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
BYTE Name[16];
BYTE Date[12];
@@ -3871,6 +3918,7 @@ typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
BYTE Size[10];
BYTE EndHeader[2];
} IMAGE_ARCHIVE_MEMBER_HEADER,*PIMAGE_ARCHIVE_MEMBER_HEADER;
+
typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
@@ -3884,11 +3932,13 @@ typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD AddressOfNames;
DWORD AddressOfNameOrdinals;
} IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;
+
typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint;
BYTE Name[1];
} IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;
-#include "pshpack8.h"
+
+#include
typedef struct _IMAGE_THUNK_DATA64 {
union {
ULONGLONG ForwarderString;
@@ -3898,7 +3948,7 @@ typedef struct _IMAGE_THUNK_DATA64 {
} u1;
} IMAGE_THUNK_DATA64;
typedef IMAGE_THUNK_DATA64 *PIMAGE_THUNK_DATA64;
-#include "poppack.h"
+#include
typedef struct _IMAGE_THUNK_DATA32 {
union {
@@ -3967,16 +4017,19 @@ typedef struct _IMAGE_IMPORT_DESCRIPTOR {
DWORD Name;
ULONG FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
+
typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
DWORD TimeDateStamp;
WORD OffsetModuleName;
WORD NumberOfModuleForwarderRefs;
} IMAGE_BOUND_IMPORT_DESCRIPTOR,*PIMAGE_BOUND_IMPORT_DESCRIPTOR;
+
typedef struct _IMAGE_BOUND_FORWARDER_REF {
DWORD TimeDateStamp;
WORD OffsetModuleName;
WORD Reserved;
} IMAGE_BOUND_FORWARDER_REF,*PIMAGE_BOUND_FORWARDER_REF;
+
typedef struct _IMAGE_RESOURCE_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
@@ -4005,20 +4058,24 @@ _ANONYMOUS_STRUCT typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
} DUMMYSTRUCTNAME3;
} DUMMYUNIONNAME2;
} IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY;
+
typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
WORD Length;
CHAR NameString[1];
} IMAGE_RESOURCE_DIRECTORY_STRING,*PIMAGE_RESOURCE_DIRECTORY_STRING;
+
typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
WORD Length;
WCHAR NameString[1];
} IMAGE_RESOURCE_DIR_STRING_U,*PIMAGE_RESOURCE_DIR_STRING_U;
+
typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
DWORD OffsetToData;
DWORD Size;
DWORD CodePage;
DWORD Reserved;
} IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;
+
typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY {
DWORD Size;
DWORD TimeDateStamp;
@@ -4041,6 +4098,7 @@ typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY {
DWORD SEHandlerTable;
DWORD SEHandlerCount;
} IMAGE_LOAD_CONFIG_DIRECTORY,*PIMAGE_LOAD_CONFIG_DIRECTORY;
+
typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
DWORD BeginAddress;
DWORD EndAddress;
@@ -4048,6 +4106,7 @@ typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
PVOID HandlerData;
DWORD PrologEndAddress;
} IMAGE_RUNTIME_FUNCTION_ENTRY,*PIMAGE_RUNTIME_FUNCTION_ENTRY;
+
typedef struct _IMAGE_DEBUG_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
@@ -4058,6 +4117,7 @@ typedef struct _IMAGE_DEBUG_DIRECTORY {
DWORD AddressOfRawData;
DWORD PointerToRawData;
} IMAGE_DEBUG_DIRECTORY,*PIMAGE_DEBUG_DIRECTORY;
+
typedef struct _FPO_DATA {
DWORD ulOffStart;
DWORD cbProcSize;
@@ -4070,6 +4130,7 @@ typedef struct _FPO_DATA {
WORD reserved:1;
WORD cbFrame:2;
} FPO_DATA,*PFPO_DATA;
+
typedef struct _IMAGE_DEBUG_MISC {
DWORD DataType;
DWORD Length;
@@ -4077,11 +4138,13 @@ typedef struct _IMAGE_DEBUG_MISC {
BYTE Reserved[3];
BYTE Data[1];
} IMAGE_DEBUG_MISC,*PIMAGE_DEBUG_MISC;
+
typedef struct _IMAGE_FUNCTION_ENTRY {
DWORD StartingAddress;
DWORD EndingAddress;
DWORD EndOfPrologue;
} IMAGE_FUNCTION_ENTRY,*PIMAGE_FUNCTION_ENTRY;
+
typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
WORD Signature;
WORD Flags;
@@ -4097,7 +4160,7 @@ typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
DWORD SectionAlignment;
DWORD Reserved[2];
} IMAGE_SEPARATE_DEBUG_HEADER,*PIMAGE_SEPARATE_DEBUG_HEADER;
-#pragma pack(pop)
+
typedef enum _CM_SERVICE_NODE_TYPE {
DriverType=SERVICE_KERNEL_DRIVER,
FileSystemType=SERVICE_FILE_SYSTEM_DRIVER,
@@ -4106,6 +4169,7 @@ typedef enum _CM_SERVICE_NODE_TYPE {
AdapterType=SERVICE_ADAPTER,
RecognizerType=SERVICE_RECOGNIZER_DRIVER
} SERVICE_NODE_TYPE;
+
typedef enum _CM_SERVICE_LOAD_TYPE {
BootLoad=SERVICE_BOOT_START,
SystemLoad=SERVICE_SYSTEM_START,
@@ -4113,12 +4177,14 @@ typedef enum _CM_SERVICE_LOAD_TYPE {
DemandLoad=SERVICE_DEMAND_START,
DisableLoad=SERVICE_DISABLED
} SERVICE_LOAD_TYPE;
+
typedef enum _CM_ERROR_CONTROL_TYPE {
IgnoreError=SERVICE_ERROR_IGNORE,
NormalError=SERVICE_ERROR_NORMAL,
SevereError=SERVICE_ERROR_SEVERE,
CriticalError=SERVICE_ERROR_CRITICAL
} SERVICE_ERROR_TYPE;
+
typedef struct _NT_TIB {
struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
PVOID StackBase;
@@ -4131,6 +4197,7 @@ typedef struct _NT_TIB {
PVOID ArbitraryUserPointer;
struct _NT_TIB *Self;
} NT_TIB,*PNT_TIB;
+
typedef struct _REPARSE_GUID_DATA_BUFFER {
DWORD ReparseTag;
WORD ReparseDataLength;
@@ -4140,6 +4207,7 @@ typedef struct _REPARSE_GUID_DATA_BUFFER {
BYTE DataBuffer[1];
} GenericReparseBuffer;
} REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
+
typedef struct _REPARSE_POINT_INFORMATION {
WORD ReparseDataLength;
WORD UnparsedNameLength;
@@ -4247,14 +4315,17 @@ typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
DWORD PriorityClass;
DWORD SchedulingClass;
} JOBOBJECT_BASIC_LIMIT_INFORMATION,*PJOBOBJECT_BASIC_LIMIT_INFORMATION;
+
typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST {
DWORD NumberOfAssignedProcesses;
DWORD NumberOfProcessIdsInList;
ULONG_PTR ProcessIdList[1];
} JOBOBJECT_BASIC_PROCESS_ID_LIST, *PJOBOBJECT_BASIC_PROCESS_ID_LIST;
+
typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {
DWORD UIRestrictionsClass;
} JOBOBJECT_BASIC_UI_RESTRICTIONS,*PJOBOBJECT_BASIC_UI_RESTRICTIONS;
+
/* Steven you are my hero when you fix the w32api ddk! */
#ifndef _NTDDK_
typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {
@@ -4265,17 +4336,21 @@ typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {
PTOKEN_GROUPS RestrictedSids;
} JOBOBJECT_SECURITY_LIMIT_INFORMATION,*PJOBOBJECT_SECURITY_LIMIT_INFORMATION;
#endif
+
typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION {
DWORD EndOfJobTimeAction;
} JOBOBJECT_END_OF_JOB_TIME_INFORMATION,*PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;
+
typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT {
PVOID CompletionKey;
HANDLE CompletionPort;
} JOBOBJECT_ASSOCIATE_COMPLETION_PORT,*PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;
+
typedef struct _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION {
JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;
IO_COUNTERS IoInfo;
} JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION,*PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;
+
typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION {
JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
IO_COUNTERS IoInfo;
@@ -4284,6 +4359,7 @@ typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION {
SIZE_T PeakProcessMemoryUsed;
SIZE_T PeakJobMemoryUsed;
} JOBOBJECT_EXTENDED_LIMIT_INFORMATION,*PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;
+
typedef struct _JOBOBJECT_JOBSET_INFORMATION {
DWORD MemberLevel;
} JOBOBJECT_JOBSET_INFORMATION,*PJOBOBJECT_JOBSET_INFORMATION;
@@ -4823,7 +4899,6 @@ static __inline__ struct _TEB * NtCurrentTeb(void)
//
// NT-ARM is not documented
//
-#define KIRQL ULONG // Hack!
#include
#elif defined (_M_AMD64)
@@ -4862,7 +4937,7 @@ extern struct _TEB * NtCurrentTeb(void);
#if (_MSC_FULL_VER >= 13012035)
-DWORD __readfsdword(DWORD);
+unsigned long __readfsdword(const unsigned long Offset);
#pragma intrinsic(__readfsdword)
__inline PVOID GetCurrentFiber(void) { return (PVOID)(ULONG_PTR)__readfsdword(0x10); }
@@ -4982,10 +5057,24 @@ MemoryBarrier(VOID)
#error Unknown architecture
#endif
+VOID
+_mm_pause (
+ VOID
+ );
+
+
#if defined(_M_IX86)
+#ifdef _MSC_VER
+#pragma intrinsic(_mm_pause)
+#else
#define YieldProcessor() __asm__ __volatile__("pause");
+#endif
#elif defined (_M_AMD64)
+#ifdef _MSC_VER
+#define YieldProcessor _mm_pause
+#else
#define YieldProcessor() __asm__ __volatile__("pause");
+#endif
#elif defined(_M_PPC)
#define YieldProcessor() __asm__ __volatile__("nop");
#elif defined(_M_MIPS)
diff --git a/reactos/include/psdk/winsock2.h b/reactos/include/psdk/winsock2.h
index 01cead44a2e..6a4807181a2 100644
--- a/reactos/include/psdk/winsock2.h
+++ b/reactos/include/psdk/winsock2.h
@@ -49,6 +49,8 @@ typedef UINT_PTR SOCKET;
#define FD_SETSIZE 64
#endif
+#define WSAAPI WINAPI
+
/* shutdown() how types */
#define SD_RECEIVE 0x00
#define SD_SEND 0x01
@@ -519,6 +521,47 @@ struct sockproto {
#endif /* !WSABASEERR */
+#if !defined(NS_ALL)
+#define NS_ALL 0
+#define NS_SAP 1
+#define NS_NDS 2
+#define NS_PEER_BROWSE 3
+#define NS_SLP 5
+#define NS_DHCP 6
+#define NS_TCPIP_LOCAL 10
+#define NS_TCPIP_HOSTS 11
+#define NS_DNS 12
+#define NS_NETBT 13
+#define NS_WINS 14
+#define NS_NLA 15
+#define NS_NBP 20
+#define NS_MS 30
+#define NS_STDA 31
+#define NS_NTDS 32
+#define NS_X500 40
+#define NS_NIS 41
+#define NS_NISPLUS 42
+#define NS_WRQ 50
+#define NS_NETDES 60
+#endif /* !defined(NS_ALL) */
+
+#define LUP_DEEP 0x0001
+#define LUP_CONTAINERS 0x0002
+#define LUP_NOCONTAINERS 0x0004
+#define LUP_NEAREST 0x0008
+#define LUP_RETURN_NAME 0x0010
+#define LUP_RETURN_TYPE 0x0020
+#define LUP_RETURN_VERSION 0x0040
+#define LUP_RETURN_COMMENT 0x0080
+#define LUP_RETURN_ADDR 0x0100
+#define LUP_RETURN_BLOB 0x0200
+#define LUP_RETURN_ALIASES 0x0400
+#define LUP_RETURN_QUERY_STRING 0x0800
+#define LUP_RETURN_ALL 0x0FF0
+#define LUP_RES_SERVICE 0x8000
+#define LUP_FLUSHCACHE 0x1000
+#define LUP_FLUSHPREVIOUS 0x2000
+
#define WSANO_ADDRESS WSANO_DATA
#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
#define h_errno WSAGetLastError()
@@ -556,6 +599,13 @@ int PASCAL WSAStartup(WORD,LPWSADATA);
int PASCAL WSACleanup(void);
void PASCAL WSASetLastError(int);
int PASCAL WSAGetLastError(void);
+typedef int (WSAAPI *LPFN_WSAGETLASTERROR)(void);
+typedef int (WSAAPI *LPFN_WSACANCELBLOCKINGCALL)(void);
+typedef FARPROC (WSAAPI *LPFN_WSASETBLOCKINGHOOK)(FARPROC);
+typedef int (WSAAPI *LPFN_SELECT)(int nfds,fd_set FAR*,fd_set FAR*,fd_set FAR*,const struct timeval FAR*);
+typedef int (WSAAPI *LPFN_WSASTARTUP)(WORD,LPWSADATA);
+typedef int (WSAAPI *LPFN_WSACLEANUP)(void);
+typedef int (WSAAPI *LPFN_GETSOCKOPT)(SOCKET,int,int,char FAR*,int FAR*);
/*
* Pseudo-blocking functions are deprecated in WinSock2
* spec. Use threads instead.
@@ -647,7 +697,6 @@ typedef struct timeval *LPTIMEVAL;
#define MSG_INTERRUPT 0x10
#define MSG_MAXIOVLEN 16
-#define WSAAPI WINAPI
#define WSAEVENT HANDLE
#define LPWSAEVENT LPHANDLE
#define WSAOVERLAPPED OVERLAPPED
diff --git a/reactos/include/psdk/winspool.h b/reactos/include/psdk/winspool.h
index 5a6009fcf37..d8c91959aaf 100644
--- a/reactos/include/psdk/winspool.h
+++ b/reactos/include/psdk/winspool.h
@@ -827,6 +827,7 @@ BOOL WINAPI EnumPrintProcessorDatatypesA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD,PD
BOOL WINAPI EnumPrintProcessorDatatypesW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
BOOL WINAPI EnumPrintProcessorsA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
BOOL WINAPI EnumPrintProcessorsW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+LONG WINAPI ExtDeviceMode(HWND,HANDLE,LPDEVMODEA,LPSTR,LPSTR,LPDEVMODEA,LPSTR,DWORD);
BOOL WINAPI FindClosePrinterChangeNotification(HANDLE);
HANDLE WINAPI FindFirstPrinterChangeNotification(HANDLE,DWORD,DWORD,PVOID);
HANDLE WINAPI FindNextPrinterChangeNotification(HANDLE,PDWORD,PVOID,PVOID*);
@@ -870,6 +871,11 @@ BOOL WINAPI SetPrinterA(HANDLE,DWORD,PBYTE,DWORD);
BOOL WINAPI SetPrinterW(HANDLE,DWORD,PBYTE,DWORD);
BOOL WINAPI SetPrinterDataA(HANDLE,LPSTR,DWORD,PBYTE,DWORD);
BOOL WINAPI SetPrinterDataW(HANDLE,LPWSTR,DWORD,PBYTE,DWORD);
+#ifdef _WINE
+LPSTR WINAPI StartDocDlgA(HANDLE hPrinter, DOCINFOA *doc);
+LPWSTR WINAPI StartDocDlgW(HANDLE hPrinter, DOCINFOW *doc);
+#define StartDocDlg WINELIB_NAME_AW(StartDocDlg)
+#endif
DWORD WINAPI StartDocPrinterA(HANDLE,DWORD,PBYTE);
DWORD WINAPI StartDocPrinterW(HANDLE,DWORD,PBYTE);
BOOL WINAPI StartPagePrinter(HANDLE);
diff --git a/reactos/include/psdk/winuser.h b/reactos/include/psdk/winuser.h
index 4c8da161087..28e8e4433f9 100644
--- a/reactos/include/psdk/winuser.h
+++ b/reactos/include/psdk/winuser.h
@@ -1334,21 +1334,6 @@ extern "C" {
#define SPI_SETICONTITLELOGFONT 0x0022
#define SPI_GETFASTTASKSWITCH 0x0023
#define SPI_SETFASTTASKSWITCH 0x0024
-#define SPI_GETFILTERKEYS 0x0032
-#define SPI_SETFILTERKEYS 0x0033
-#define SPI_GETTOGGLEKEYS 0x0034
-#define SPI_SETTOGGLEKEYS 0x0035
-#define SPI_GETMOUSEKEYS 0x0036
-#define SPI_SETMOUSEKEYS 0x0037
-#define SPI_GETSHOWSOUNDS 0x0038
-#define SPI_SETSHOWSOUNDS 0x0039
-#define SPI_GETSTICKYKEYS 0x003A
-#define SPI_SETSTICKYKEYS 0x003B
-#define SPI_GETACCESSTIMEOUT 0x003C
-#define SPI_SETACCESSTIMEOUT 0x003D
-#define SPI_GETSOUNDSENTRY 0x0040
-#define SPI_SETSOUNDSENTRY 0x0041
-
#if(WINVER >= 0x0400)
#define SPI_SETDRAGFULLWINDOWS 0x0025
#define SPI_GETDRAGFULLWINDOWS 0x0026
@@ -1361,6 +1346,26 @@ extern "C" {
#define SPI_SETWORKAREA 0x002F
#define SPI_GETWORKAREA 0x0030
#define SPI_SETPENWINDOWS 0x0031
+#endif
+#define SPI_GETFILTERKEYS 0x0032
+#define SPI_SETFILTERKEYS 0x0033
+#define SPI_GETTOGGLEKEYS 0x0034
+#define SPI_SETTOGGLEKEYS 0x0035
+#define SPI_GETMOUSEKEYS 0x0036
+#define SPI_SETMOUSEKEYS 0x0037
+#define SPI_GETSHOWSOUNDS 0x0038
+#define SPI_SETSHOWSOUNDS 0x0039
+#define SPI_GETSTICKYKEYS 0x003A
+#define SPI_SETSTICKYKEYS 0x003B
+#define SPI_GETACCESSTIMEOUT 0x003C
+#define SPI_SETACCESSTIMEOUT 0x003D
+#if(WINVER >= 0x0400)
+ #define SPI_GETSERIALKEYS 0x003E
+ #define SPI_SETSERIALKEYS 0x003F
+#endif
+#define SPI_GETSOUNDSENTRY 0x0040
+#define SPI_SETSOUNDSENTRY 0x0041
+#if(WINVER >= 0x0400)
#define SPI_GETHIGHCONTRAST 0x0042
#define SPI_SETHIGHCONTRAST 0x0043
#define SPI_GETKEYBOARDPREF 0x0044
@@ -1390,17 +1395,15 @@ extern "C" {
#define SPI_GETWINDOWSEXTENSION 0x005C
#define SPI_SETMOUSETRAILS 0x005D
#define SPI_GETMOUSETRAILS 0x005E
- #define SPI_SCREENSAVERRUNNING 0x0061
- #define SPI_SETSCREENSAVERRUNNING SPI_SCREENSAVERRUNNING
- #define SPI_GETSERIALKEYS 0x003E
- #define SPI_SETSERIALKEYS 0x003F
#endif
-
#if(_WIN32_WINNT >= 0x0400)
#define SPI_GETSNAPTODEFBUTTON 0x005F
#define SPI_SETSNAPTODEFBUTTON 0x0060
#endif
-
+#if(WINVER >= 0x0400)
+ #define SPI_SCREENSAVERRUNNING 0x0061
+ #define SPI_SETSCREENSAVERRUNNING SPI_SCREENSAVERRUNNING
+#endif
#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define SPI_GETMOUSEHOVERWIDTH 0x0062
#define SPI_SETMOUSEHOVERWIDTH 0x0063
@@ -1412,20 +1415,25 @@ extern "C" {
#define SPI_SETWHEELSCROLLLINES 0x0069
#define SPI_GETMENUSHOWDELAY 0x006A
#define SPI_SETMENUSHOWDELAY 0x006B
+ #if (_WIN32_WINNT >= 0x0600)
+ #define SPI_GETWHEELSCROLLCHARS 0x006C
+ #define SPI_SETWHEELSCROLLCHARS 0x006D
+ #endif
#define SPI_GETSHOWIMEUI 0x006E
#define SPI_SETSHOWIMEUI 0x006F
- /* Correct ? */
- #define SPI_GETWHEELSCROLLCHARS 0x006C
- #define SPI_SETWHEELSCROLLCHARS 0x006D
#endif
-
#if(WINVER >= 0x0500)
#define SPI_GETMOUSESPEED 0x0070
#define SPI_SETMOUSESPEED 0x0071
#define SPI_GETSCREENSAVERRUNNING 0x0072
#define SPI_GETDESKWALLPAPER 0x0073
#endif
-
+#if(WINVER >= 0x0600)
+ #define SPI_GETAUDIODESCRIPTION 0x0074
+ #define SPI_SETAUDIODESCRIPTION 0x0075
+ #define SPI_GETSCREENSAVESECURE 0x0076
+ #define SPI_SETSCREENSAVESECURE 0x0077
+#endif
#if(WINVER >= 0x0500)
#define SPI_GETACTIVEWINDOWTRACKING 0x1000
#define SPI_SETACTIVEWINDOWTRACKING 0x1001
@@ -1455,17 +1463,6 @@ extern "C" {
#define SPI_SETTOOLTIPFADE 0x1019
#define SPI_GETCURSORSHADOW 0x101A
#define SPI_SETCURSORSHADOW 0x101B
- #define SPI_GETUIEFFECTS 0x103E
- #define SPI_SETUIEFFECTS 0x103F
- #define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000
- #define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001
- #define SPI_GETACTIVEWNDTRKTIMEOUT 0x2002
- #define SPI_SETACTIVEWNDTRKTIMEOUT 0x2003
- #define SPI_GETFOREGROUNDFLASHCOUNT 0x2004
- #define SPI_SETFOREGROUNDFLASHCOUNT 0x2005
- #define SPI_GETCARETWIDTH 0x2006
- #define SPI_SETCARETWIDTH 0x2007
-
#if(_WIN32_WINNT >= 0x0501)
#define SPI_GETMOUSESONAR 0x101C
#define SPI_SETMOUSESONAR 0x101D
@@ -1480,13 +1477,31 @@ extern "C" {
#define SPI_GETBLOCKSENDINPUTRESETS 0x1026
#define SPI_SETBLOCKSENDINPUTRESETS 0x1027
#endif
-
+ #define SPI_GETUIEFFECTS 0x103E
+ #define SPI_SETUIEFFECTS 0x103F
+ #if(_WIN32_WINNT >= 0x0600)
+ #define SPI_GETDISABLEOVERLAPPEDCONTENT 0x1040
+ #define SPI_SETDISABLEOVERLAPPEDCONTENT 0x1041
+ #define SPI_GETCLIENTAREAANIMATION 0x1042
+ #define SPI_SETCLIENTAREAANIMATION 0x1043
+ #define SPI_GETCLEARTYPE 0x1048
+ #define SPI_SETCLEARTYPE 0x1049
+ #define SPI_GETSPEECHRECOGNITION 0x104A
+ #define SPI_SETSPEECHRECOGNITION 0x104B
+ #endif
+ #define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000
+ #define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001
+ #define SPI_GETACTIVEWNDTRKTIMEOUT 0x2002
+ #define SPI_SETACTIVEWNDTRKTIMEOUT 0x2003
+ #define SPI_GETFOREGROUNDFLASHCOUNT 0x2004
+ #define SPI_SETFOREGROUNDFLASHCOUNT 0x2005
+ #define SPI_GETCARETWIDTH 0x2006
+ #define SPI_SETCARETWIDTH 0x2007
#if(_WIN32_WINNT >= 0x0501)
#define SPI_GETMOUSECLICKLOCKTIME 0x2008
#define SPI_SETMOUSECLICKLOCKTIME 0x2009
#define SPI_GETFONTSMOOTHINGTYPE 0x200A
#define SPI_SETFONTSMOOTHINGTYPE 0x200B
-
#define SPI_GETFONTSMOOTHINGCONTRAST 0x200C
#define SPI_SETFONTSMOOTHINGCONTRAST 0x200D
#define SPI_GETFOCUSBORDERWIDTH 0x200E
@@ -1923,6 +1938,9 @@ extern "C" {
#define EN_VSCROLL 1538
#define LB_ADDFILE 406
#define LB_ADDSTRING 384
+#ifdef _WINE
+#define LB_CARETOFF 420
+#endif
#define LB_DELETESTRING 386
#define LB_DIR 397
#define LB_FINDSTRING 399
@@ -2012,6 +2030,9 @@ extern "C" {
#define DCX_VALIDATE 0x200000
#define DCX_USESTYLE 0x00010000
#define DCX_EXCLUDEUPDATE 0x100
+#ifdef _WINE
+#define DCX_USESTYLE 0x10000
+#endif
#define GMDI_GOINTOPOPUPS 2
#define GMDI_USEDISABLED 1
#define FKF_AVAILABLE 2
@@ -2519,6 +2540,8 @@ extern "C" {
#endif /* (_WIN32_WINNT >= 0x0400) */
#if (WINVER >= 0x0400)
#define ENDSESSION_LOGOFF 0x80000000
+#define ENDSESSION_CRITICAL 0x40000000
+#define ENDSESSION_CLOSEAPP 0x00000001
#endif
#if (WINVER >= 0x0500)
#define CHILDID_SELF 0
@@ -2760,20 +2783,24 @@ typedef void(CALLBACK *SENDASYNCPROC)(HWND,UINT,DWORD,LRESULT);
DECLARE_HANDLE(HHOOK);
DECLARE_HANDLE(HDWP);
DECLARE_HANDLE(HDEVNOTIFY);
+
typedef struct tagACCEL {
BYTE fVirt;
WORD key;
WORD cmd;
} ACCEL,*LPACCEL;
+
typedef struct tagACCESSTIMEOUT {
UINT cbSize;
DWORD dwFlags;
DWORD iTimeOutMSec;
} ACCESSTIMEOUT, *LPACCESSTIMEOUT;
+
typedef struct tagANIMATIONINFO {
UINT cbSize;
int iMinAnimate;
} ANIMATIONINFO,*LPANIMATIONINFO;
+
typedef struct tagCREATESTRUCTA {
LPVOID lpCreateParams;
HINSTANCE hInstance;
@@ -2788,6 +2815,7 @@ typedef struct tagCREATESTRUCTA {
LPCSTR lpszClass;
DWORD dwExStyle;
} CREATESTRUCTA,*LPCREATESTRUCTA;
+
typedef struct tagCREATESTRUCTW {
LPVOID lpCreateParams;
HINSTANCE hInstance;
@@ -2802,22 +2830,27 @@ typedef struct tagCREATESTRUCTW {
LPCWSTR lpszClass;
DWORD dwExStyle;
} CREATESTRUCTW,*LPCREATESTRUCTW;
+
typedef struct tagCBT_CREATEWNDA {
LPCREATESTRUCTA lpcs;
HWND hwndInsertAfter;
} CBT_CREATEWNDA, *LPCBT_CREATEWNDA;
+
typedef struct tagCBT_CREATEWNDW {
LPCREATESTRUCTW lpcs;
HWND hwndInsertAfter;
} CBT_CREATEWNDW, *LPCBT_CREATEWNDW;
+
typedef struct tagCBTACTIVATESTRUCT {
BOOL fMouse;
HWND hWndActive;
} CBTACTIVATESTRUCT,*LPCBTACTIVATESTRUCT;
+
typedef struct tagCLIENTCREATESTRUCT {
HANDLE hWindowMenu;
UINT idFirstChild;
} CLIENTCREATESTRUCT,*LPCLIENTCREATESTRUCT;
+
typedef struct tagCOMPAREITEMSTRUCT {
UINT CtlType;
UINT CtlID;
@@ -2828,11 +2861,13 @@ typedef struct tagCOMPAREITEMSTRUCT {
ULONG_PTR itemData2;
DWORD dwLocaleId;
} COMPAREITEMSTRUCT,*LPCOMPAREITEMSTRUCT;
+
typedef struct tagCOPYDATASTRUCT {
ULONG_PTR dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT,*PCOPYDATASTRUCT;
+
typedef struct tagCURSORSHAPE {
int xHotSpot;
int yHotSpot;
@@ -2842,6 +2877,7 @@ typedef struct tagCURSORSHAPE {
BYTE Planes;
BYTE BitsPixel;
} CURSORSHAPE,*LPCURSORSHAPE;
+
typedef struct tagCWPRETSTRUCT {
LRESULT lResult;
LPARAM lParam;
@@ -2849,12 +2885,14 @@ typedef struct tagCWPRETSTRUCT {
DWORD message;
HWND hwnd;
} CWPRETSTRUCT,*PCWPRETSTRUCT, *LPCWPRETSTRUCT;
+
typedef struct tagCWPSTRUCT {
LPARAM lParam;
WPARAM wParam;
UINT message;
HWND hwnd;
} CWPSTRUCT,*PCWPSTRUCT, *LPCWPSTRUCT;
+
typedef struct tagDEBUGHOOKINFO {
DWORD idThread;
DWORD idThreadInstaller;
@@ -2862,6 +2900,7 @@ typedef struct tagDEBUGHOOKINFO {
WPARAM wParam;
int code;
} DEBUGHOOKINFO,*PDEBUGHOOKINFO,*LPDEBUGHOOKINFO;
+
typedef struct tagDELETEITEMSTRUCT {
UINT CtlType;
UINT CtlID;
@@ -2869,7 +2908,8 @@ typedef struct tagDELETEITEMSTRUCT {
HWND hwndItem;
ULONG_PTR itemData;
} DELETEITEMSTRUCT,*PDELETEITEMSTRUCT,*LPDELETEITEMSTRUCT;
-#pragma pack(push,2)
+
+#include
typedef struct {
DWORD style;
DWORD dwExtendedStyle;
@@ -2879,6 +2919,7 @@ typedef struct {
short cy;
WORD id;
} DLGITEMTEMPLATE,*LPDLGITEMTEMPLATE;
+
typedef struct {
DWORD style;
DWORD dwExtendedStyle;
@@ -2888,14 +2929,17 @@ typedef struct {
short cx;
short cy;
} DLGTEMPLATE,*LPDLGTEMPLATE,*LPDLGTEMPLATEA,*LPDLGTEMPLATEW;
+
typedef const DLGTEMPLATE *LPCDLGTEMPLATEA;
typedef const DLGTEMPLATE *LPCDLGTEMPLATEW;
+
#ifdef UNICODE
typedef LPCDLGTEMPLATEW LPCDLGTEMPLATE;
#else
typedef LPCDLGTEMPLATEA LPCDLGTEMPLATE;
#endif // UNICODE
-#pragma pack(pop)
+#include
+
typedef struct tagDRAWITEMSTRUCT {
UINT CtlType;
UINT CtlID;
@@ -2907,6 +2951,7 @@ typedef struct tagDRAWITEMSTRUCT {
RECT rcItem;
ULONG_PTR itemData;
} DRAWITEMSTRUCT,*LPDRAWITEMSTRUCT,*PDRAWITEMSTRUCT;
+
typedef struct {
UINT cbSize;
int iTabLength;
@@ -2914,6 +2959,7 @@ typedef struct {
int iRightMargin;
UINT uiLengthDrawn;
} DRAWTEXTPARAMS,*LPDRAWTEXTPARAMS;
+
typedef struct tagPAINTSTRUCT {
HDC hdc;
BOOL fErase;
@@ -2922,6 +2968,7 @@ typedef struct tagPAINTSTRUCT {
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT,*LPPAINTSTRUCT;
+
typedef struct tagMSG {
HWND hwnd;
UINT message;
@@ -2930,6 +2977,7 @@ typedef struct tagMSG {
DWORD time;
POINT pt;
} MSG,*LPMSG,*PMSG;
+
typedef struct _ICONINFO {
BOOL fIcon;
DWORD xHotspot;
@@ -2937,11 +2985,13 @@ typedef struct _ICONINFO {
HBITMAP hbmMask;
HBITMAP hbmColor;
} ICONINFO,*PICONINFO;
+
typedef struct tagNMHDR {
HWND hwndFrom;
UINT_PTR idFrom;
UINT code;
} NMHDR,*LPNMHDR;
+
typedef struct _WNDCLASSA {
UINT style;
WNDPROC lpfnWndProc;
@@ -2954,6 +3004,7 @@ typedef struct _WNDCLASSA {
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
} WNDCLASSA,*LPWNDCLASSA,*PWNDCLASSA;
+
typedef struct _WNDCLASSW {
UINT style;
WNDPROC lpfnWndProc;
@@ -2966,6 +3017,7 @@ typedef struct _WNDCLASSW {
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
} WNDCLASSW,*LPWNDCLASSW,*PWNDCLASSW;
+
typedef struct _WNDCLASSEXA {
UINT cbSize;
UINT style;
@@ -2980,6 +3032,7 @@ typedef struct _WNDCLASSEXA {
LPCSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEXA,*LPWNDCLASSEXA,*PWNDCLASSEXA;
+
typedef struct _WNDCLASSEXW {
UINT cbSize;
UINT style;
@@ -2994,6 +3047,7 @@ typedef struct _WNDCLASSEXW {
LPCWSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEXW,*LPWNDCLASSEXW,*PWNDCLASSEXW;
+
typedef struct tagMENUITEMINFOA {
UINT cbSize;
UINT fMask;
@@ -3011,6 +3065,7 @@ typedef struct tagMENUITEMINFOA {
#endif
} MENUITEMINFOA,*LPMENUITEMINFOA;
typedef const MENUITEMINFOA *LPCMENUITEMINFOA;
+
typedef struct tagMENUITEMINFOW {
UINT cbSize;
UINT fMask;
@@ -3027,7 +3082,9 @@ typedef struct tagMENUITEMINFOW {
HBITMAP hbmpItem;
#endif
} MENUITEMINFOW,*LPMENUITEMINFOW;
+
typedef const MENUITEMINFOW *LPCMENUITEMINFOW;
+
typedef struct tagSCROLLINFO {
UINT cbSize;
UINT fMask;
@@ -3038,6 +3095,7 @@ typedef struct tagSCROLLINFO {
int nTrackPos;
} SCROLLINFO,*LPSCROLLINFO;
typedef const SCROLLINFO *LPCSCROLLINFO;
+
typedef struct _WINDOWPLACEMENT {
UINT length;
UINT flags;
@@ -3046,16 +3104,20 @@ typedef struct _WINDOWPLACEMENT {
POINT ptMaxPosition;
RECT rcNormalPosition;
} WINDOWPLACEMENT,*LPWINDOWPLACEMENT,*PWINDOWPLACEMENT;
+
typedef struct {
WORD versionNumber;
WORD offset;
} MENUITEMTEMPLATEHEADER;
+
typedef struct {
WORD mtOption;
WORD mtID;
WCHAR mtString[1];
} MENUITEMTEMPLATE;
+
typedef void MENUTEMPLATE,MENUTEMPLATEA,MENUTEMPLATEW,*LPMENUTEMPLATEA,*LPMENUTEMPLATEW,*LPMENUTEMPLATE;
+
typedef struct tagHELPINFO {
UINT cbSize;
int iContextType;
@@ -3064,7 +3126,9 @@ typedef struct tagHELPINFO {
DWORD_PTR dwContextId;
POINT MousePos;
} HELPINFO,*LPHELPINFO;
+
typedef void(CALLBACK *MSGBOXCALLBACK)(LPHELPINFO);
+
typedef struct {
UINT cbSize;
HWND hwndOwner;
@@ -3077,6 +3141,7 @@ typedef struct {
MSGBOXCALLBACK lpfnMsgBoxCallback;
DWORD dwLanguageId;
} MSGBOXPARAMSA,*PMSGBOXPARAMSA,*LPMSGBOXPARAMSA;
+
typedef struct {
UINT cbSize;
HWND hwndOwner;
@@ -3089,11 +3154,13 @@ typedef struct {
MSGBOXCALLBACK lpfnMsgBoxCallback;
DWORD dwLanguageId;
} MSGBOXPARAMSW,*PMSGBOXPARAMSW,*LPMSGBOXPARAMSW;
+
typedef struct tagUSEROBJECTFLAGS {
BOOL fInherit;
BOOL fReserved;
DWORD dwFlags;
} USEROBJECTFLAGS;
+
typedef struct tagFILTERKEYS {
UINT cbSize;
DWORD dwFlags;
@@ -3102,16 +3169,19 @@ typedef struct tagFILTERKEYS {
DWORD iRepeatMSec;
DWORD iBounceMSec;
} FILTERKEYS, *LPFILTERKEYS;
+
typedef struct tagHIGHCONTRASTA {
UINT cbSize;
DWORD dwFlags;
LPSTR lpszDefaultScheme;
} HIGHCONTRASTA,*LPHIGHCONTRASTA;
+
typedef struct tagHIGHCONTRASTW {
UINT cbSize;
DWORD dwFlags;
LPWSTR lpszDefaultScheme;
} HIGHCONTRASTW,*LPHIGHCONTRASTW;
+
#if defined(_WINGDI_) && !defined(NOGDI)
typedef struct tagICONMETRICSA {
UINT cbSize;
@@ -3120,6 +3190,7 @@ typedef struct tagICONMETRICSA {
int iTitleWrap;
LOGFONTA lfFont;
} ICONMETRICSA, *PICONMETRICSA, *LPICONMETRICSA;
+
typedef struct tagICONMETRICSW {
UINT cbSize;
int iHorzSpacing;
@@ -3127,12 +3198,14 @@ typedef struct tagICONMETRICSW {
int iTitleWrap;
LOGFONTW lfFont;
} ICONMETRICSW, *PICONMETRICSW, *LPICONMETRICSW;
+
#ifdef UNICODE
typedef ICONMETRICSW ICONMETRICS,*LPICONMETRICS;
#else /* UNICODE */
typedef ICONMETRICSA ICONMETRICS,*LPICONMETRICS;
#endif /* UNICODE */
#endif /* NOGDI */
+
typedef struct tagMINIMIZEDMETRICS {
UINT cbSize;
int iWidth;
@@ -3140,6 +3213,7 @@ typedef struct tagMINIMIZEDMETRICS {
int iVertGap;
int iArrange;
} MINIMIZEDMETRICS,*LPMINIMIZEDMETRICS;
+
typedef struct tagMOUSEKEYS{
UINT cbSize;
DWORD dwFlags;
@@ -3149,6 +3223,7 @@ typedef struct tagMOUSEKEYS{
DWORD dwReserved1;
DWORD dwReserved2;
} MOUSEKEYS,*LPMOUSEKEYS;
+
#if defined(_WINGDI_) && !defined(NOGDI)
typedef struct tagNONCLIENTMETRICSA {
UINT cbSize;
@@ -3167,6 +3242,7 @@ typedef struct tagNONCLIENTMETRICSA {
LOGFONTA lfStatusFont;
LOGFONTA lfMessageFont;
} NONCLIENTMETRICSA,*LPNONCLIENTMETRICSA;
+
typedef struct tagNONCLIENTMETRICSW {
UINT cbSize;
int iBorderWidth;
@@ -3184,12 +3260,14 @@ typedef struct tagNONCLIENTMETRICSW {
LOGFONTW lfStatusFont;
LOGFONTW lfMessageFont;
} NONCLIENTMETRICSW,*LPNONCLIENTMETRICSW;
+
#ifdef UNICODE
typedef NONCLIENTMETRICSW NONCLIENTMETRICS,*LPNONCLIENTMETRICS;
#else /* UNICODE */
typedef NONCLIENTMETRICSA NONCLIENTMETRICS,*LPNONCLIENTMETRICS;
#endif /* UNICODE */
#endif
+
typedef struct tagSERIALKEYSA {
UINT cbSize;
DWORD dwFlags;
@@ -3199,6 +3277,7 @@ typedef struct tagSERIALKEYSA {
UINT iPortState;
UINT iActive;
} SERIALKEYSA,*LPSERIALKEYSA;
+
typedef struct tagSERIALKEYSW {
UINT cbSize;
DWORD dwFlags;
@@ -3208,6 +3287,7 @@ typedef struct tagSERIALKEYSW {
UINT iPortState;
UINT iActive;
} SERIALKEYSW,*LPSERIALKEYSW;
+
typedef struct tagSOUNDSENTRYA {
UINT cbSize;
DWORD dwFlags;
@@ -3222,6 +3302,7 @@ typedef struct tagSOUNDSENTRYA {
LPSTR lpszWindowsEffectDLL;
DWORD iWindowsEffectOrdinal;
} SOUNDSENTRYA,*LPSOUNDSENTRYA;
+
typedef struct tagSOUNDSENTRYW {
UINT cbSize;
DWORD dwFlags;
@@ -3236,20 +3317,24 @@ typedef struct tagSOUNDSENTRYW {
LPWSTR lpszWindowsEffectDLL;
DWORD iWindowsEffectOrdinal;
} SOUNDSENTRYW,*LPSOUNDSENTRYW;
+
typedef struct tagSTICKYKEYS {
DWORD cbSize;
DWORD dwFlags;
} STICKYKEYS,*LPSTICKYKEYS;
+
typedef struct tagTOGGLEKEYS {
DWORD cbSize;
DWORD dwFlags;
} TOGGLEKEYS, *LPTOGGLEKEYS;
+
typedef struct tagMOUSEHOOKSTRUCT {
POINT pt;
HWND hwnd;
UINT wHitTestCode;
ULONG_PTR dwExtraInfo;
} MOUSEHOOKSTRUCT,*LPMOUSEHOOKSTRUCT,*PMOUSEHOOKSTRUCT;
+
#if ( _WIN32_WINNT >= 0x0500 )
#ifdef __cplusplus
typedef struct tagMOUSEHOOKSTRUCTEX : public tagMOUSEHOOKSTRUCT
@@ -3264,16 +3349,19 @@ typedef struct tagMOUSEHOOKSTRUCTEX
} MOUSEHOOKSTRUCTEX, *LPMOUSEHOOKSTRUCTEX, *PMOUSEHOOKSTRUCTEX;
#endif
#endif
+
typedef struct tagTRACKMOUSEEVENT {
DWORD cbSize;
DWORD dwFlags;
HWND hwndTrack;
DWORD dwHoverTime;
} TRACKMOUSEEVENT,*LPTRACKMOUSEEVENT;
+
typedef struct tagTPMPARAMS {
UINT cbSize;
RECT rcExclude;
} TPMPARAMS,*LPTPMPARAMS;
+
typedef struct tagEVENTMSG {
UINT message;
UINT paramL;
@@ -3281,6 +3369,7 @@ typedef struct tagEVENTMSG {
DWORD time;
HWND hwnd;
} EVENTMSG,*PEVENTMSGMSG,*LPEVENTMSGMSG,*PEVENTMSG,*LPEVENTMSG;
+
typedef struct _WINDOWPOS {
HWND hwnd;
HWND hwndInsertAfter;
@@ -3290,10 +3379,12 @@ typedef struct _WINDOWPOS {
int cy;
UINT flags;
} WINDOWPOS,*PWINDOWPOS,*LPWINDOWPOS;
+
typedef struct tagNCCALCSIZE_PARAMS {
RECT rgrc[3];
PWINDOWPOS lppos;
} NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS;
+
typedef struct tagMDICREATESTRUCTA {
LPCSTR szClass;
LPCSTR szTitle;
@@ -3305,6 +3396,7 @@ typedef struct tagMDICREATESTRUCTA {
DWORD style;
LPARAM lParam;
} MDICREATESTRUCTA,*LPMDICREATESTRUCTA;
+
typedef struct tagMDICREATESTRUCTW {
LPCWSTR szClass;
LPCWSTR szTitle;
@@ -3316,6 +3408,7 @@ typedef struct tagMDICREATESTRUCTW {
DWORD style;
LPARAM lParam;
} MDICREATESTRUCTW,*LPMDICREATESTRUCTW;
+
typedef struct tagMINMAXINFO {
POINT ptReserved;
POINT ptMaxSize;
@@ -3323,11 +3416,13 @@ typedef struct tagMINMAXINFO {
POINT ptMinTrackSize;
POINT ptMaxTrackSize;
} MINMAXINFO,*PMINMAXINFO,*LPMINMAXINFO;
+
typedef struct tagMDINEXTMENU {
HMENU hmenuIn;
HMENU hmenuNext;
HWND hwndNext;
} MDINEXTMENU,*PMDINEXTMENU,*LPMDINEXTMENU;
+
typedef struct tagMEASUREITEMSTRUCT {
UINT CtlType;
UINT CtlID;
@@ -3336,6 +3431,7 @@ typedef struct tagMEASUREITEMSTRUCT {
UINT itemHeight;
ULONG_PTR itemData;
} MEASUREITEMSTRUCT,*PMEASUREITEMSTRUCT,*LPMEASUREITEMSTRUCT;
+
typedef struct tagDROPSTRUCT {
HWND hwndSource;
HWND hwndSink;
@@ -3344,17 +3440,20 @@ typedef struct tagDROPSTRUCT {
POINT ptDrop;
DWORD dwControlData;
} DROPSTRUCT,*PDROPSTRUCT,*LPDROPSTRUCT;
+
typedef DWORD HELPPOLY;
typedef struct tagMULTIKEYHELPA {
DWORD mkSize;
CHAR mkKeylist;
CHAR szKeyphrase[1];
} MULTIKEYHELPA,*PMULTIKEYHELPA,*LPMULTIKEYHELPA;
+
typedef struct tagMULTIKEYHELPW {
DWORD mkSize;
WCHAR mkKeylist;
WCHAR szKeyphrase[1];
} MULTIKEYHELPW,*PMULTIKEYHELPW,*LPMULTIKEYHELPW;
+
typedef struct tagHELPWININFOA {
int wStructSize;
int x;
@@ -3364,6 +3463,7 @@ typedef struct tagHELPWININFOA {
int wMax;
CHAR rgchMember[2];
} HELPWININFOA,*PHELPWININFOA,*LPHELPWININFOA;
+
typedef struct tagHELPWININFOW {
int wStructSize;
int x;
@@ -3373,10 +3473,12 @@ typedef struct tagHELPWININFOW {
int wMax;
WCHAR rgchMember[2];
} HELPWININFOW,*PHELPWININFOW,*LPHELPWININFOW;
+
typedef struct tagSTYLESTRUCT {
DWORD styleOld;
DWORD styleNew;
} STYLESTRUCT,*LPSTYLESTRUCT;
+
typedef struct tagALTTABINFO {
DWORD cbSize;
int cItems;
@@ -3388,6 +3490,7 @@ typedef struct tagALTTABINFO {
int cyItem;
POINT ptStart;
} ALTTABINFO,*PALTTABINFO,*LPALTTABINFO;
+
typedef struct tagCOMBOBOXINFO {
DWORD cbSize;
RECT rcItem;
@@ -3397,12 +3500,14 @@ typedef struct tagCOMBOBOXINFO {
HWND hwndItem;
HWND hwndList;
} COMBOBOXINFO,*PCOMBOBOXINFO,*LPCOMBOBOXINFO;
+
typedef struct tagCURSORINFO {
DWORD cbSize;
DWORD flags;
HCURSOR hCursor;
POINT ptScreenPos;
} CURSORINFO,*PCURSORINFO,*LPCURSORINFO;
+
typedef struct tagMENUBARINFO {
DWORD cbSize;
RECT rcBar;
@@ -3411,6 +3516,7 @@ typedef struct tagMENUBARINFO {
BOOL fBarFocused:1;
BOOL fFocused:1;
} MENUBARINFO,*PMENUBARINFO;
+
typedef struct tagMENUINFO {
DWORD cbSize;
DWORD fMask;
@@ -3420,8 +3526,10 @@ typedef struct tagMENUINFO {
DWORD dwContextHelpID;
ULONG_PTR dwMenuData;
} MENUINFO,*LPMENUINFO;
+
typedef MENUINFO CONST *LPCMENUINFO;
#define CCHILDREN_SCROLLBAR 5
+
typedef struct tagSCROLLBARINFO {
DWORD cbSize;
RECT rcScrollBar;
@@ -3431,12 +3539,15 @@ typedef struct tagSCROLLBARINFO {
int reserved;
DWORD rgstate[CCHILDREN_SCROLLBAR+1];
} SCROLLBARINFO,*PSCROLLBARINFO,*LPSCROLLBARINFO;
+
#define CCHILDREN_TITLEBAR 5
+
typedef struct tagTITLEBARINFO {
DWORD cbSize;
RECT rcTitleBar;
DWORD rgstate[CCHILDREN_TITLEBAR+1];
} TITLEBARINFO,*PTITLEBARINFO,*LPTITLEBARINFO;
+
typedef struct tagWINDOWINFO {
DWORD cbSize;
RECT rcWindow;
@@ -3449,16 +3560,19 @@ typedef struct tagWINDOWINFO {
ATOM atomWindowType;
WORD wCreatorVersion;
} WINDOWINFO,*PWINDOWINFO,*LPWINDOWINFO;
+
typedef struct tagLASTINPUTINFO {
UINT cbSize;
DWORD dwTime;
} LASTINPUTINFO,*PLASTINPUTINFO;
+
typedef struct tagMONITORINFO {
DWORD cbSize;
RECT rcMonitor;
RECT rcWork;
DWORD dwFlags;
} MONITORINFO,*LPMONITORINFO;
+
#define CCHDEVICENAME 32
typedef struct tagMONITORINFOEXA {
DWORD cbSize;
@@ -3467,6 +3581,7 @@ typedef struct tagMONITORINFOEXA {
DWORD dwFlags;
CHAR szDevice[CCHDEVICENAME];
} MONITORINFOEXA,*LPMONITORINFOEXA;
+
typedef struct tagMONITORINFOEXW {
DWORD cbSize;
RECT rcMonitor;
@@ -3474,6 +3589,7 @@ typedef struct tagMONITORINFOEXW {
DWORD dwFlags;
WCHAR szDevice[CCHDEVICENAME];
} MONITORINFOEXW,*LPMONITORINFOEXW;
+
typedef struct tagKBDLLHOOKSTRUCT {
DWORD vkCode;
DWORD scanCode;
@@ -3481,6 +3597,7 @@ typedef struct tagKBDLLHOOKSTRUCT {
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT,*LPKBDLLHOOKSTRUCT,*PKBDLLHOOKSTRUCT;
+
typedef struct tagMSLLHOOKSTRUCT
{
POINT pt;
@@ -3489,6 +3606,7 @@ typedef struct tagMSLLHOOKSTRUCT
DWORD time;
ULONG_PTR dwExtraInfo;
} MSLLHOOKSTRUCT, *LPMSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;
+
#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410)
typedef struct {
UINT cbSize;
@@ -3498,6 +3616,7 @@ typedef struct {
DWORD dwTimeout;
} FLASHWINFO,*PFLASHWINFO;
#endif /* (WINVER >= 0x0500 || _WIN32_WINDOWS >= 0x0410) */
+
#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0490)
typedef struct tagMOUSEMOVEPOINT {
int x;
@@ -3506,6 +3625,7 @@ typedef struct tagMOUSEMOVEPOINT {
ULONG_PTR dwExtraInfo;
} MOUSEMOVEPOINT,*PMOUSEMOVEPOINT,*LPMOUSEMOVEPOINT;
#endif
+
#if (_WIN32_WINNT >= 0x0400)
typedef struct tagMOUSEINPUT {
LONG dx;
@@ -3515,6 +3635,7 @@ typedef struct tagMOUSEINPUT {
DWORD time;
ULONG_PTR dwExtraInfo;
} MOUSEINPUT,*PMOUSEINPUT;
+
typedef struct tagKEYBDINPUT {
WORD wVk;
WORD wScan;
@@ -3522,11 +3643,13 @@ typedef struct tagKEYBDINPUT {
DWORD time;
ULONG_PTR dwExtraInfo;
} KEYBDINPUT,*PKEYBDINPUT;
+
typedef struct tagHARDWAREINPUT {
DWORD uMsg;
WORD wParamL;
WORD wParamH;
} HARDWAREINPUT,*PHARDWAREINPUT;
+
typedef struct tagINPUT {
DWORD type;
_ANONYMOUS_UNION union {
@@ -3536,6 +3659,7 @@ typedef struct tagINPUT {
} DUMMYUNIONNAME;
} INPUT,*PINPUT,*LPINPUT;
#endif /* (_WIN32_WINNT >= 0x0400) */
+
#if (WINVER >= 0x0500)
typedef struct tagGUITHREADINFO {
DWORD cbSize;
@@ -3548,8 +3672,10 @@ typedef struct tagGUITHREADINFO {
HWND hwndCaret;
RECT rcCaret;
} GUITHREADINFO,*PGUITHREADINFO,*LPGUITHREADINFO;
+
typedef VOID (CALLBACK *WINEVENTPROC)(HWINEVENTHOOK,DWORD,HWND,LONG,LONG,DWORD,DWORD);
#endif /* (WINVER >= 0x0500) */
+
#if (_WIN32_WINNT >= 0x0501)
typedef struct {
UINT cbSize;
@@ -3558,12 +3684,14 @@ typedef struct {
LUID luid;
} BSMINFO,*PBSMINFO;
DECLARE_HANDLE(HRAWINPUT);
+
typedef struct tagRAWINPUTHEADER {
DWORD dwType;
DWORD dwSize;
HANDLE hDevice;
WPARAM wParam;
} RAWINPUTHEADER,*PRAWINPUTHEADER;
+
typedef struct tagRAWMOUSE {
USHORT usFlags;
_ANONYMOUS_UNION union {
@@ -3578,6 +3706,7 @@ typedef struct tagRAWMOUSE {
LONG lLastY;
ULONG ulExtraInformation;
} RAWMOUSE,*PRAWMOUSE,*LPRAWMOUSE;
+
typedef struct tagRAWKEYBOARD {
USHORT MakeCode;
USHORT Flags;
@@ -3586,11 +3715,13 @@ typedef struct tagRAWKEYBOARD {
UINT Message;
ULONG ExtraInformation;
} RAWKEYBOARD,*PRAWKEYBOARD,*LPRAWKEYBOARD;
+
typedef struct tagRAWHID {
DWORD dwSizeHid;
DWORD dwCount;
BYTE bRawData;
} RAWHID,*PRAWHID,*LPRAWHID;
+
typedef struct tagRAWINPUT {
RAWINPUTHEADER header;
union {
@@ -3599,13 +3730,16 @@ typedef struct tagRAWINPUT {
RAWHID hid;
} data;
} RAWINPUT,*PRAWINPUT,*LPRAWINPUT;
+
typedef struct tagRAWINPUTDEVICE {
USHORT usUsagePage;
USHORT usUsage;
DWORD dwFlags;
HWND hwndTarget;
} RAWINPUTDEVICE,*PRAWINPUTDEVICE,*LPRAWINPUTDEVICE;
+
typedef const RAWINPUTDEVICE *PCRAWINPUTDEVICE;
+
typedef struct tagRAWINPUTDEVICELIST {
HANDLE hDevice;
DWORD dwType;
@@ -4137,6 +4271,8 @@ BOOL WINAPI PostThreadMessageW(DWORD,UINT,WPARAM,LPARAM);
#if (_WIN32_WINNT >= 0x0501)
BOOL WINAPI PrintWindow(HWND,HDC,UINT);
#endif
+UINT WINAPI PrivateExtractIconsA(LPCSTR,int,int,int,HICON*,UINT*,UINT,UINT);
+UINT WINAPI PrivateExtractIconsW(LPCWSTR,int,int,int,HICON*,UINT*,UINT,UINT);
BOOL WINAPI PtInRect(LPCRECT,POINT);
HWND WINAPI RealChildWindowFromPoint(HWND,POINT);
UINT WINAPI RealGetWindowClassA(HWND,LPSTR,UINT);
@@ -4258,6 +4394,7 @@ int WINAPI SetWindowRgn(HWND,HRGN,BOOL);
HHOOK WINAPI SetWindowsHookA(int,HOOKPROC);
HHOOK WINAPI SetWindowsHookExA(int,HOOKPROC,HINSTANCE,DWORD);
HHOOK WINAPI SetWindowsHookExW(int,HOOKPROC,HINSTANCE,DWORD);
+HHOOK WINAPI SetWindowsHookW(int,HOOKPROC);
BOOL WINAPI SetWindowTextA(HWND,LPCSTR);
BOOL WINAPI SetWindowTextW(HWND,LPCWSTR);
WORD WINAPI SetWindowWord(HWND,int,WORD);
@@ -4312,6 +4449,9 @@ SHORT WINAPI VkKeyScanW(WCHAR);
DWORD WINAPI WaitForInputIdle(HANDLE,DWORD);
BOOL WINAPI WaitMessage(void);
HWND WINAPI WindowFromDC(HDC hDC);
+#if (_WIN32_WINNT >= 0x0600)
+HWND WINAPI WindowFromPhysicalPoint(POINT);
+#endif
HWND WINAPI WindowFromPoint(POINT);
UINT WINAPI WinExec(LPCSTR,UINT);
BOOL WINAPI WinHelpA(HWND,LPCSTR,UINT,ULONG_PTR);
@@ -4473,6 +4613,7 @@ typedef MONITORINFOEXW MONITORINFOEX, *LPMONITORINFOEX;
#define PostAppMessage PostAppMessageW
#define PostMessage PostMessageW
#define PostThreadMessage PostThreadMessageW
+#define PrivateExtractIcons PrivateExtractIconsW
#define RealGetWindowClass RealGetWindowClassW
#define RegisterClass RegisterClassW
#define RegisterClassEx RegisterClassExW
@@ -4640,6 +4781,7 @@ typedef MONITORINFOEXA MONITORINFOEX, *LPMONITORINFOEX;
#define PostAppMessage PostAppMessageA
#define PostMessage PostMessageA
#define PostThreadMessage PostThreadMessageA
+#define PrivateExtractIcons PrivateExtractIconsA
#define RealGetWindowClass RealGetWindowClassA
#define RegisterClass RegisterClassA
#define RegisterClassEx RegisterClassExA
diff --git a/reactos/include/psdk/ws2spi.h b/reactos/include/psdk/ws2spi.h
index dc317de1466..b02ba931daa 100644
--- a/reactos/include/psdk/ws2spi.h
+++ b/reactos/include/psdk/ws2spi.h
@@ -113,13 +113,39 @@ typedef struct _WSPPROC_TABLE {
LPWSPSTRINGTOADDRESS lpWSPStringToAddress;
} WSPPROC_TABLE, FAR* LPWSPPROC_TABLE;
+/* Prototypes for service provider namespace procedure table */
+typedef INT (WSAAPI *LPNSPCLEANUP)(LPGUID);
+typedef INT (WSAAPI *LPNSPLOOKUPSERVICEBEGIN)(LPGUID,LPWSAQUERYSETW,LPWSASERVICECLASSINFOW,DWORD,LPHANDLE);
+typedef INT (WSAAPI *LPNSPLOOKUPSERVICENEXT)(HANDLE,DWORD,LPDWORD,LPWSAQUERYSETW);
+typedef INT (WSAAPI *LPNSPLOOKUPSERVICEEND)(HANDLE);
+typedef INT (WSAAPI *LPNSPSETSERVICE)(LPGUID,LPWSASERVICECLASSINFOW,LPWSAQUERYSETW,WSAESETSERVICEOP,DWORD);
+typedef INT (WSAAPI *LPNSPINSTALLSERVICECLASS)(LPGUID,LPWSASERVICECLASSINFOW);
+typedef INT (WSAAPI *LPNSPREMOVESERVICECLASS)(LPGUID,LPGUID);
+typedef INT (WSAAPI *LPNSPGETSERVICECLASSINFO)(LPGUID,LPDWORD,LPWSASERVICECLASSINFOW);
+typedef INT (WSAAPI *LPNSPIOCTL)(HANDLE,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION,LPWSATHREADID);
+
+typedef struct _NSP_ROUTINE {
+ DWORD cbSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ LPNSPCLEANUP NSPCleanup;
+ LPNSPLOOKUPSERVICEBEGIN NSPLookupServiceBegin;
+ LPNSPLOOKUPSERVICENEXT NSPLookupServiceNext;
+ LPNSPLOOKUPSERVICEEND NSPLookupServiceEnd;
+ LPNSPSETSERVICE NSPSetService;
+ LPNSPINSTALLSERVICECLASS NSPInstallServiceClass;
+ LPNSPREMOVESERVICECLASS NSPRemoveServiceClass;
+ LPNSPGETSERVICECLASSINFO NSPGetServiceClassInfo;
+ LPNSPIOCTL NSPIoctl;
+} NSP_ROUTINE, *PNSP_ROUTINE, FAR* LPNSP_ROUTINE;
+
/* Prototypes for service provider upcall procedure table */
typedef BOOL (WSPAPI *LPWPUCLOSEEVENT)(WSAEVENT,LPINT);
typedef INT (WSPAPI *LPWPUCLOSESOCKETHANDLE)(SOCKET,LPINT);
typedef INT (WSPAPI *LPWPUCLOSETHREAD)(LPWSATHREADID,LPINT);
typedef WSAEVENT (WSPAPI *LPWPUCREATEEVENT)(LPINT);
typedef SOCKET (WSPAPI *LPWPUCREATESOCKETHANDLE)(DWORD,DWORD,LPINT);
-typedef SOCKET (WSPAPI *LPWPUFDISSET)(SOCKET,LPFD_SET);
+typedef INT (WSPAPI *LPWPUFDISSET)(SOCKET,LPFD_SET);
typedef INT (WSPAPI *LPWPUGETPROVIDERPATH)(LPGUID,LPWSTR,LPINT,LPINT);
typedef SOCKET (WSPAPI *LPWPUMODIFYIFSHANDLE)(DWORD,SOCKET,LPINT);
typedef INT (WSPAPI *LPWPUOPENCURRENTTHREAD)(LPWSATHREADID,LPINT);
@@ -129,6 +155,7 @@ typedef INT (WSPAPI *LPWPUQUERYSOCKETHANDLECONTEXT)(SOCKET,LPDWORD,LPINT);
typedef INT (WSPAPI *LPWPUQUEUEAPC)(LPWSATHREADID,LPWSAUSERAPC,DWORD,LPINT);
typedef BOOL (WSPAPI *LPWPURESETEVENT)(WSAEVENT,LPINT);
typedef BOOL (WSPAPI *LPWPUSETEVENT)(WSAEVENT,LPINT);
+typedef INT (WSAAPI *LPNSPSTARTUP)(LPGUID,LPNSP_ROUTINE);
/* Available only directly from the DLL */
typedef INT (WSPAPI *LPWPUCOMPLETEOVERLAPPEDREQUEST)(SOCKET,LPWSAOVERLAPPED,DWORD,DWORD,LPINT);
@@ -153,30 +180,6 @@ typedef struct _WSPUPCALLTABLE {
typedef INT (WSPAPI *LPWSPSTARTUP)(WORD,LPWSPDATA,LPWSAPROTOCOL_INFOW,WSPUPCALLTABLE,LPWSPPROC_TABLE);
-/* Prototypes for service provider namespace procedure table */
-typedef INT (WSPAPI *LPNSPCLEANUP)(LPGUID);
-typedef INT (WSPAPI *LPNSPGETSERVICECLASSINFO)(LPGUID,LPDWORD,LPWSASERVICECLASSINFOW);
-typedef INT (WSPAPI *LPNSPINSTALLSERVICECLASS)(LPGUID,LPWSASERVICECLASSINFOW);
-typedef INT (WSPAPI *LPNSPLOOKUPSERVICEBEGIN)(LPGUID,LPWSAQUERYSETW,LPWSASERVICECLASSINFOW,DWORD,LPHANDLE);
-typedef INT (WSPAPI *LPNSPLOOKUPSERVICEEND)(HANDLE);
-typedef INT (WSPAPI *LPNSPLOOKUPSERVICENEXT)(HANDLE,DWORD,LPDWORD,LPWSAQUERYSET);
-typedef INT (WSPAPI *LPNSPREMOVESERVICECLASS)(LPGUID,LPGUID);
-typedef INT (WSPAPI *LPNSPSETSERVICE)(LPGUID,LPWSASERVICECLASSINFOW,LPWSAQUERYSETW,WSAESETSERVICEOP,DWORD);
-
-typedef struct _NSP_ROUTINE {
- DWORD cbSize;
- DWORD dwMajorVersion;
- DWORD dwMinorVersion;
- LPNSPCLEANUP NSPCleanup;
- LPNSPLOOKUPSERVICEBEGIN NSPLookupServiceBegin;
- LPNSPLOOKUPSERVICENEXT NSPLookupServiceNext;
- LPNSPLOOKUPSERVICEEND NSPLookupServiceEnd;
- LPNSPSETSERVICE NSPSetService;
- LPNSPINSTALLSERVICECLASS NSPInstallServiceClass;
- LPNSPREMOVESERVICECLASS NSPRemoveServiceClass;
- LPNSPGETSERVICECLASSINFO NSPGetServiceClassInfo;
-} NSP_ROUTINE, *PNSP_ROUTINE, *LPNSP_ROUTINE;
-
INT WSPAPI NSPStartup(LPGUID,LPNSP_ROUTINE);
/* WinSock 2 DLL function prototypes */
@@ -185,11 +188,26 @@ INT WSPAPI WSPStartup(WORD,LPWSPDATA,LPWSAPROTOCOL_INFOW,WSPUPCALLTABLE,LPWSPPRO
INT WSPAPI WSCDeinstallProvider(LPGUID,LPINT);
INT WSPAPI WSCEnumProtocols(LPINT,LPWSAPROTOCOL_INFOW,LPDWORD,LPINT);
INT WSPAPI WSCGetProviderPath(LPGUID,LPWSTR,LPINT,LPINT);
-INT WSPAPI WSCInstallProvider(CONST LPGUID,CONST LPWSTR,CONST LPWSAPROTOCOL_INFOW,DWORD,LPINT);
+INT WSPAPI WSCInstallProvider(LPGUID,CONST WCHAR*,CONST LPWSAPROTOCOL_INFOW,DWORD,LPINT);
INT WSPAPI WSCEnableNSProvider(LPGUID,BOOL);
INT WSPAPI WSCInstallNameSpace(LPWSTR,LPWSTR,DWORD,DWORD,LPGUID);
INT WSPAPI WSCUnInstallNameSpace(LPGUID);
INT WSPAPI WSCWriteProviderOrder(LPDWORD,DWORD);
+BOOL WSPAPI WPUPostMessage(HWND,UINT,WPARAM,LPARAM);
+BOOL WSPAPI WPUCloseEvent(WSAEVENT,LPINT);
+int WSPAPI WPUCloseSocketHandle(SOCKET,LPINT);
+WSAEVENT WSPAPI WPUCreateEvent(LPINT);
+SOCKET WSPAPI WPUModifyIFSHandle(DWORD,SOCKET,LPINT);
+SOCKET WSPAPI WPUCreateSocketHandle(DWORD,DWORD_PTR,LPINT);
+int WSPAPI WPUFDIsSet(SOCKET,LPFD_SET);
+int WSPAPI WPUGetProviderPath(LPGUID,WCHAR FAR*,LPINT,LPINT);
+int WSPAPI WPUQueryBlockingCallback(DWORD,LPBLOCKINGCALLBACK FAR*,PDWORD_PTR,LPINT);
+int WSPAPI WPUQuerySocketHandleContext(SOCKET,PDWORD_PTR,LPINT);
+int WSPAPI WPUQueueApc(LPWSATHREADID,LPWSAUSERAPC,DWORD_PTR,LPINT);
+BOOL WSPAPI WPUResetEvent(WSAEVENT,LPINT);
+BOOL WSPAPI WPUSetEvent(WSAEVENT,LPINT);
+int WSPAPI WPUOpenCurrentThread(LPWSATHREADID,LPINT);
+int WSPAPI WPUCloseThread(LPWSATHREADID,LPINT);
#endif /* RC_INVOKED */
diff --git a/reactos/include/psdk/ws2tcpip.h b/reactos/include/psdk/ws2tcpip.h
index 1677b51433a..42f7e62be7a 100644
--- a/reactos/include/psdk/ws2tcpip.h
+++ b/reactos/include/psdk/ws2tcpip.h
@@ -155,22 +155,23 @@ struct ip_msfilter {
struct in6_addr {
union {
- u_char _S6_u8[16];
- u_short _S6_u16[8];
+ u_char Byte[16];
+ u_short Word[8];
u_long _S6_u32[4];
- } _S6_un;
+ } u;
};
+
/* s6_addr is the standard name */
-#define s6_addr _S6_un._S6_u8
+#define s6_addr u.Byte
/* These are GLIBC names */
-#define s6_addr16 _S6_un._S6_u16
-#define s6_addr32 _S6_un._S6_u16
+#define s6_addr16 u.Word
+#define s6_addr32 u.Word
/* These are used in some MS code */
#define in_addr6 in6_addr
-#define _s6_bytes _S6_un._S6_u8
-#define _s6_words _S6_un._S6_u16
+#define _s6_bytes u.Byte
+#define _s6_words u.Word
typedef struct in6_addr IN6_ADDR, *PIN6_ADDR, *LPIN6_ADDR;
@@ -275,16 +276,37 @@ struct in6_pktinfo {
};
typedef struct in6_pktinfo IN6_PKTINFO;
-struct addrinfo {
- int ai_flags;
- int ai_family;
- int ai_socktype;
- int ai_protocol;
- size_t ai_addrlen;
- char *ai_canonname;
- struct sockaddr *ai_addr;
- struct addrinfo *ai_next;
-};
+typedef struct addrinfo
+{
+ int ai_flags;
+ int ai_family;
+ int ai_socktype;
+ int ai_protocol;
+ size_t ai_addrlen;
+ char *ai_canonname;
+ struct sockaddr *ai_addr;
+ struct addrinfo *ai_next;
+} ADDRINFOA, *PADDRINFOA;
+
+typedef struct addrinfoW
+{
+ int ai_flags;
+ int ai_family;
+ int ai_socktype;
+ int ai_protocol;
+ size_t ai_addrlen;
+ PWSTR ai_canonname;
+ struct sockaddr *ai_addr;
+ struct addrinfoW *ai_next;
+} ADDRINFOW, *PADDRINFOW;
+
+#ifdef UNICODE
+typedef ADDRINFOW ADDRINFOT,*PADDRINFOT;
+#else
+typedef ADDRINFOA ADDRINFOT,*PADDRINFOT;
+#endif
+
+typedef ADDRINFOA ADDRINFO, FAR *LPADDRINFO;
void WSAAPI freeaddrinfo (struct addrinfo*);
int WSAAPI getaddrinfo (const char*,const char*,const struct addrinfo*,
@@ -335,6 +357,17 @@ gai_strerrorW(int ecode)
int WSAAPI getnameinfo(const struct sockaddr*,socklen_t,char*,DWORD,
char*,DWORD,int);
+#if (_WIN32_WINNT >= 0x0502)
+INT WSAAPI GetNameInfoW(const SOCKADDR*,socklen_t,PWCHAR,DWORD,PWCHAR,DWORD,INT);
+#define GetNameInfoA getnameinfo
+
+#ifdef UNICODE
+#define GetNameInfo GetNameInfoW
+#else
+#define GetNameInfo GetNameInfoA
+#endif /* UNICODE */
+
+#endif /* (_WIN32_WINNT >= 0x0502) */
/* Some older IPv4/IPv6 compatability stuff */
diff --git a/reactos/include/reactos/arm/armddk.h b/reactos/include/reactos/arm/armddk.h
index 385426791d0..178bb50f3fb 100644
--- a/reactos/include/reactos/arm/armddk.h
+++ b/reactos/include/reactos/arm/armddk.h
@@ -1,6 +1,14 @@
#ifndef _ARMDDK_
#define _ARMDDK_
+//
+// Page size
+//
+#ifndef PAGE_SIZE
+#define PAGE_SIZE 0x1000
+#endif
+
+#ifndef _WINNT_H
//
// IRQLs
//
@@ -15,6 +23,7 @@
#define IPI_LEVEL 29
#define POWER_LEVEL 30
#define HIGH_LEVEL 31
+#endif
//
// FIXME: mmtypes.h?
@@ -24,6 +33,21 @@
#define USPCR 0x7FFF0000
#define PCR ((volatile KPCR * const)KIPCR)
#define USERPCR ((volatile KPCR * const)USPCR)
+#define KeGetPcr() PCR
+#ifndef _WINNT_H
+#define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA)
+
+//
+// Address space layout
+//
+extern PVOID MmHighestUserAddress;
+extern PVOID MmSystemRangeStart;
+extern ULONG_PTR MmUserProbeAddress;
+#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
+#define MM_SYSTEM_RANGE_START MmSystemRangeStart
+#define MM_USER_PROBE_ADDRESS MmUserProbeAddress
+#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
+#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC1400000
//
// Maximum IRQs
@@ -104,6 +128,7 @@ typedef struct _CONTEXT {
ULONG Pc;
ULONG Psr;
} CONTEXT;
+#endif
//
// Processor Control Region
@@ -118,7 +143,7 @@ typedef struct _KPCR
{
ULONG MinorVersion;
ULONG MajorVersion;
- PKINTERRUPT_ROUTINE InterruptRoutine[MAXIMUM_VECTOR];
+ PKINTERRUPT_ROUTINE InterruptRoutine[32];
PVOID XcodeDispatch;
ULONG FirstLevelDcacheSize;
ULONG FirstLevelDcacheFillSize;
@@ -144,8 +169,8 @@ typedef struct _KPCR
PVOID InstructionBusError;
ULONG CachePolicy;
ULONG AlignedCachePolicy;
- UCHAR IrqlMask[HIGH_LEVEL + 1];
- ULONG IrqlTable[HIGH_LEVEL + 1];
+ UCHAR IrqlMask[32];
+ ULONG IrqlTable[32];
UCHAR CurrentIrql;
KAFFINITY SetMember;
struct _KTHREAD *CurrentThread;
@@ -181,6 +206,7 @@ struct _TEB* NtCurrentTeb(VOID)
return (struct _TEB*)USERPCR->Teb;
}
+#ifndef _WINNT_H
//
// IRQL Support on ARM is similar to MIPS/ALPHA
//
@@ -219,5 +245,12 @@ VOID
HalSweepIcache(
VOID
);
-
+#endif
+
+//
+// Intrinsics
+//
+#define InterlockedDecrement _InterlockedDecrement
+#define InterlockedIncrement _InterlockedIncrement
+#define InterlockedExchange _InterlockedExchange
#endif
diff --git a/reactos/include/reactos/arm/peripherals/pl011.h b/reactos/include/reactos/arm/peripherals/pl011.h
index e423c0b9c63..6fa3cdc1fc9 100644
--- a/reactos/include/reactos/arm/peripherals/pl011.h
+++ b/reactos/include/reactos/arm/peripherals/pl011.h
@@ -11,7 +11,7 @@
//
// UART Registers
//
-#define UART_BASE (PVOID)0xE00F1000 /* HACK: freeldr mapped it here */
+#define UART_BASE (ULONG_PTR)0xE00F1000 /* HACK: freeldr mapped it here */
#define UART_PL01x_DR (UART_BASE + 0x00)
#define UART_PL01x_RSR (UART_BASE + 0x04)
diff --git a/reactos/include/reactos/arm/peripherals/pl190.h b/reactos/include/reactos/arm/peripherals/pl190.h
index 0d266b4e3ee..a6e336a6abf 100644
--- a/reactos/include/reactos/arm/peripherals/pl190.h
+++ b/reactos/include/reactos/arm/peripherals/pl190.h
@@ -11,7 +11,7 @@
//
// VIC Registers
//
-#define VIC_BASE (PVOID)0xE0040000 /* HACK: freeldr mapped it here */
+#define VIC_BASE (ULONG_PTR)0xE0040000 /* HACK: freeldr mapped it here */
#define VIC_INT_STATUS (VIC_BASE + 0x00)
#define VIC_INT_ENABLE (VIC_BASE + 0x10)
diff --git a/reactos/include/reactos/arm/peripherals/sp804.h b/reactos/include/reactos/arm/peripherals/sp804.h
index 7dea73b36cf..68acd91b149 100644
--- a/reactos/include/reactos/arm/peripherals/sp804.h
+++ b/reactos/include/reactos/arm/peripherals/sp804.h
@@ -11,7 +11,7 @@
//
// Timer Registers
//
-#define TIMER_BASE(x) (PVOID)(0xE00E2000 + (x * 0x1000)) /* HACK: freeldr mapped it here */
+#define TIMER_BASE(x) (ULONG_PTR)(0xE00E2000 + (x * 0x1000)) /* HACK: freeldr mapped it here */
#define TIMER0_LOAD TIMER_BASE(0) + 0x00
#define TIMER0_VALUE TIMER_BASE(0) + 0x04
#define TIMER0_CONTROL TIMER_BASE(0) + 0x08
diff --git a/reactos/include/reactos/ccros.h b/reactos/include/reactos/ccros.h
deleted file mode 100644
index 989ba476f6a..00000000000
--- a/reactos/include/reactos/ccros.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef __INCLUDE_DDK_NTIFS_H
-#define __INCLUDE_DDK_NTIFS_H
-
-NTSTATUS NTAPI
-CcRosInitializeFileCache(PFILE_OBJECT FileObject,
- ULONG CacheSegmentSize,
- PCACHE_MANAGER_CALLBACKS CallBacks,
- PVOID LazyWriterContext);
-
-NTSTATUS NTAPI
-CcRosReleaseFileCache (PFILE_OBJECT FileObject);
-
-struct _BCB;
-
-VOID
-NTAPI
-CcRosTraceCacheMap (
- struct _BCB* Bcb,
- BOOLEAN Trace );
-
-#define FSCTL_ROS_QUERY_LCN_MAPPING \
- CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-typedef struct _ROS_QUERY_LCN_MAPPING
-{
- LARGE_INTEGER LcnDiskOffset;
-} ROS_QUERY_LCN_MAPPING, *PROS_QUERY_LCN_MAPPING;
-
-#endif /* __INCLUDE_DDK_NTIFS_H */
diff --git a/reactos/include/reactos/debug.h b/reactos/include/reactos/debug.h
index 413a036b1ce..35755859b60 100644
--- a/reactos/include/reactos/debug.h
+++ b/reactos/include/reactos/debug.h
@@ -31,6 +31,7 @@ DbgPrint(
IN ...
);
+NTSYSAPI
ULONG
__cdecl
DbgPrintEx(
diff --git a/reactos/include/reactos/drivers/diskdump/diskdump.h b/reactos/include/reactos/drivers/diskdump/diskdump.h
deleted file mode 100644
index edfe2f42612..00000000000
--- a/reactos/include/reactos/drivers/diskdump/diskdump.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef __DISKDUMP_H
-#define __DISKDUMP_H
-
-#include
-#include
-
-#define MM_CORE_DUMP_HEADER_MAGIC (0xdeafbead)
-#define MM_CORE_DUMP_HEADER_VERSION (0x1)
-
-typedef struct _MM_CORE_DUMP_HEADER
-{
- ULONG Magic;
- ULONG Version;
- ULONG Type;
- KTRAP_FRAME TrapFrame;
- ULONG BugCheckCode;
- ULONG BugCheckParameters[4];
- PVOID FaultingStackBase;
- ULONG FaultingStackSize;
- ULONG PhysicalMemorySize;
-} MM_CORE_DUMP_HEADER, *PMM_CORE_DUMP_HEADER;
-
-typedef struct MM_CORE_DUMP_FUNCTIONS
-{
- NTSTATUS (NTAPI *DumpPrepare)(PDEVICE_OBJECT DeviceObject, PDUMP_POINTERS DumpPointers);
- NTSTATUS (NTAPI *DumpInit)(VOID);
- NTSTATUS (NTAPI *DumpWrite)(LARGE_INTEGER Address, PMDL Mdl);
- NTSTATUS (NTAPI *DumpFinish)(VOID);
-} MM_CORE_DUMP_FUNCTIONS, *PMM_CORE_DUMP_FUNCTIONS;
-
-#endif /* __DISKDUMP_H */
diff --git a/reactos/include/reactos/drivers/drivers/.gitignore b/reactos/include/reactos/drivers/drivers/.gitignore
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/reactos/include/reactos/libs/dhcp/rosdhcp_public.h b/reactos/include/reactos/libs/dhcp/rosdhcp_public.h
index 7e0c34a652b..5779184e32f 100644
--- a/reactos/include/reactos/libs/dhcp/rosdhcp_public.h
+++ b/reactos/include/reactos/libs/dhcp/rosdhcp_public.h
@@ -48,6 +48,6 @@ typedef union _COMM_DHCP_REPLY {
} GetAdapterInfo;
} COMM_DHCP_REPLY;
-#define DHCP_PIPE_NAME "\\\\.\\pipe\\dhcpclient"
+#define DHCP_PIPE_NAME L"\\\\.\\pipe\\dhcpclient"
#endif/*ROSDHCP_PUBLIC_H*/
diff --git a/reactos/include/reactos/libs/pseh/pseh2.h b/reactos/include/reactos/libs/pseh/pseh2.h
index 2b2133c1e7e..6a21c807cd2 100644
--- a/reactos/include/reactos/libs/pseh/pseh2.h
+++ b/reactos/include/reactos/libs/pseh/pseh2.h
@@ -26,6 +26,8 @@
#ifndef KJK_PSEH2_H_
#define KJK_PSEH2_H_
+#if !defined (__arm__)
+
#if defined(__GNUC__)
struct _EXCEPTION_RECORD;
struct _EXCEPTION_POINTERS;
@@ -197,16 +199,18 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
#define __SEH_ENTER_SCOPE(TRYLEVEL_) (_SEHTopTryLevel ? __SEH_ENTER_FRAME_AND_TRYLEVEL(TRYLEVEL_) : __SEH_ENTER_TRYLEVEL(TRYLEVEL_))
#define __SEH_ENTER_HANDLE_SCOPE(TRYLEVEL_, HANDLE_) (({ __SEH_BARRIER; __asm__ __volatile__("mov %%esp, %0" : "=m" ((TRYLEVEL_)->SHT_Esp)); __SEH_BARRIER; }), (_SEHTopTryLevel ? __SEH_ENTER_FRAME_AND_HANDLE_TRYLEVEL((TRYLEVEL_), (HANDLE_)) : __SEH_ENTER_HANDLE_TRYLEVEL((TRYLEVEL_), (HANDLE_))))
-#define __SEH_LEAVE_SCOPE() \
+#define __SEH_LEAVE_TRYLEVEL() \
+ if(!_SEHTopTryLevel) \
+ { \
+ __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP); \
+ } \
+
+#define __SEH_LEAVE_FRAME() \
if(_SEHTopTryLevel) \
{ \
_SEH2LeaveFrame(); \
__asm__ __volatile__("mov %0, %%esp" : : "g" (_SEHStackPointer)); \
- } \
- else \
- { \
- __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP); \
- } \
+ }
#define __SEH_END_SCOPE_CHAIN \
static __attribute__((unused)) const int _SEH2ScopeKind = 1; \
@@ -292,7 +296,7 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
\
_SEHAbnormalTermination = 0; \
\
- __SEH_LEAVE_SCOPE(); \
+ __SEH_LEAVE_TRYLEVEL(); \
\
_SEHFinally(); \
goto _SEHEndExcept; \
@@ -365,7 +369,7 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
__attribute__((unused)) __SEH_DEFINE_FINALLY(_SEHFinally) { __SEH_RETURN_FINALLY(); } \
\
_SEHAfterTry:; \
- __SEH_LEAVE_SCOPE(); \
+ __SEH_LEAVE_TRYLEVEL(); \
\
goto _SEHEndExcept; \
\
@@ -380,6 +384,8 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
} \
\
_SEHEndExcept:; \
+ \
+ __SEH_LEAVE_FRAME(); \
} \
__SEH_END_SCOPE;
@@ -404,10 +410,10 @@ __SEH_END_SCOPE_CHAIN;
#include
-#define _SEH2_TRY __try
-#define _SEH2_FINALLY __finally
-#define _SEH2_EXCEPT(...) __except(__VA_ARGS__)
-#define _SEH2_END
+#define _SEH2_TRY __try {
+#define _SEH2_FINALLY } __finally {
+#define _SEH2_EXCEPT(...) } __except(__VA_ARGS__) {
+#define _SEH2_END }
#define _SEH2_GetExceptionInformation() (GetExceptionInformation())
#define _SEH2_GetExceptionCode() (GetExceptionCode())
@@ -418,7 +424,23 @@ __SEH_END_SCOPE_CHAIN;
#endif
+#else
+
+#define _SEH2_TRY {
+#define _SEH2_FINALLY } {
+#define _SEH2_EXCEPT(...) } if (0) {
+#define _SEH2_END }
+
+#define _SEH2_GetExceptionInformation()
+#define _SEH2_GetExceptionCode() STATUS_SUCCESS
+#define _SEH2_AbnormalTermination()
+
+#define _SEH2_YIELD(STMT_) STMT_
+#define _SEH2_LEAVE
+
#endif
#endif
+#endif
+
/* EOF */
diff --git a/reactos/include/reactos/libs/sound/mmebuddy.h b/reactos/include/reactos/libs/sound/mmebuddy.h
index 9d85a8fb8fc..35b7407ab33 100644
--- a/reactos/include/reactos/libs/sound/mmebuddy.h
+++ b/reactos/include/reactos/libs/sound/mmebuddy.h
@@ -156,6 +156,7 @@ struct _SOUND_DEVICE_INSTANCE;
#define DEFINE_GETCAPS_FUNCTYPE(func_typename, caps_type) \
typedef MMRESULT (*func_typename)( \
IN struct _SOUND_DEVICE* SoundDevice, \
+ IN DWORD DeviceId, \
OUT caps_type Capabilities, \
IN DWORD CapabilitiesSize);
@@ -201,6 +202,7 @@ typedef MMRESULT (*MMWAVEQUERYFORMATSUPPORT_FUNC)(
typedef MMRESULT (*MMWAVESETFORMAT_FUNC)(
IN struct _SOUND_DEVICE_INSTANCE* Instance,
+ IN DWORD DeviceId,
IN PWAVEFORMATEX WaveFormat,
IN DWORD WaveFormatSize);
@@ -221,6 +223,10 @@ typedef MMRESULT (*MMBUFFER_FUNC)(
IN PVOID Buffer,
IN DWORD Length);
+typedef MMRESULT(*MMGETPOS_FUNC)(
+ IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
+ IN MMTIME* Time);
+
typedef struct _MMFUNCTION_TABLE
{
union
@@ -240,6 +246,8 @@ typedef struct _MMFUNCTION_TABLE
WAVE_COMMIT_FUNC CommitWaveBuffer;
+ MMGETPOS_FUNC GetPos;
+
// Redundant
//MMWAVEHEADER_FUNC PrepareWaveHeader;
//MMWAVEHEADER_FUNC UnprepareWaveHeader;
@@ -319,6 +327,8 @@ typedef struct _SOUND_DEVICE_INSTANCE
//PWAVEHDR CurrentWaveHeader;
DWORD OutstandingBuffers;
DWORD LoopsRemaining;
+ DWORD FrameSize;
+ DWORD BufferCount;
} SOUND_DEVICE_INSTANCE, *PSOUND_DEVICE_INSTANCE;
/* This lives in WAVEHDR.reserved */
@@ -377,6 +387,15 @@ MMRESULT
MmeCloseDevice(
IN DWORD_PTR PrivateHandle);
+MMRESULT
+MmeGetPosition(
+ IN MMDEVICE_TYPE DeviceType,
+ IN DWORD DeviceId,
+ IN DWORD PrivateHandle,
+ IN MMTIME* Time,
+ IN DWORD Size);
+
+
#define MmePrepareWaveHeader(private_handle, header) \
PrepareWaveHeader((PSOUND_DEVICE_INSTANCE)private_handle, (PWAVEHDR)header)
@@ -398,7 +417,8 @@ MmeResetWavePlayback(
MMRESULT
GetSoundDeviceCapabilities(
IN PSOUND_DEVICE SoundDevice,
- OUT DWORD_PTR Capabilities,
+ IN DWORD DeviceId,
+ OUT PVOID Capabilities,
IN DWORD CapabilitiesSize);
@@ -564,6 +584,7 @@ QueryWaveDeviceFormatSupport(
MMRESULT
SetWaveDeviceFormat(
IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
+ IN DWORD DeviceId,
IN LPWAVEFORMATEX Format,
IN DWORD FormatSize);
diff --git a/reactos/include/reactos/libs/sound/mment4.h b/reactos/include/reactos/libs/sound/mment4.h
index 66b45052053..f9870931f7a 100644
--- a/reactos/include/reactos/libs/sound/mment4.h
+++ b/reactos/include/reactos/libs/sound/mment4.h
@@ -73,6 +73,7 @@ QueryNt4WaveDeviceFormatSupport(
MMRESULT
SetNt4WaveDeviceFormat(
IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
+ IN DWORD DeviceId,
IN LPWAVEFORMATEX Format,
IN DWORD FormatSize);
diff --git a/reactos/include/reactos/win32k/callback.h b/reactos/include/reactos/win32k/callback.h
index d0f12a36821..74a405cc9d7 100644
--- a/reactos/include/reactos/win32k/callback.h
+++ b/reactos/include/reactos/win32k/callback.h
@@ -7,7 +7,8 @@
#define USER32_CALLBACK_LOADDEFAULTCURSORS (3)
#define USER32_CALLBACK_HOOKPROC (4)
#define USER32_CALLBACK_EVENTPROC (5)
-#define USER32_CALLBACK_MAXIMUM (5)
+#define USER32_CALLBACK_LOADMENU (6)
+#define USER32_CALLBACK_MAXIMUM (6)
typedef struct _WINDOWPROC_CALLBACK_ARGUMENTS
{
@@ -61,11 +62,14 @@ typedef struct _EVENTPROC_CALLBACK_ARGUMENTS
DWORD dwEventThread;
DWORD dwmsEventTime;
WINEVENTPROC Proc;
- BOOLEAN Ansi;
- UINT ModuleNameLength;
- WCHAR ModuleName[1];
} EVENTPROC_CALLBACK_ARGUMENTS, *PEVENTPROC_CALLBACK_ARGUMENTS;
+typedef struct _LOADMENU_CALLBACK_ARGUMENTS
+{
+ HINSTANCE hModule;
+ WCHAR MenuName[1];
+} LOADMENU_CALLBACK_ARGUMENTS, *PLOADMENU_CALLBACK_ARGUMENTS;
+
NTSTATUS WINAPI
User32CallWindowProcFromKernel(PVOID Arguments, ULONG ArgumentLength);
NTSTATUS WINAPI
@@ -78,5 +82,7 @@ NTSTATUS WINAPI
User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength);
NTSTATUS WINAPI
User32CallEventProcFromKernel(PVOID Arguments, ULONG ArgumentLength);
+NTSTATUS WINAPI
+User32CallLoadMenuFromKernel(PVOID Arguments, ULONG ArgumentLength);
#endif /* __INCLUDE_USER32_CALLBACK_H */
diff --git a/reactos/include/reactos/win32k/ntgdityp.h b/reactos/include/reactos/win32k/ntgdityp.h
index 79e5fc36307..42bd035c059 100644
--- a/reactos/include/reactos/win32k/ntgdityp.h
+++ b/reactos/include/reactos/win32k/ntgdityp.h
@@ -451,7 +451,8 @@ typedef struct _PATRECT
RECT r;
HBRUSH hBrush;
} PATRECT, * PPATRECT;
-
+#endif
+#ifndef __WIN32K_NTUSER_H
typedef struct _W32CLIENTINFO
{
ULONG CI_flags;
@@ -462,7 +463,6 @@ typedef struct _W32CLIENTINFO
ULONG W32ClientInfo[57];
} W32CLIENTINFO, *PW32CLIENTINFO;
#endif
-
typedef struct _GDIBSPPATBLT
{
GDIBATCHHDR gbHdr;
diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h
index 35b7821326d..6ad3cce8f75 100644
--- a/reactos/include/reactos/win32k/ntuser.h
+++ b/reactos/include/reactos/win32k/ntuser.h
@@ -2,8 +2,8 @@
#define __WIN32K_NTUSER_H
typedef struct _PROCESSINFO *PPROCESSINFO;
-struct _W32THREADINFO;
-struct _WINDOW;
+struct _DESKTOP;
+struct _WND;
typedef struct _LARGE_UNICODE_STRING
{
@@ -35,36 +35,6 @@ VOID NTAPI RtlInitLargeAnsiString(IN OUT PLARGE_ANSI_STRING,IN PCSZ,IN INT);
VOID NTAPI RtlInitLargeUnicodeString(IN OUT PLARGE_UNICODE_STRING,IN PCWSTR,IN INT);
BOOL NTAPI RtlLargeStringToUnicodeString( PUNICODE_STRING, PLARGE_STRING);
-/* FIXME: UserHMGetHandle needs to be updated once the new handle manager is implemented */
-#define UserHMGetHandle(obj) ((obj)->hdr.Handle)
-
-typedef struct _REGISTER_SYSCLASS
-{
- /* This is a reactos specific class used to initialize the
- system window classes during user32 initialization */
- UNICODE_STRING ClassName;
- UINT Style;
- WNDPROC ProcW;
- WNDPROC ProcA;
- UINT ExtraBytes;
- HICON hCursor;
- HBRUSH hBrush;
- UINT ClassId;
-} REGISTER_SYSCLASS, *PREGISTER_SYSCLASS;
-
-typedef struct _CLSMENUNAME
-{
- LPSTR pszClientAnsiMenuName;
- LPWSTR pwszClientUnicodeMenuName;
- PUNICODE_STRING pusMenuName;
-} CLSMENUNAME, *PCLSMENUNAME;
-
-typedef struct _USER_OBJHDR
-{
- /* This is the common header for all user handle objects */
- HANDLE Handle;
-} USER_OBJHDR, PUSER_OBJHDR;
-
typedef struct _DESKTOPINFO
{
PVOID pvDesktopBase;
@@ -75,7 +45,7 @@ typedef struct _DESKTOPINFO
HWND hTaskManWindow;
HWND hProgmanWindow;
HWND hShellWindow;
- struct _WINDOW *Wnd;
+ struct _WND *Wnd;
union
{
@@ -89,252 +59,6 @@ typedef struct _DESKTOPINFO
WCHAR szDesktopName[1];
} DESKTOPINFO, *PDESKTOPINFO;
-typedef struct _CALLPROC
-{
- USER_OBJHDR hdr; /* FIXME: Move out of the structure once new handle manager is implemented */
- struct _PROCESSINFO *pi;
- WNDPROC WndProc;
- struct _CALLPROC *Next;
- UINT Unicode : 1;
-} CALLPROC, *PCALLPROC;
-
-typedef struct _WINDOWCLASS
-{
- struct _WINDOWCLASS *Next;
- struct _WINDOWCLASS *Clone;
- struct _WINDOWCLASS *Base;
- struct _DESKTOP *rpdeskParent;
- RTL_ATOM Atom;
- ULONG Windows;
-
- UINT Style;
- WNDPROC WndProc;
- union
- {
- WNDPROC WndProcExtra;
- PCALLPROC CallProc;
- };
- PCALLPROC CallProcList;
- INT ClsExtra;
- INT WndExtra;
- PVOID Dce;
- DWORD fnID; // New ClassId
- HINSTANCE hInstance;
- HANDLE hIcon; /* FIXME - Use pointer! */
- HANDLE hIconSm; /* FIXME - Use pointer! */
- HANDLE hCursor; /* FIXME - Use pointer! */
- HBRUSH hbrBackground;
- HANDLE hMenu; /* FIXME - Use pointer! */
- PWSTR MenuName;
- PSTR AnsiMenuName;
-
- UINT Destroying : 1;
- UINT Unicode : 1;
- UINT System : 1;
- UINT Global : 1;
- UINT MenuNameIsString : 1;
- UINT NotUsed : 27;
-} WINDOWCLASS, *PWINDOWCLASS;
-
-
-// Flags !Not Implemented!
-#define WNDF_CALLPROC 0x0004 // Call proc inside win32k.
-
-typedef struct _WINDOW
-{
- USER_OBJHDR hdr; /* FIXME: Move out of the structure once new handle manager is implemented */
-
- /* NOTE: This structure is located in the desktop heap and will
- eventually replace WINDOW_OBJECT. Right now WINDOW_OBJECT
- keeps a reference to this structure until all the information
- is moved to this structure */
- struct _PROCESSINFO *pi; /* FIXME: Move to object header some day */
- struct _W32THREADINFO *ti;
- struct _DESKTOP *pdesktop;
- RECT WindowRect;
- RECT ClientRect;
-
- WNDPROC WndProc;
- union
- {
- /* Pointer to a call procedure handle */
- PCALLPROC CallProc;
- /* Extra Wnd proc (windows of system classes) */
- WNDPROC WndProcExtra;
- };
-
- struct _WINDOW *Parent;
- struct _WINDOW *Owner;
-
- /* Size of the extra data associated with the window. */
- ULONG ExtraDataSize;
- /* Style. */
- DWORD Style;
- /* Extended style. */
- DWORD ExStyle;
- /* Handle of the module that created the window. */
- HINSTANCE Instance;
- /* Window menu handle or window id */
- UINT IDMenu;
- LONG UserData;
- /* Pointer to the window class. */
- PWINDOWCLASS Class;
- /* Window name. */
- UNICODE_STRING WindowName;
- /* Context help id */
- DWORD ContextHelpId;
-
- HWND hWndLastActive;
- /* Property list head.*/
- LIST_ENTRY PropListHead;
- ULONG PropListItems;
-
- struct
- {
- RECT NormalRect;
- POINT IconPos;
- POINT MaxPos;
- } InternalPos;
-
- UINT Unicode : 1;
- /* Indicates whether the window is derived from a system class */
- UINT IsSystem : 1;
- UINT InternalPosInitialized : 1;
- UINT HideFocus : 1;
- UINT HideAccel : 1;
-} WINDOW, *PWINDOW;
-
-typedef struct _PFNCLIENT
-{
- PROC pfnScrollBarC;
- PROC pfnDefWndC;
- PROC pfnMenuC;
- PROC pfnDesktopC;
- PROC pfnDefWnd1C;
- PROC pfnDefWnd2C;
- PROC pfnDefWnd3C;
- PROC pfnButtomC;
- PROC pfnComboBoxC;
- PROC pfnComboListBoxC;
- PROC pfnDefDlgC;
- PROC pfnEditC;
- PROC pfnListBoxC;
- PROC pfnMDIClientC;
- PROC pfnStaticC;
- PROC pfnImeC;
- PROC pfnHkINLPCWPSTRUCT;
- PROC pfnHkINLPCWPRETSTRUCT;
- PROC pfnDispatchHookC;
- PROC pfnDispatchDefC;
-} PFNCLIENT, *PPFNCLIENT;
-
-typedef struct _PFNCLIENTWORKER
-{
- PROC pfnButtonCW;
- PROC pfnComboBoxCW;
- PROC pfnComboListBoxCW;
- PROC pfnDefDlgCW;
- PROC pfnEditCW;
- PROC pfnListBoxCW;
- PROC pfnMDIClientCW;
- PROC pfnStaticCW;
- PROC pfnImeCW;
-} PFNCLIENTWORKER, *PPFNCLIENTWORKER;
-
-
-// FNID's for NtUserSetWindowFNID, NtUserMessageCall
-#define FNID_SCROLLBAR 0x029A
-#define FNID_ICONTITLE 0x029B
-#define FNID_MENU 0x029C
-#define FNID_DESKTOP 0x029D
-#define FNID_DEFWINDOWPROC 0x029E
-#define FNID_SWITCH 0x02A0
-#define FNID_BUTTON 0x02A1
-#define FNID_COMBOBOX 0x02A2
-#define FNID_COMBOLBOX 0x02A3
-#define FNID_DIALOG 0x02A4
-#define FNID_EDIT 0x02A5
-#define FNID_LISTBOX 0x02A6
-#define FNID_MDICLIENT 0x02A7
-#define FNID_STATIC 0x02A8
-#define FNID_IME 0x02A9
-#define FNID_CALLWNDPROC 0x02AA
-#define FNID_CALLWNDPROCRET 0x02AB
-#define FNID_SENDMESSAGE 0x02B0
-// Kernel has option to use TimeOut or normal msg send, based on type of msg.
-#define FNID_SENDMESSAGEWTOOPTION 0x02B1
-#define FNID_SENDMESSAGETIMEOUT 0x02B2
-#define FNID_BROADCASTSYSTEMMESSAGE 0x02B4
-#define FNID_TOOLTIPS 0x02B5
-#define FNID_UNKNOWN 0x02B6
-#define FNID_SENDNOTIFYMESSAGE 0x02B7
-#define FNID_SENDMESSAGECALLBACK 0x02B8
-
-
-#define FNID_DDEML 0x2000 // Registers DDEML
-#define FNID_DESTROY 0x4000 // This is sent when WM_NCDESTROY or in the support routine.
- // Seen during WM_CREATE on error exit too.
-
-// ICLS's for NtUserGetClassName FNID to ICLS, NtUserInitializeClientPfnArrays
-#define ICLS_BUTTON 0
-#define ICLS_EDIT 1
-#define ICLS_STATIC 2
-#define ICLS_LISTBOX 3
-#define ICLS_SCROLLBAR 4
-#define ICLS_COMBOBOX 5
-#define ICLS_MDICLIENT 6
-#define ICLS_COMBOLBOX 7
-#define ICLS_DDEMLEVENT 8
-#define ICLS_DDEMLMOTHER 9
-#define ICLS_DDEML16BIT 10
-#define ICLS_DDEMLCLIENTA 11
-#define ICLS_DDEMLCLIENTW 12
-#define ICLS_DDEMLSERVERA 13
-#define ICLS_DDEMLSERVERW 14
-#define ICLS_IME 15
-#define ICLS_DESKTOP 16
-#define ICLS_DIALOG 17
-#define ICLS_MENU 18
-#define ICLS_SWITCH 19
-#define ICLS_ICONTITLE 20
-#define ICLS_TOOLTIPS 21
-#define ICLS_UNKNOWN 22
-#define ICLS_NOTUSED 23
-#define ICLS_END 31
-
-#define SRVINFO_METRICS 0x0020
-
-typedef struct _SERVERINFO
-{
- DWORD SRVINFO_Flags;
- DWORD SystemMetrics[SM_CMETRICS]; // System Metrics
- COLORREF SysColors[COLOR_MENUBAR+1]; // GetSysColor
- HBRUSH SysColorBrushes[COLOR_MENUBAR+1]; // GetSysColorBrush
- HPEN SysColorPens[COLOR_MENUBAR+1]; // ReactOS exclusive
- HBRUSH hbrGray;
- POINTL ptCursor;
- //
- DWORD cxSysFontChar;
- DWORD cySysFontChar;
- DWORD cxMsgFontChar;
- DWORD cyMsgFontChar;
- TEXTMETRICW tmSysFont;
- //
- RECTL rcScreen;
- WORD BitCount;
- WORD dmLogPixels;
- BYTE BitsPixel;
- BYTE Planes;
- WORD reserved;
- DWORD PUSIFlags; // PERUSERSERVERINFO Flags.
- ULONG uCaretWidth;
- LANGID UILangID;
- UINT LastRITWasKeyboard : 1;
- UINT bKeyboardPref : 1;
- DWORD TimeTick;
- DWORD SrvEventActivity;
-} SERVERINFO, *PSERVERINFO;
-
#define CTI_INSENDMESSAGE 0x0002
typedef struct _CLIENTTHREADINFO
@@ -344,7 +68,7 @@ typedef struct _CLIENTTHREADINFO
WORD fsWakeBits;
WORD fsWakeBitsJournal;
WORD fsWakeMask;
- LONG timeLastRead;
+ ULONG tickLastMsgChecked;
DWORD dwcPumpHook;
} CLIENTTHREADINFO, *PCLIENTTHREADINFO;
@@ -355,14 +79,39 @@ typedef struct _W32THREADINFO
ULONG fsHooks;
} W32THREADINFO, *PW32THREADINFO;
+typedef struct _HEAD
+{
+ HANDLE h;
+ DWORD cLockObj;
+} HEAD, *PHEAD;
+
+typedef struct _THRDESKHEAD
+{
+ HANDLE h;
+ DWORD cLockObj;
+ PW32THREADINFO pti;
+ struct _DESKTOP *rpdesk;
+ PVOID pSelf;
+} THRDESKHEAD, *PTHRDESKHEAD;
+
+typedef struct _PROCDESKHEAD
+{
+ HANDLE h;
+ DWORD cLockObj;
+ DWORD hTaskWow;
+ struct _DESKTOP *rpdesk;
+ PVOID pSelf;
+} PROCDESKHEAD, *PPROCDESKHEAD;
+
+#define UserHMGetHandle(obj) ((obj)->head.h)
+
/* Window Client Information structure */
struct _ETHREAD;
-
typedef struct tagHOOK
{
+ THRDESKHEAD head;
LIST_ENTRY Chain; /* Hook chain entry */
- HHOOK Self; /* user handle for this hook */
struct _ETHREAD* Thread; /* Thread owning the hook */
int HookId; /* Hook table index */
HOOKPROC Proc; /* Hook function */
@@ -407,16 +156,514 @@ typedef struct _CLIENTINFO
MSG msgDbcsCB;
ULONG Win32ClientInfo3[28];
/* It's just a pointer reference not to be used w the structure in user space. */
- PPROCESSINFO ppi;
+ PPROCESSINFO ppi;
} CLIENTINFO, *PCLIENTINFO;
/* Make sure it fits exactly into the TEB */
-#ifdef __i386__
C_ASSERT(sizeof(CLIENTINFO) == FIELD_OFFSET(TEB, glDispatchTable) - FIELD_OFFSET(TEB, Win32ClientInfo));
-#endif
#define GetWin32ClientInfo() ((PCLIENTINFO)(NtCurrentTeb()->Win32ClientInfo))
+typedef struct _REGISTER_SYSCLASS
+{
+ /* This is a reactos specific class used to initialize the
+ system window classes during user32 initialization */
+ UNICODE_STRING ClassName;
+ UINT Style;
+ WNDPROC ProcW;
+ WNDPROC ProcA;
+ UINT ExtraBytes;
+ HICON hCursor;
+ HBRUSH hBrush;
+ UINT ClassId;
+} REGISTER_SYSCLASS, *PREGISTER_SYSCLASS;
+
+typedef struct _CLSMENUNAME
+{
+ LPSTR pszClientAnsiMenuName;
+ LPWSTR pwszClientUnicodeMenuName;
+ PUNICODE_STRING pusMenuName;
+} CLSMENUNAME, *PCLSMENUNAME;
+
+typedef struct tagSBDATA
+{
+ INT posMin;
+ INT posMax;
+ INT page;
+ INT pos;
+} SBDATA, *PSBDATA;
+
+typedef struct tagSBINFO
+{
+ INT WSBflags;
+ SBDATA Horz;
+ SBDATA Vert;
+} SBINFO, *PSBINFO;
+
+typedef enum _GETCPD
+{
+ UserGetCPDU2A = 0x01,
+ UserGetCPDA2U = 0X02,
+ UserGetCPDClass = 0X10,
+ UserGetCPDWindow = 0X20,
+ UserGetCPDDialog = 0X40,
+ UserGetCPDWndtoCls = 0X80
+} GETCPD, *PGETCPD;
+
+typedef struct _CALLPROCDATA
+{
+ PROCDESKHEAD head;
+ struct _CALLPROCDATA *spcpdNext;
+ WNDPROC pfnClientPrevious;
+ union
+ {
+ GETCPD wType;
+ UINT Unicode : 1;
+ };
+} CALLPROCDATA, *PCALLPROCDATA;
+
+#define CSF_SERVERSIDEPROC 0x0001
+#define CSF_ANSIPROC 0x0002
+#define CSF_WOWDEFERDESTROY 0x0004
+#define CSF_SYSTEMCLASS 0x0008
+#define CSF_WOWCLASS 0x0010
+#define CSF_WOWEXTRA 0x0020
+#define CSF_CACHEDSMICON 0x0040
+#define CSF_WIN40COMPAT 0x0080
+
+typedef struct _CLS
+{
+ struct _CLS *pclsNext;
+ RTL_ATOM atomClassName;
+ ATOM atomNVClassName;
+ DWORD fnid;
+ struct _DESKTOP *rpdeskParent;
+ PVOID pdce;
+ DWORD CSF_flags;
+ PSTR lpszClientAnsiMenuName; // For client use
+ PWSTR lpszClientUnicodeMenuName; // " " "
+ PCALLPROCDATA spcpdFirst;
+ struct _CLS *pclsBase;
+ struct _CLS *pclsClone;
+ ULONG cWndReferenceCount;
+ UINT style;
+ WNDPROC lpfnWndProc;
+ union
+ {
+ WNDPROC WndProcExtra;
+ PCALLPROCDATA CallProc;
+ };
+ INT cbclsExtra;
+ INT cbwndExtra;
+ HINSTANCE hModule;
+ HANDLE hIcon; /* FIXME - Use pointer! */
+ //PCURSOR spicn;
+ HANDLE hCursor; /* FIXME - Use pointer! */
+ //PCURSOR spcur;
+ HBRUSH hbrBackground;
+ PWSTR lpszMenuName; // kernel use
+ PSTR lpszAnsiClassName; // "
+ HANDLE hIconSm; /* FIXME - Use pointer! */
+ //PCURSOR spicnSm;
+
+ UINT Destroying : 1; // CSF_WOWDEFERDESTROY
+ UINT Unicode : 1; // !CSF_ANSIPROC
+ UINT System : 1; // CSF_SYSTEMCLASS
+ UINT Global : 1; // CS_GLOBALCLASS
+ UINT MenuNameIsString : 1;
+ UINT NotUsed : 27;
+} CLS, *PCLS;
+
+
+// State Flags !Not Implemented!
+#define WNDS_HASMENU 0X00000001
+#define WNDS_HASVERTICALSCROOLLBAR 0X00000002
+#define WNDS_HASHORIZONTALSCROLLBAR 0X00000004
+#define WNDS_HASCAPTION 0X00000008
+#define WNDS_SENDSIZEMOVEMSGS 0X00000010
+#define WNDS_MSGBOX 0X00000020
+#define WNDS_ACTIVEFRAME 0X00000040
+#define WNDS_HASSPB 0X00000080
+#define WNDS_NONCPAINT 0X00000100
+#define WNDS_SENDERASEBACKGROUND 0X00000200
+#define WNDS_ERASEBACKGROUND 0X00000400
+#define WNDS_SENDNCPAINT 0X00000800
+#define WNDS_INTERNALPAINT 0X00001000
+#define WNDS_UPDATEDIRTY 0X00002000
+#define WNDS_HIDDENPOPUP 0X00004000
+#define WNDS_FORCEMENUDRAW 0X00008000
+#define WNDS_DIALOGWINDOW 0X00010000
+#define WNDS_HASCREATESTRUCTNAME 0X00020000
+#define WNDS_SERVERSIDEWINDOWPROC 0x00040000 // Call proc inside win32k.
+#define WNDS_ANSIWINDOWPROC 0x00080000
+#define WNDS_BEGINGACTIVATED 0x00100000
+#define WNDS_HASPALETTE 0x00200000
+#define WNDS_PAINTNOTPROCESSED 0x00400000
+#define WNDS_SYNCPAINTPENDING 0x00800000
+#define WNDS_RECIEVEDQUERYSUSPENDMSG 0x01000000
+#define WNDS_RECIEVEDSUSPENDMSG 0x02000000
+#define WNDS_TOGGLETOPMOST 0x04000000
+#define WNDS_REDRAWIFHUNG 0x08000000
+#define WNDS_REDRAWFRAMEIFHUNG 0x10000000
+#define WNDS_ANSICREATOR 0x20000000
+#define WNDS_MAXIMIZESTOMONITOR 0x40000000
+#define WNDS_DESTROYED 0x80000000
+
+// State2 Flags !Not Implemented!
+#define WNDS2_WMPAINTSENT 0X00000001
+#define WNDS2_ENDPAINTINVALIDATE 0X00000002
+#define WNDS2_STARTPAINT 0X00000004
+#define WNDS2_OLDUI 0X00000008
+#define WNDS2_HASCLIENTEDGE 0X00000010
+#define WNDS2_BOTTOMMOST 0X00000020
+#define WNDS2_FULLSCREEN 0X00000040
+#define WNDS2_INDESTROY 0X00000080
+#define WNDS2_WIN31COMPAT 0X00000100
+#define WNDS2_WIN40COMPAT 0X00000200
+#define WNDS2_WIN50COMPAT 0X00000400
+#define WNDS2_MAXIMIZEDMONITORREGION 0X00000800
+#define WNDS2_CLOSEBUTTONDOWN 0X00001000
+#define WNDS2_MAXIMIZEBUTTONDOWN 0X00002000
+#define WNDS2_MINIMIZEBUTTONDOWN 0X00004000
+#define WNDS2_HELPBUTTONDOWN 0X00008000
+#define WNDS2_SCROLLBARLINEUPBTNDOWN 0X00010000
+#define WNDS2_SCROLLBARPAGEUPBTNDOWN 0X00020000
+#define WNDS2_SCROLLBARPAGEDOWNBTNDOWN 0X00040000
+#define WNDS2_SCROLLBARLINEDOWNBTNDOWN 0X00080000
+#define WNDS2_ANYSCROLLBUTTONDOWN 0X00100000
+#define WNDS2_SCROLLBARVERTICALTRACKING 0X00200000
+#define WNDS2_FORCENCPAINT 0X00400000
+#define WNDS2_FORCEFULLNCPAINTCLIPRGN 0X00800000
+#define WNDS2_FULLSCREENMODE 0X01000000
+#define WNDS2_CAPTIONTEXTTRUNCATED 0X08000000
+#define WNDS2_NOMINMAXANIMATERECTS 0X10000000
+#define WNDS2_SMALLICONFROMWMQUERYDRAG 0X20000000
+#define WNDS2_SHELLHOOKREGISTERED 0X40000000
+#define WNDS2_WMCREATEMSGPROCESSED 0X80000000
+
+/* Non SDK ExStyles */
+#define WS_EX_MAKEVISIBLEWHENUNGHOSTED 0x00000800
+#define WS_EX_UISTATEACTIVE 0x04000000
+#define WS_EX_REDIRECTED 0X20000000
+#define WS_EX_UISTATEKBACCELHIDDEN 0X40000000
+#define WS_EX_UISTATEFOCUSRECTHIDDEN 0X80000000
+
+/* Non SDK Styles */
+#define WS_MAXIMIZED 0X01000000
+#define WS_MINIMIZED 0X20000000
+
+/* ExStyles2 */
+#define WS_EX2_CLIPBOARDLISTENER 0X00000001
+#define WS_EX2_LAYEREDINVALIDATE 0X00000002
+#define WS_EX2_REDIRECTEDFORPRINT 0X00000004
+#define WS_EX2_LINKED 0X00000008
+#define WS_EX2_LAYEREDFORDWM 0X00000010
+#define WS_EX2_LAYEREDLIMBO 0X00000020
+#define WS_EX2_HIGHTDPI_UNAWAR 0X00000040
+#define WS_EX2_VERTICALLYMAXIMIZEDLEFT 0X00000080
+#define WS_EX2_VERTICALLYMAXIMIZEDRIGHT 0X00000100
+#define WS_EX2_HASOVERLAY 0X00000200
+#define WS_EX2_CONSOLEWINDOW 0X00000400
+#define WS_EX2_CHILDNOACTIVATE 0X00000800
+
+typedef struct _WND
+{
+ THRDESKHEAD head;
+ DWORD state;
+ DWORD state2;
+ /* Extended style. */
+ DWORD ExStyle;
+ /* Style. */
+ DWORD style;
+ /* Handle of the module that created the window. */
+ HINSTANCE hModule;
+ DWORD fnid;
+ struct _WND *spwndNext;
+ struct _WND *spwndPrev;
+ struct _WND *spwndParent;
+ struct _WND *spwndChild;
+ struct _WND *spwndOwner;
+ RECT rcWindow;
+ RECT rcClient;
+ WNDPROC lpfnWndProc;
+ union
+ {
+ /* Pointer to a call procedure handle */
+ PCALLPROCDATA CallProc;
+ /* Extra Wnd proc (windows of system classes) */
+ WNDPROC WndProcExtra;
+ };
+
+ /* Pointer to the window class. */
+ PCLS pcls;
+ HRGN hrgnUpdate;
+ /* Property list head.*/
+ LIST_ENTRY PropListHead;
+ ULONG PropListItems;
+ /* Scrollbar info */
+ PSBINFO pSBInfo;
+ /* system menu handle. */
+ HMENU SystemMenu;
+ //PMENU spmenuSys;
+ /* Window menu handle or window id */
+ UINT IDMenu; // Use spmenu
+ //PMENU spmenu;
+ HRGN hrgnClip;
+ HRGN hrgnNewFrame;
+ /* Window name. */
+ UNICODE_STRING strName;
+ /* Size of the extra data associated with the window. */
+ ULONG cbwndExtra;
+ HWND hWndLastActive;
+ struct _WND *spwndLastActive;
+ //HIMC hImc; // Input context associated with this window.
+ LONG dwUserData;
+ //PACTIVATION_CONTEXT pActCtx;
+ //PD3DMATRIX pTransForm;
+ struct _WND *spwndClipboardListener;
+ DWORD ExStyle2;
+
+ struct
+ {
+ RECT NormalRect;
+ POINT IconPos;
+ POINT MaxPos;
+ } InternalPos;
+
+ UINT Unicode : 1; // !(WNDS_ANSICREATOR|WNDS_ANSIWINDOWPROC) ?
+ /* Indicates whether the window is derived from a system class */
+ UINT IsSystem : 1; // System class ?
+ UINT InternalPosInitialized : 1;
+ UINT HideFocus : 1; // WS_EX_UISTATEFOCUSRECTHIDDEN ?
+ UINT HideAccel : 1; // WS_EX_UISTATEKBACCELHIDDEN ?
+} WND, *PWND;
+
+typedef struct _PFNCLIENT
+{
+ WNDPROC pfnScrollBarWndProc;
+ WNDPROC pfnTitleWndProc;
+ WNDPROC pfnMenuWndProc;
+ WNDPROC pfnDesktopWndProc;
+ WNDPROC pfnDefWindowProc;
+ WNDPROC pfnMessageWindowProc;
+ WNDPROC pfnSwitchWindowProc;
+ WNDPROC pfnButtonWndProc;
+ WNDPROC pfnComboBoxWndProc;
+ WNDPROC pfnComboListBoxProc;
+ WNDPROC pfnDialogWndProc;
+ WNDPROC pfnEditWndProc;
+ WNDPROC pfnListBoxWndProc;
+ WNDPROC pfnMDIClientWndProc;
+ WNDPROC pfnStaticWndProc;
+ WNDPROC pfnImeWndProc;
+ WNDPROC pfnGhostWndProc;
+ WNDPROC pfnHkINLPCWPSTRUCT;
+ WNDPROC pfnHkINLPCWPRETSTRUCT;
+ WNDPROC pfnDispatchHook;
+ WNDPROC pfnDispatchDefWindowProc;
+ WNDPROC pfnDispatchMessage;
+ WNDPROC pfnMDIActivateDlgProc;
+} PFNCLIENT, *PPFNCLIENT;
+
+/*
+ Wine Common proc ( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL Unicode );
+ Windows uses Ansi == TRUE, Wine uses Unicode == TRUE.
+ */
+
+typedef LRESULT(CALLBACK *WNDPROC_EX)(HWND,UINT,WPARAM,LPARAM,BOOL);
+
+typedef struct _PFNCLIENTWORKER
+{
+ WNDPROC_EX pfnButtonWndProc;
+ WNDPROC_EX pfnComboBoxWndProc;
+ WNDPROC_EX pfnComboListBoxProc;
+ WNDPROC_EX pfnDialogWndProc;
+ WNDPROC_EX pfnEditWndProc;
+ WNDPROC_EX pfnListBoxWndProc;
+ WNDPROC_EX pfnMDIClientWndProc;
+ WNDPROC_EX pfnStaticWndProc;
+ WNDPROC_EX pfnImeWndProc;
+ WNDPROC_EX pfnGhostWndProc;
+ WNDPROC_EX pfnCtfHookProc;
+} PFNCLIENTWORKER, *PPFNCLIENTWORKER;
+
+typedef LONG_PTR (NTAPI *PFN_FNID)(PWND, UINT, WPARAM, LPARAM, ULONG_PTR);
+
+// FNID's for NtUserSetWindowFNID, NtUserMessageCall
+#define FNID_FIRST 0x029A
+#define FNID_SCROLLBAR 0x029A
+#define FNID_ICONTITLE 0x029B
+#define FNID_MENU 0x029C
+#define FNID_DESKTOP 0x029D
+#define FNID_DEFWINDOWPROC 0x029E
+#define FNID_MESSAGEWND 0x029F
+#define FNID_SWITCH 0x02A0
+#define FNID_BUTTON 0x02A1
+#define FNID_COMBOBOX 0x02A2
+#define FNID_COMBOLBOX 0x02A3
+#define FNID_DIALOG 0x02A4
+#define FNID_EDIT 0x02A5
+#define FNID_LISTBOX 0x02A6
+#define FNID_MDICLIENT 0x02A7
+#define FNID_STATIC 0x02A8
+#define FNID_IME 0x02A9
+#define FNID_GHOST 0x02AA
+#define FNID_CALLWNDPROC 0x02AB
+#define FNID_CALLWNDPROCRET 0x02AC
+#define FNID_HKINLPCWPEXSTRUCT 0x02AD
+#define FNID_HKINLPCWPRETEXSTRUCT 0x02AE
+#define FNID_MB_DLGPROC 0x02AF
+#define FNID_MDIACTIVATEDLGPROC 0x02B0
+#define FNID_SENDMESSAGE 0x02B1
+#define FNID_SENDMESSAGEFF 0x02B2
+// Kernel has option to use TimeOut or normal msg send, based on type of msg.
+#define FNID_SENDMESSAGEWTOOPTION 0x02B3
+#define FNID_SENDMESSAGETIMEOUT 0x02B4
+#define FNID_BROADCASTSYSTEMMESSAGE 0x02B5
+#define FNID_TOOLTIPS 0x02B6
+#define FNID_SENDNOTIFYMESSAGE 0x02B7
+#define FNID_SENDMESSAGECALLBACK 0x02B8
+#define FNID_LAST 0x02B9
+
+#define FNID_NUM FNID_LAST - FNID_FIRST + 1
+
+#define FNID_DDEML 0x2000 // Registers DDEML
+#define FNID_DESTROY 0x4000 // This is sent when WM_NCDESTROY or in the support routine.
+ // Seen during WM_CREATE on error exit too.
+
+// ICLS's for NtUserGetClassName FNID to ICLS, NtUserInitializeClientPfnArrays
+#define ICLS_BUTTON 0
+#define ICLS_EDIT 1
+#define ICLS_STATIC 2
+#define ICLS_LISTBOX 3
+#define ICLS_SCROLLBAR 4
+#define ICLS_COMBOBOX 5
+#define ICLS_MDICLIENT 6
+#define ICLS_COMBOLBOX 7
+#define ICLS_DDEMLEVENT 8
+#define ICLS_DDEMLMOTHER 9
+#define ICLS_DDEML16BIT 10
+#define ICLS_DDEMLCLIENTA 11
+#define ICLS_DDEMLCLIENTW 12
+#define ICLS_DDEMLSERVERA 13
+#define ICLS_DDEMLSERVERW 14
+#define ICLS_IME 15
+#define ICLS_DESKTOP 16
+#define ICLS_DIALOG 17
+#define ICLS_MENU 18
+#define ICLS_SWITCH 19
+#define ICLS_ICONTITLE 20
+#define ICLS_TOOLTIPS 21
+#if (_WIN32_WINNT <= 0x0501)
+#define ICLS_UNKNOWN 22
+#define ICLS_NOTUSED 23
+#else
+#define ICLS_SYSSHADOW 22
+#define ICLS_HWNDMESSAGE 23
+#define ICLS_UNKNOWN 24
+#define ICLS_NOTUSED 25
+#endif
+#define ICLS_END 31
+
+#define COLOR_LAST COLOR_MENUBAR
+#define MAX_MB_STRINGS 11
+
+#define SRVINFO_METRICS 0x0020
+
+typedef struct tagOEMBITMAPINFO
+{
+ INT x;
+ INT y;
+ INT cx;
+ INT cy;
+} OEMBITMAPINFO, *POEMBITMAPINFO;
+
+typedef struct tagMBSTRING
+{
+ WCHAR szName[16];
+ UINT uID;
+ UINT uStr;
+} MBSTRING, *PMBSTRING;
+
+typedef struct tagDPISERVERINFO
+{
+ INT gclBorder; /* 000 */
+ HFONT hCaptionFont; /* 004 */
+ HFONT hMsgFont; /* 008 */
+ INT cxMsgFontChar; /* 00C */
+ INT cyMsgFontChar; /* 010 */
+ UINT wMaxBtnSize; /* 014 */
+} DPISERVERINFO, *PDPISERVERINFO;
+
+typedef struct _PERUSERSERVERINFO
+{
+ INT aiSysMet[SM_CMETRICS];
+ ULONG argbSystemUnmatched[COLOR_LAST+1];
+ COLORREF argbSystem[COLOR_LAST+1];
+ HBRUSH ahbrSystem[COLOR_LAST+1];
+ HBRUSH hbrGray;
+ POINT ptCursor;
+ POINT ptCursorReal;
+ DWORD dwLastRITEventTickCount;
+ INT nEvents;
+ UINT dtScroll;
+ UINT dtLBSearch;
+ UINT dtCaretBlink;
+ UINT ucWheelScrollLines;
+ UINT ucWheelScrollChars;
+ INT wMaxLeftOverlapChars;
+ INT wMaxRightOverlapChars;
+ INT cxSysFontChar;
+ INT cySysFontChar;
+ TEXTMETRICW tmSysFont;
+ DPISERVERINFO dpiSystem;
+ HICON hIconSmWindows;
+ HICON hIcoWindows;
+ DWORD dwKeyCache;
+ DWORD dwAsyncKeyCache;
+ ULONG cCaptures;
+ OEMBITMAPINFO oembmi[93];
+ RECT rcScreenReal;
+ USHORT BitCount;
+ USHORT dmLogPixels;
+ BYTE Planes;
+ BYTE BitsPixel;
+ ULONG PUSIFlags;
+ UINT uCaretWidth;
+ USHORT UILangID;
+ DWORD dwLastSystemRITEventTickCountUpdate;
+ ULONG adwDBGTAGFlags[35];
+ DWORD dwTagCount;
+ DWORD dwRIPFlags;
+} PERUSERSERVERINFO, *PPERUSERSERVERINFO;
+
+typedef struct tagSERVERINFO
+{
+ DWORD dwSRVIFlags;
+ ULONG_PTR cHandleEntries;
+ PFN_FNID mpFnidPfn[FNID_NUM];
+ WNDPROC aStoCidPfn[7];
+ USHORT mpFnid_serverCBWndProc[FNID_NUM];
+ PFNCLIENT apfnClientA;
+ PFNCLIENT apfnClientW;
+ PFNCLIENTWORKER apfnClientWorker;
+ ULONG cbHandleTable;
+ ATOM atomSysClass[ICLS_NOTUSED+1];
+ DWORD dwDefaultHeapBase;
+ DWORD dwDefaultHeapSize;
+ UINT uiShellMsg;
+ MBSTRING MBStrings[MAX_MB_STRINGS];
+ ATOM atomIconSmProp;
+ ATOM atomIconProp;
+ ATOM atomContextHelpIdProp;
+ ATOM atomFrostedWindowProp;
+ CHAR acOemToAnsi[256];
+ CHAR acAnsiToOem[256];
+ DWORD dwInstalledEventHooks;
+ PERUSERSERVERINFO;
+} SERVERINFO, *PSERVERINFO;
+
+
// Server event activity bits.
#define SRV_EVENT_MENU 0x0001
#define SRV_EVENT_END_APPLICATION 0x0002
@@ -446,7 +693,7 @@ typedef struct _BROADCASTPARM
DWORD recipients;
HDESK hDesk;
HWND hWnd;
- LUID luid;
+ LUID luid;
} BROADCASTPARM, *PBROADCASTPARM;
PW32THREADINFO GetW32ThreadInfo(VOID);
@@ -464,7 +711,7 @@ typedef struct _SHAREDINFO
PVOID aheList; // Handle Entry List
PVOID pDispInfo; // global PDISPLAYINFO pointer
ULONG_PTR ulSharedDelta; // Heap delta
- WNDMSG awmControl[31];
+ WNDMSG awmControl[FNID_LAST - FNID_FIRST];
WNDMSG DefWindowMsgs;
WNDMSG DefWindowSpecMsgs;
} SHAREDINFO, *PSHAREDINFO;
@@ -480,8 +727,12 @@ typedef struct _USERCONNECT
//
// Non SDK Window Message types.
//
+#define WM_CLIENTSHUTDOWN 59
+#define WM_COPYGLOBALDATA 73
#define WM_SYSTIMER 280
#define WM_POPUPSYSTEMMENU 787
+#define WM_CBT 1023 // ReactOS only.
+#define WM_MAXIMUM 0x0001FFFF
//
// Non SDK DCE types.
@@ -998,6 +1249,18 @@ NtUserChangeDisplaySettings(
DWORD dwflags,
LPVOID lParam);
+BOOL
+NTAPI
+NtUserCheckDesktopByThreadId(
+ DWORD dwThreadId);
+
+BOOL
+NTAPI
+NtUserCheckWindowThreadDesktop(
+ HWND hwnd,
+ DWORD dwThreadId,
+ ULONG ReturnValue);
+
DWORD
NTAPI
NtUserCheckImeHotKey(
@@ -1071,11 +1334,11 @@ NtUserCreateCaret(
HDESK
NTAPI
NtUserCreateDesktop(
- PUNICODE_STRING lpszDesktopName,
+ POBJECT_ATTRIBUTES poa,
+ PUNICODE_STRING lpszDesktopDevice,
+ LPDEVMODEW lpdmw,
DWORD dwFlags,
- ACCESS_MASK dwDesiredAccess,
- LPSECURITY_ATTRIBUTES lpSecurity,
- HWINSTA hWindowStation);
+ ACCESS_MASK dwDesiredAccess);
DWORD
NTAPI
@@ -1125,7 +1388,7 @@ NtUserCreateWindowEx(
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam,
- DWORD dwFlags,
+ DWORD dwFlags, // |= 1 == Ansi
PVOID acbiBuffer);
#endif
@@ -1164,14 +1427,16 @@ NtUserDdeSetQualityOfService(
OUT PSECURITY_QUALITY_OF_SERVICE pqosPrev);
HDWP NTAPI
-NtUserDeferWindowPos(HDWP WinPosInfo,
- HWND Wnd,
- HWND WndInsertAfter,
- int x,
- int y,
- int cx,
- int cy,
- UINT Flags);
+NtUserDeferWindowPos(
+ HDWP WinPosInfo,
+ HWND Wnd,
+ HWND WndInsertAfter,
+ int x,
+ int y,
+ int cx,
+ int cy,
+ UINT Flags);
+
BOOL NTAPI
NtUserDefSetText(HWND WindowHandle, PLARGE_STRING WindowText);
@@ -1465,12 +1730,12 @@ NtUserGetControlColor(
HDC hdc,
UINT CtlMsg);
-DWORD
+ULONG_PTR
NTAPI
NtUserGetCPD(
- DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2);
+ HWND hWnd,
+ GETCPD Flags,
+ ULONG_PTR Proc);
DWORD
NTAPI
@@ -1747,11 +2012,11 @@ NtUserGetWindowPlacement(
HWND hWnd,
WINDOWPLACEMENT *lpwndpl);
-DWORD
+PCLS
NTAPI
NtUserGetWOWClass(
- DWORD Unknown0,
- DWORD Unknown1);
+ HINSTANCE hInstance,
+ PUNICODE_STRING ClassName);
DWORD
NTAPI
@@ -1776,7 +2041,7 @@ NtUserInitialize(
NTSTATUS
NTAPI
NtUserInitializeClientPfnArrays(
- PPFNCLIENT pfnClientA,
+ PPFNCLIENT pfnClientA,
PPFNCLIENT pfnClientW,
PPFNCLIENTWORKER pfnClientWorker,
HINSTANCE hmodUser);
@@ -1862,7 +2127,7 @@ NtUserMapVirtualKeyEx( UINT keyCode,
UINT transType,
DWORD keyboardId,
HKL dwhkl );
-LRESULT
+BOOL
NTAPI
NtUserMessageCall(
HWND hWnd,
@@ -2646,7 +2911,8 @@ NtUserUpdateLayeredWindow(
POINT *pptSrc,
COLORREF crKey,
BLENDFUNCTION *pblend,
- DWORD dwFlags);
+ DWORD dwFlags,
+ RECT *prcDirty);
BOOL
NTAPI
@@ -2713,6 +2979,11 @@ NtUserWin32PoolAllocationStats(
DWORD Unknown4,
DWORD Unknown5);
+HWND
+NTAPI
+NtUserWindowFromPhysicalPoint(
+ POINT Point);
+
HWND
NTAPI
NtUserWindowFromPoint(
@@ -2767,8 +3038,6 @@ typedef struct tagKMDDELPARAM
#define ONEPARAM_ROUTINE_GETWINDOWINSTANCE 0xfffe0010
#define ONEPARAM_ROUTINE_CREATECURICONHANDLE 0xfffe0025 // CREATE_EMPTY_CURSOR_OBJECT ?
#define ONEPARAM_ROUTINE_MSQSETWAKEMASK 0xfffe0027
-#define ONEPARAM_ROUTINE_REGISTERUSERMODULE 0xfffe0031
-#define ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID 0xfffe0047 // use HWND_ROUTINE_GETWNDCONTEXTHLPID
#define ONEPARAM_ROUTINE_GETCURSORPOSITION 0xfffe0048 // use ONEPARAM_ or TWOPARAM routine ?
#define TWOPARAM_ROUTINE_GETWINDOWRGNBOX 0xfffd0048 // user mode
#define TWOPARAM_ROUTINE_GETWINDOWRGN 0xfffd0049 // user mode
@@ -2785,9 +3054,6 @@ typedef struct tagKMDDELPARAM
#define TWOPARAM_ROUTINE_SETCARETPOS 0xfffd0060
#define TWOPARAM_ROUTINE_GETWINDOWINFO 0xfffd0061
#define TWOPARAM_ROUTINE_REGISTERLOGONPROC 0xfffd0062
-#define TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES 0xfffd0063
-#define TWOPARAM_ROUTINE_GETSYSCOLORPENS 0xfffd0064
-#define TWOPARAM_ROUTINE_GETSYSCOLORS 0xfffd0065
#define TWOPARAM_ROUTINE_ROS_ISACTIVEICON 0x1001
#define TWOPARAM_ROUTINE_ROS_NCDESTROY 0x1002
#define TWOPARAM_ROUTINE_ROS_REGSYSCLASSES 0x1003
@@ -2809,7 +3075,7 @@ NtUserCreateCursorIconHandle(
BOOL Indirect);
-/* Should be done in usermode */
+/* Should be done in usermode and use NtUserGetCPD. */
ULONG_PTR
NTAPI
NtUserGetClassLong(HWND hWnd, INT Offset, BOOL Ansi);
@@ -2851,7 +3117,7 @@ HWND
NTAPI
NtUserGetWindow(HWND hWnd, UINT Relationship);
-/* Should be done in usermode */
+/* Should be done in usermode and use NtUserGetCPD. */
LONG
NTAPI
NtUserGetWindowLong(HWND hWnd, DWORD Index, BOOL Ansi);
@@ -2943,22 +3209,6 @@ NtUserMonitorFromWindow(
IN DWORD dwFlags);
-/* FIXME: These flag constans aren't what Windows uses. */
-#define REGISTERCLASS_ANSI 2
-#define REGISTERCLASS_ALL (REGISTERCLASS_ANSI)
-
-RTL_ATOM
-NTAPI
-NtUserRegisterClassEx( // Need to use NtUserRegisterClassExWOW.
- CONST WNDCLASSEXW* lpwcx,
- PUNICODE_STRING ClassName,
- PUNICODE_STRING MenuName,
- WNDPROC wpExtra,
- DWORD Flags,
- HMENU hMenu);
-
-
-
typedef struct tagNTUSERSENDMESSAGEINFO
{
BOOL HandledByKernel;
@@ -2985,16 +3235,6 @@ NtUserSendMessageTimeout(HWND hWnd,
ULONG_PTR *uResult,
PNTUSERSENDMESSAGEINFO Info);
-/* use NtUserMessageCall */
-BOOL
-NTAPI
-NtUserSendNotifyMessage(
- HWND hWnd,
- UINT Msg,
- WPARAM wParam,
- LPARAM lParam);
-
-
typedef struct _SETSCROLLBARINFO
{
int nTrackPos;
diff --git a/reactos/include/reactos/wine/list.h b/reactos/include/reactos/wine/list.h
index 68cd4cfd083..0f8613ac694 100644
--- a/reactos/include/reactos/wine/list.h
+++ b/reactos/include/reactos/wine/list.h
@@ -21,6 +21,18 @@
#ifndef __WINE_SERVER_LIST_H
#define __WINE_SERVER_LIST_H
+#ifdef __cplusplus
+#define __WINE_SERVER_LIST_INLINE inline
+#else
+#if defined(__GNUC__)
+#define __WINE_SERVER_LIST_INLINE extern __inline__ __attribute__((__always_inline__))
+#elif defined(_MSC_VER)
+#define __WINE_SERVER_LIST_INLINE __inline
+#else
+#define __WINE_SERVER_LIST_INLINE static
+#endif
+#endif
+
struct list
{
struct list *next;
@@ -63,7 +75,7 @@ struct list
*/
/* add an element after the specified one */
-static inline void list_add_after( struct list *elem, struct list *to_add )
+__WINE_SERVER_LIST_INLINE void list_add_after( struct list *elem, struct list *to_add )
{
to_add->next = elem->next;
to_add->prev = elem;
@@ -72,7 +84,7 @@ static inline void list_add_after( struct list *elem, struct list *to_add )
}
/* add an element before the specified one */
-static inline void list_add_before( struct list *elem, struct list *to_add )
+__WINE_SERVER_LIST_INLINE void list_add_before( struct list *elem, struct list *to_add )
{
to_add->next = elem;
to_add->prev = elem->prev;
@@ -81,26 +93,26 @@ static inline void list_add_before( struct list *elem, struct list *to_add )
}
/* add element at the head of the list */
-static inline void list_add_head( struct list *list, struct list *elem )
+__WINE_SERVER_LIST_INLINE void list_add_head( struct list *list, struct list *elem )
{
list_add_after( list, elem );
}
/* add element at the tail of the list */
-static inline void list_add_tail( struct list *list, struct list *elem )
+__WINE_SERVER_LIST_INLINE void list_add_tail( struct list *list, struct list *elem )
{
list_add_before( list, elem );
}
/* remove an element from its list */
-static inline void list_remove( struct list *elem )
+__WINE_SERVER_LIST_INLINE void list_remove( struct list *elem )
{
elem->next->prev = elem->prev;
elem->prev->next = elem->next;
}
/* get the next element */
-static inline struct list *list_next( const struct list *list, const struct list *elem )
+__WINE_SERVER_LIST_INLINE struct list *list_next( const struct list *list, const struct list *elem )
{
struct list *ret = elem->next;
if (elem->next == list) ret = NULL;
@@ -108,7 +120,7 @@ static inline struct list *list_next( const struct list *list, const struct list
}
/* get the previous element */
-static inline struct list *list_prev( const struct list *list, const struct list *elem )
+__WINE_SERVER_LIST_INLINE struct list *list_prev( const struct list *list, const struct list *elem )
{
struct list *ret = elem->prev;
if (elem->prev == list) ret = NULL;
@@ -116,31 +128,31 @@ static inline struct list *list_prev( const struct list *list, const struct list
}
/* get the first element */
-static inline struct list *list_head( const struct list *list )
+__WINE_SERVER_LIST_INLINE struct list *list_head( const struct list *list )
{
return list_next( list, list );
}
/* get the last element */
-static inline struct list *list_tail( const struct list *list )
+__WINE_SERVER_LIST_INLINE struct list *list_tail( const struct list *list )
{
return list_prev( list, list );
}
/* check if a list is empty */
-static inline int list_empty( const struct list *list )
+__WINE_SERVER_LIST_INLINE int list_empty( const struct list *list )
{
return list->next == list;
}
/* initialize a list */
-static inline void list_init( struct list *list )
+__WINE_SERVER_LIST_INLINE void list_init( struct list *list )
{
list->next = list->prev = list;
}
/* count the elements of a list */
-static inline unsigned int list_count( const struct list *list )
+__WINE_SERVER_LIST_INLINE unsigned int list_count( const struct list *list )
{
unsigned count = 0;
const struct list *ptr;
@@ -149,7 +161,7 @@ static inline unsigned int list_count( const struct list *list )
}
/* move all elements from src to the tail of dst */
-static inline void list_move_tail( struct list *dst, struct list *src )
+__WINE_SERVER_LIST_INLINE void list_move_tail( struct list *dst, struct list *src )
{
if (list_empty(src)) return;
@@ -161,7 +173,7 @@ static inline void list_move_tail( struct list *dst, struct list *src )
}
/* move all elements from src to the head of dst */
-static inline void list_move_head( struct list *dst, struct list *src )
+__WINE_SERVER_LIST_INLINE void list_move_head( struct list *dst, struct list *src )
{
if (list_empty(src)) return;
diff --git a/reactos/include/reactos/wine/sys/types.h b/reactos/include/reactos/wine/sys/types.h
new file mode 100644
index 00000000000..1472467966d
--- /dev/null
+++ b/reactos/include/reactos/wine/sys/types.h
@@ -0,0 +1,21 @@
+#ifndef __WINE_SYS_TYPES_H
+#define __WINE_SYS_TYPES_H
+
+#include_next
+
+#ifndef _PID_T_
+#define _PID_T_
+#ifndef _WIN64
+typedef int _pid_t;
+#else
+typedef __int64 _pid_t;
+#endif
+#ifndef NO_OLDNAMES
+#ifndef __pid_t_defined
+#define __pid_t_defined
+typedef _pid_t pid_t;
+#endif /* __pid_t_defined */
+#endif
+#endif /* Not _PID_T_ */
+
+#endif /* __WINE_SYS_TYPES_H */
diff --git a/reactos/include/reactos/wine/test.h b/reactos/include/reactos/wine/test.h
index 96b5fb35def..af6480312d9 100644
--- a/reactos/include/reactos/wine/test.h
+++ b/reactos/include/reactos/wine/test.h
@@ -25,9 +25,10 @@
#include
#include
#include
-#include
-#include
+#ifdef __WINE_CONFIG_H
+#error config.h should not be used in Wine tests
+#endif
#ifdef __WINE_WINE_LIBRARY_H
#error wine/library.h should not be used in Wine tests
#endif
@@ -39,10 +40,10 @@
#endif
#ifndef INVALID_FILE_ATTRIBUTES
-#define INVALID_FILE_ATTRIBUTES ((DWORD)~0UL)
+#define INVALID_FILE_ATTRIBUTES (~0u)
#endif
#ifndef INVALID_SET_FILE_POINTER
-#define INVALID_SET_FILE_POINTER ((DWORD)~0UL)
+#define INVALID_SET_FILE_POINTER (~0u)
#endif
/* debug level */
@@ -257,29 +258,31 @@ int winetest_vok( int condition, const char *msg, va_list args )
{
if (condition)
{
- fprintf( stdout, "%s:%d: Test succeeded inside todo block",
+ fprintf( stdout, "%s:%d: Test succeeded inside todo block: ",
data->current_file, data->current_line );
- if (msg[0])
- {
- fprintf(stdout,": ");
- vfprintf(stdout, msg, args);
- }
+ vfprintf(stdout, msg, args);
InterlockedIncrement(&todo_failures);
return 0;
}
- else InterlockedIncrement(&todo_successes);
+ else
+ {
+ if (winetest_debug > 0)
+ {
+ fprintf( stdout, "%s:%d: Test marked todo: ",
+ data->current_file, data->current_line );
+ vfprintf(stdout, msg, args);
+ }
+ InterlockedIncrement(&todo_successes);
+ return 1;
+ }
}
else
{
if (!condition)
{
- fprintf( stdout, "%s:%d: Test failed",
+ fprintf( stdout, "%s:%d: Test failed: ",
data->current_file, data->current_line );
- if (msg[0])
- {
- fprintf( stdout,": ");
- vfprintf(stdout, msg, args);
- }
+ vfprintf(stdout, msg, args);
InterlockedIncrement(&failures);
return 0;
}
@@ -289,9 +292,9 @@ int winetest_vok( int condition, const char *msg, va_list args )
fprintf( stdout, "%s:%d: Test succeeded\n",
data->current_file, data->current_line);
InterlockedIncrement(&successes);
+ return 1;
}
}
- return 1;
}
int winetest_ok( int condition, const char *msg, ... )
@@ -391,13 +394,13 @@ void winetest_wait_child_process( HANDLE process )
{
if (exit_code > 255)
{
- fprintf( stdout, "%s: exception 0x%08x in child process\n", current_test->name, (unsigned int)exit_code );
+ fprintf( stdout, "%s: exception 0x%08x in child process\n", current_test->name, exit_code );
InterlockedIncrement( &failures );
}
else
{
fprintf( stdout, "%s: %u failures in child process\n",
- current_test->name, (unsigned int)exit_code );
+ current_test->name, exit_code );
while (exit_code-- > 0)
InterlockedIncrement(&failures);
}
@@ -453,10 +456,10 @@ static int run_test( const char *name )
if (winetest_debug)
{
fprintf( stdout, "%s: %d tests executed (%d marked as todo, %d %s), %d skipped.\n",
- test->name, (int)(successes + failures + todo_successes + todo_failures),
- (int)todo_successes, (int)(failures + todo_failures),
+ test->name, successes + failures + todo_successes + todo_failures,
+ todo_successes, failures + todo_failures,
(failures + todo_failures != 1) ? "failures" : "failure",
- (int)skipped );
+ skipped );
}
status = (failures + todo_failures < 255) ? failures + todo_failures : 255;
return status;
@@ -475,17 +478,18 @@ static void usage( const char *argv0 )
/* main function */
int main( int argc, char **argv )
{
- char *p;
+ char p[128];
setvbuf (stdout, NULL, _IONBF, 0);
winetest_argc = argc;
winetest_argv = argv;
- if ((p = getenv( "WINETEST_PLATFORM" ))) winetest_platform = _strdup(p);
- if ((p = getenv( "WINETEST_DEBUG" ))) winetest_debug = atoi(p);
- if ((p = getenv( "WINETEST_INTERACTIVE" ))) winetest_interactive = atoi(p);
- if ((p = getenv( "WINETEST_REPORT_SUCCESS"))) report_success = atoi(p);
+ if (GetEnvironmentVariableA( "WINETEST_PLATFORM", p, sizeof(p) )) winetest_platform = _strdup(p);
+ if (GetEnvironmentVariableA( "WINETEST_DEBUG", p, sizeof(p) )) winetest_debug = atoi(p);
+ if (GetEnvironmentVariableA( "WINETEST_INTERACTIVE", p, sizeof(p) )) winetest_interactive = atoi(p);
+ if (GetEnvironmentVariableA( "WINETEST_REPORT_SUCCESS", p, sizeof(p) )) report_success = atoi(p);
+
if (!argv[1])
{
if (winetest_testlist[0].name && !winetest_testlist[1].name) /* only one test */
diff --git a/reactos/include/reactos/wine/unicode.h b/reactos/include/reactos/wine/unicode.h
index 2bff22e56f3..6b2b3cf04d3 100644
--- a/reactos/include/reactos/wine/unicode.h
+++ b/reactos/include/reactos/wine/unicode.h
@@ -45,7 +45,11 @@
#define isprintW iswprint
#ifndef WINE_UNICODE_API
-#define WINE_UNICODE_API __attribute__((dllimport))
+# if defined(_MSC_VER)
+# define WINE_UNICODE_API __declspec(dllimport)
+# else
+# define WINE_UNICODE_API __attribute__((dllimport))
+# endif
#endif
#ifndef __VALIST
diff --git a/reactos/include/reactos/wine/winspool.h b/reactos/include/reactos/wine/winspool.h
index dd3084c03c1..a6d2be8b8a0 100644
--- a/reactos/include/reactos/wine/winspool.h
+++ b/reactos/include/reactos/wine/winspool.h
@@ -36,9 +36,6 @@ extern "C" {
/* DECLARATIONS */
-LONG WINAPI ExtDeviceMode( HWND hWnd, HANDLE hInst, LPDEVMODEA pDevModeOutput,
- LPSTR pDeviceName, LPSTR pPort, LPDEVMODEA pDevModeInput, LPSTR pProfile,
- DWORD fMode);
LPSTR WINAPI StartDocDlgA(HANDLE hPrinter, DOCINFOA *doc);
LPWSTR WINAPI StartDocDlgW(HANDLE hPrinter, DOCINFOW *doc);
diff --git a/reactos/include/reactos/wine/winuser.h b/reactos/include/reactos/wine/winuser.h
index 8ce6344dcff..df8efa3862a 100644
--- a/reactos/include/reactos/wine/winuser.h
+++ b/reactos/include/reactos/wine/winuser.h
@@ -12,7 +12,4 @@
#define DCX_USESTYLE 0x00010000
#define LB_CARETOFF 0x01a4
-WINUSERAPI UINT WINAPI PrivateExtractIconsA(LPCSTR,int,int,int,HICON*,UINT*,UINT,UINT);
-WINUSERAPI UINT WINAPI PrivateExtractIconsW(LPCWSTR,int,int,int,HICON*,UINT*,UINT,UINT);
-
#endif /* __WINE_WINUSER_H */
diff --git a/reactos/lib/3rdparty/mingw/crtexe.c b/reactos/lib/3rdparty/mingw/crtexe.c
index 23368b6c778..a3e613d7adc 100644
--- a/reactos/lib/3rdparty/mingw/crtexe.c
+++ b/reactos/lib/3rdparty/mingw/crtexe.c
@@ -88,7 +88,7 @@ static _startupinfo startinfo;
extern void _pei386_runtime_relocator (void);
static long CALLBACK _gnu_exception_handler (EXCEPTION_POINTERS * exception_data);
-static LONG __mingw_vex(EXCEPTION_POINTERS * exception_data);
+//static LONG __mingw_vex(EXCEPTION_POINTERS * exception_data);
#ifdef WPRFLAG
static void duplicate_ppstrings (int ac, wchar_t ***av);
#else
@@ -216,7 +216,7 @@ __tmainCRTStartup (void)
#if defined(__i386__) || defined(_M_IX86)
__writefsdword(0, 0xffffffff);
#endif
- AddVectoredExceptionHandler (0, (PVECTORED_EXCEPTION_HANDLER)__mingw_vex);
+ //AddVectoredExceptionHandler (0, (PVECTORED_EXCEPTION_HANDLER)__mingw_vex);
SetUnhandledExceptionFilter (_gnu_exception_handler);
_fpreset ();
@@ -402,6 +402,7 @@ _gnu_exception_handler (EXCEPTION_POINTERS * exception_data)
return action;
}
+#if 0
static LONG __mingw_vex(EXCEPTION_POINTERS * exception_data)
{
/* TODO this is not chainablem, therefore need rewrite. Disabled the ill code. */
@@ -426,6 +427,7 @@ static LONG __mingw_vex(EXCEPTION_POINTERS * exception_data)
#endif
return _gnu_exception_handler(exception_data);
}
+#endif
#ifdef WPRFLAG
diff --git a/reactos/lib/drivers/ip/network/arp.c b/reactos/lib/drivers/ip/network/arp.c
index c5b4967177e..8f4d7b6957a 100644
--- a/reactos/lib/drivers/ip/network/arp.c
+++ b/reactos/lib/drivers/ip/network/arp.c
@@ -147,7 +147,7 @@ BOOLEAN ARPTransmit(PIP_ADDRESS Address, PIP_INTERFACE Interface)
Interface->Address, /* Sender's (local) hardware address */
&Interface->Unicast.Address.IPv4Address,/* Sender's (local) protocol address */
NULL, /* Don't care */
- &Address->Address, /* Target's (remote) protocol address */
+ &Address->Address.IPv4Address, /* Target's (remote) protocol address */
ARP_OPCODE_REQUEST); /* ARP request */
if( !NdisPacket ) return FALSE;
diff --git a/reactos/lib/drivers/ip/network/icmp.c b/reactos/lib/drivers/ip/network/icmp.c
index 4fea4c7a419..ae022b8800b 100644
--- a/reactos/lib/drivers/ip/network/icmp.c
+++ b/reactos/lib/drivers/ip/network/icmp.c
@@ -10,6 +10,19 @@
#include "precomp.h"
+NTSTATUS ICMPStartup()
+{
+ IPRegisterProtocol(IPPROTO_ICMP, ICMPReceive);
+
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS ICMPShutdown()
+{
+ IPRegisterProtocol(IPPROTO_ICMP, NULL);
+
+ return STATUS_SUCCESS;
+}
VOID SendICMPComplete(
PVOID Context,
@@ -118,6 +131,89 @@ BOOLEAN PrepareICMPPacket(
return TRUE;
}
+VOID ICMPSendPacketComplete
+( PVOID Context, PNDIS_PACKET Packet, NDIS_STATUS Status ) {
+ FreeNdisPacket( Packet );
+}
+
+NTSTATUS ICMPSendDatagram(
+ PADDRESS_FILE AddrFile,
+ PTDI_CONNECTION_INFORMATION ConnInfo,
+ PCHAR BufferData,
+ ULONG DataSize,
+ PULONG DataUsed )
+/*
+ * FUNCTION: Sends an ICMP datagram to a remote address
+ * ARGUMENTS:
+ * Request = Pointer to TDI request
+ * ConnInfo = Pointer to connection information
+ * Buffer = Pointer to NDIS buffer with data
+ * DataSize = Size in bytes of data to be sent
+ * RETURNS:
+ * Status of operation
+ */
+{
+ IP_PACKET Packet;
+ PTA_IP_ADDRESS RemoteAddressTa = (PTA_IP_ADDRESS)ConnInfo->RemoteAddress;
+ IP_ADDRESS RemoteAddress, LocalAddress;
+ USHORT RemotePort;
+ NTSTATUS Status;
+ PNEIGHBOR_CACHE_ENTRY NCE;
+
+ TI_DbgPrint(MID_TRACE,("Sending Datagram(%x %x %x %d)\n",
+ AddrFile, ConnInfo, BufferData, DataSize));
+ TI_DbgPrint(MID_TRACE,("RemoteAddressTa: %x\n", RemoteAddressTa));
+
+ switch( RemoteAddressTa->Address[0].AddressType ) {
+ case TDI_ADDRESS_TYPE_IP:
+ RemoteAddress.Type = IP_ADDRESS_V4;
+ RemoteAddress.Address.IPv4Address =
+ RemoteAddressTa->Address[0].Address[0].in_addr;
+ RemotePort = RemoteAddressTa->Address[0].Address[0].sin_port;
+ break;
+
+ default:
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ TI_DbgPrint(MID_TRACE,("About to get route to destination\n"));
+
+ if(!(NCE = RouteGetRouteToDestination( &RemoteAddress )))
+ return STATUS_NETWORK_UNREACHABLE;
+
+ LocalAddress = AddrFile->Address;
+ if (AddrIsUnspecified(&LocalAddress))
+ {
+ /* If the local address is unspecified (0),
+ * then use the unicast address of the
+ * interface we're sending over
+ */
+ LocalAddress = NCE->Interface->Unicast;
+ }
+
+ Status = PrepareICMPPacket( NCE->Interface,
+ &Packet,
+ &RemoteAddress,
+ BufferData,
+ DataSize );
+
+ if( !NT_SUCCESS(Status) )
+ return Status;
+
+ TI_DbgPrint(MID_TRACE,("About to send datagram\n"));
+
+ if (!NT_SUCCESS(Status = IPSendDatagram( &Packet, NCE, ICMPSendPacketComplete, NULL )))
+ {
+ FreeNdisPacket(Packet.NdisPacket);
+ return Status;
+ }
+
+ TI_DbgPrint(MID_TRACE,("Leaving\n"));
+
+ return STATUS_SUCCESS;
+}
+
+
VOID ICMPReceive(
PIP_INTERFACE Interface,
@@ -145,6 +241,8 @@ VOID ICMPReceive(
TI_DbgPrint(DEBUG_ICMP, ("Checksum (0x%X).\n", ICMPHeader->Checksum));
+ RawIpReceive(Interface, IPPacket);
+
/* Checksum ICMP header and data */
if (!IPv4CorrectChecksum(IPPacket->Data, IPPacket->TotalSize - IPPacket->HeaderSize)) {
TI_DbgPrint(DEBUG_ICMP, ("Bad ICMP checksum.\n"));
diff --git a/reactos/lib/drivers/ip/network/interface.c b/reactos/lib/drivers/ip/network/interface.c
index b12286304d1..7e3f907f691 100644
--- a/reactos/lib/drivers/ip/network/interface.c
+++ b/reactos/lib/drivers/ip/network/interface.c
@@ -112,34 +112,6 @@ BOOLEAN AddrLocateADEv4(
return Matched;
}
-BOOLEAN IPGetDefaultAddress( PIP_ADDRESS Address ) {
- KIRQL OldIrql;
- BOOLEAN Matched = FALSE;
- IF_LIST_ITER(CurrentIF);
-
- TcpipAcquireSpinLock(&InterfaceListLock, &OldIrql);
-
- /* Find the first 'real' interface */
- ForEachInterface(CurrentIF) {
- if( CurrentIF->Context ) {
- *Address = CurrentIF->Unicast;
- Matched = TRUE; break;
- }
- } EndFor(CurrentIF);
-
- /* Not matched, use the first one */
- if( !Matched ) {
- ForEachInterface(CurrentIF) {
- *Address = CurrentIF->Unicast;
- Matched = TRUE; break;
- } EndFor(CurrentIF);
- }
-
- TcpipReleaseSpinLock(&InterfaceListLock, OldIrql);
-
- return Matched;
-}
-
BOOLEAN HasPrefix(
PIP_ADDRESS Address,
PIP_ADDRESS Prefix,
diff --git a/reactos/lib/drivers/ip/network/ip.c b/reactos/lib/drivers/ip/network/ip.c
index c9719dd52cc..3653fd282ba 100644
--- a/reactos/lib/drivers/ip/network/ip.c
+++ b/reactos/lib/drivers/ip/network/ip.c
@@ -19,24 +19,10 @@ UINT MaxLLHeaderSize; /* Largest maximum header size */
UINT MinLLFrameSize; /* Largest minimum frame size */
BOOLEAN IPInitialized = FALSE;
BOOLEAN IpWorkItemQueued = FALSE;
-NPAGED_LOOKASIDE_LIST IPPacketList;
/* Work around calling timer at Dpc level */
IP_PROTOCOL_HANDLER ProtocolTable[IP_PROTOCOL_TABLE_SIZE];
-
-VOID FreePacket(
- PVOID Object)
-/*
- * FUNCTION: Frees an IP packet object
- * ARGUMENTS:
- * Object = Pointer to an IP packet structure
- */
-{
- exFreeToNPagedLookasideList(&IPPacketList, Object);
-}
-
-
VOID DontFreePacket(
PVOID Object)
/*
@@ -58,34 +44,6 @@ VOID FreeIF(
exFreePool(Object);
}
-
-PIP_PACKET IPCreatePacket(ULONG Type)
-/*
- * FUNCTION: Creates an IP packet object
- * ARGUMENTS:
- * Type = Type of IP packet
- * RETURNS:
- * Pointer to the created IP packet. NULL if there was not enough free resources.
- */
-{
- PIP_PACKET IPPacket;
-
- IPPacket = exAllocateFromNPagedLookasideList(&IPPacketList);
- if (!IPPacket)
- return NULL;
-
- /* FIXME: Is this needed? */
- RtlZeroMemory(IPPacket, sizeof(IP_PACKET));
-
- INIT_TAG(IPPacket, TAG('I','P','K','T'));
-
- IPPacket->Free = FreePacket;
- IPPacket->Type = Type;
- IPPacket->HeaderSize = 20;
-
- return IPPacket;
-}
-
PIP_PACKET IPInitializePacket(
PIP_PACKET IPPacket,
ULONG Type)
@@ -155,11 +113,6 @@ VOID IPDispatchProtocol(
{
/* Call the appropriate protocol handler */
(*ProtocolTable[Protocol])(Interface, IPPacket);
-
- /* Special case for ICMP -- ICMP can be caught by a SOCK_RAW but also
- * must be handled here. */
- if( Protocol == IPPROTO_ICMP )
- ICMPReceive( Interface, IPPacket );
}
}
@@ -284,7 +237,7 @@ BOOLEAN IPRegisterInterface(
*/
{
KIRQL OldIrql;
- UINT ChosenIndex = 1;
+ UINT ChosenIndex = 0;
BOOLEAN IndexHasBeenChosen;
IF_LIST_ITER(Interface);
@@ -365,6 +318,8 @@ VOID DefaultProtocolHandler(
{
TI_DbgPrint(MID_TRACE, ("[IF %x] Packet of unknown Internet protocol "
"discarded.\n", Interface));
+
+ Interface->Stats.InDiscardedUnknownProto++;
}
@@ -415,15 +370,6 @@ NTSTATUS IPStartup(PUNICODE_STRING RegistryPath)
TAG('I','P','D','R'), /* Tag */
0); /* Depth */
- ExInitializeNPagedLookasideList(
- &IPPacketList, /* Lookaside list */
- NULL, /* Allocate routine */
- NULL, /* Free routine */
- 0, /* Flags */
- sizeof(IP_PACKET), /* Size of each entry */
- TAG('I','P','P','K'), /* Tag */
- 0); /* Depth */
-
ExInitializeNPagedLookasideList(
&IPFragmentList, /* Lookaside list */
NULL, /* Allocate routine */
@@ -491,7 +437,6 @@ NTSTATUS IPShutdown(
/* Destroy lookaside lists */
ExDeleteNPagedLookasideList(&IPHoleList);
ExDeleteNPagedLookasideList(&IPDRList);
- ExDeleteNPagedLookasideList(&IPPacketList);
ExDeleteNPagedLookasideList(&IPFragmentList);
IPInitialized = FALSE;
diff --git a/reactos/lib/drivers/ip/network/memtrack.c b/reactos/lib/drivers/ip/network/memtrack.c
index 1df319a841a..95964cf2b17 100644
--- a/reactos/lib/drivers/ip/network/memtrack.c
+++ b/reactos/lib/drivers/ip/network/memtrack.c
@@ -8,14 +8,6 @@
static LIST_ENTRY AllocatedObjectsList;
static KSPIN_LOCK AllocatedObjectsLock;
static NPAGED_LOOKASIDE_LIST AllocatedObjectsLookasideList;
-ULONG TagsToShow[MEMTRACK_MAX_TAGS_TO_TRACK] = { 0 };
-
-VOID TrackTag( ULONG Tag ) {
- UINT i;
-
- for( i = 0; TagsToShow[i]; i++ );
- TagsToShow[i] = Tag;
-}
VOID TrackingInit() {
TcpipInitializeSpinLock( &AllocatedObjectsLock );
@@ -82,9 +74,8 @@ VOID TrackWithTag( ULONG Tag, PVOID Thing, PCHAR FileName, ULONG LineNo ) {
if( ThingInList->Thing == Thing ) {
RemoveEntryList(Entry);
- TI_DbgPrint(MAX_TRACE,("TRACK: SPECIFIED ALREADY ALLOCATED ITEM %x\n", Thing));
- ShowTrackedThing( "Double Alloc (Item in list)", ThingInList, FALSE );
- ShowTrackedThing( "Double Alloc (Item not in list)", TrackedThing, FALSE );
+ ShowTrackedThing( "Double Alloc (Item in list)", ThingInList, TRUE );
+ ShowTrackedThing( "Double Alloc (Item not in list)", TrackedThing, TRUE );
ExFreeToNPagedLookasideList( &AllocatedObjectsLookasideList,
ThingInList );
@@ -99,14 +90,6 @@ VOID TrackWithTag( ULONG Tag, PVOID Thing, PCHAR FileName, ULONG LineNo ) {
TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
}
-BOOLEAN ShowTag( ULONG Tag ) {
- UINT i;
-
- for( i = 0; TagsToShow[i] && TagsToShow[i] != Tag; i++ );
-
- return TagsToShow[i] ? TRUE : FALSE;
-}
-
VOID UntrackFL( PCHAR File, ULONG Line, PVOID Thing, ULONG Tag ) {
KIRQL OldIrql;
PLIST_ENTRY Entry;
@@ -132,13 +115,21 @@ VOID UntrackFL( PCHAR File, ULONG Line, PVOID Thing, ULONG Tag ) {
TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
- /* TrackDumpFL( File, Line ); */
return;
}
Entry = Entry->Flink;
}
TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
- DbgPrint("UNTRACK: SPECIFIED ALREADY FREE ITEM %x\n", Thing);
+
+ DbgPrint("[Double Free] Thing %08x %c%c%c%c (%s:%d)\n",
+ Thing,
+ ((PCHAR)&Tag)[3],
+ ((PCHAR)&Tag)[2],
+ ((PCHAR)&Tag)[1],
+ ((PCHAR)&Tag)[0],
+ File,
+ Line);
+
ASSERT( FALSE );
}
diff --git a/reactos/lib/drivers/ip/network/neighbor.c b/reactos/lib/drivers/ip/network/neighbor.c
index dd1bc511035..92ba308168c 100644
--- a/reactos/lib/drivers/ip/network/neighbor.c
+++ b/reactos/lib/drivers/ip/network/neighbor.c
@@ -40,9 +40,9 @@ VOID NBSendPackets( PNEIGHBOR_CACHE_ENTRY NCE ) {
HashValue &= NB_HASHMASK;
/* Send any waiting packets */
- PacketEntry = ExInterlockedRemoveHeadList(&NCE->PacketQueue,
- &NeighborCache[HashValue].Lock);
- if( PacketEntry != NULL ) {
+ while ((PacketEntry = ExInterlockedRemoveHeadList(&NCE->PacketQueue,
+ &NeighborCache[HashValue].Lock)) != NULL)
+ {
Packet = CONTAINING_RECORD( PacketEntry, NEIGHBOR_PACKET, Next );
TI_DbgPrint
@@ -64,7 +64,6 @@ VOID NBSendPackets( PNEIGHBOR_CACHE_ENTRY NCE ) {
/* Must be called with table lock acquired */
VOID NBFlushPacketQueue( PNEIGHBOR_CACHE_ENTRY NCE,
- BOOLEAN CallComplete,
NTSTATUS ErrorCode ) {
PLIST_ENTRY PacketEntry;
PNEIGHBOR_PACKET Packet;
@@ -81,13 +80,10 @@ VOID NBFlushPacketQueue( PNEIGHBOR_CACHE_ENTRY NCE,
("PacketEntry: %x, NdisPacket %x\n",
PacketEntry, Packet->Packet));
- if( CallComplete )
- {
- ASSERT_KM_POINTER(Packet->Complete);
- Packet->Complete( Packet->Context,
- Packet->Packet,
- ErrorCode );
- }
+ ASSERT_KM_POINTER(Packet->Complete);
+ Packet->Complete( Packet->Context,
+ Packet->Packet,
+ ErrorCode );
exFreePool( Packet );
}
@@ -117,7 +113,7 @@ VOID NCETimeout(
so maybe it's not that big a problem */
/* Flush packet queue */
- NBFlushPacketQueue( NCE, TRUE, NDIS_STATUS_REQUEST_ABORTED );
+ NBFlushPacketQueue( NCE, NDIS_STATUS_REQUEST_ABORTED );
NCE->EventCount = 0;
}
else
@@ -213,7 +209,7 @@ VOID NBShutdown(VOID)
NextNCE = CurNCE->Next;
/* Flush wait queue */
- NBFlushPacketQueue( CurNCE, FALSE, STATUS_SUCCESS );
+ NBFlushPacketQueue( CurNCE, NDIS_STATUS_NOT_ACCEPTED );
CurNCE = NextNCE;
}
@@ -528,7 +524,7 @@ VOID NBRemoveNeighbor(
/* Found it, now unlink it from the list */
*PrevNCE = CurNCE->Next;
- NBFlushPacketQueue( CurNCE, TRUE, NDIS_STATUS_REQUEST_ABORTED );
+ NBFlushPacketQueue( CurNCE, NDIS_STATUS_REQUEST_ABORTED );
exFreePool(CurNCE);
break;
diff --git a/reactos/lib/drivers/ip/network/receive.c b/reactos/lib/drivers/ip/network/receive.c
index 19bd105e4d2..aff556b297a 100644
--- a/reactos/lib/drivers/ip/network/receive.c
+++ b/reactos/lib/drivers/ip/network/receive.c
@@ -174,7 +174,9 @@ PIPDATAGRAM_REASSEMBLY GetReassemblyInfo(
}
-PIP_PACKET ReassembleDatagram(
+BOOLEAN
+ReassembleDatagram(
+ PIP_PACKET IPPacket,
PIPDATAGRAM_REASSEMBLY IPDR)
/*
* FUNCTION: Reassembles an IP datagram
@@ -189,7 +191,6 @@ PIP_PACKET ReassembleDatagram(
* At this point, header is expected to point to the IP header
*/
{
- PIP_PACKET IPPacket;
PLIST_ENTRY CurrentEntry;
PIP_FRAGMENT Current;
PVOID Data;
@@ -201,11 +202,6 @@ PIP_PACKET ReassembleDatagram(
TI_DbgPrint(DEBUG_IP, ("Fragment header:\n"));
//OskitDumpBuffer((PCHAR)IPDR->IPv4Header, IPDR->HeaderSize);
- /* FIXME: Assume IPv4 */
- IPPacket = IPCreatePacket(IP_ADDRESS_V4);
- if (!IPPacket)
- return NULL;
-
IPPacket->TotalSize = IPDR->HeaderSize + IPDR->DataSize;
IPPacket->ContigSize = IPPacket->TotalSize;
IPPacket->HeaderSize = IPDR->HeaderSize;
@@ -219,7 +215,7 @@ PIP_PACKET ReassembleDatagram(
if (!IPPacket->Header) {
TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
(*IPPacket->Free)(IPPacket);
- return NULL;
+ return FALSE;
}
/* Copy the header into the buffer */
@@ -243,7 +239,7 @@ PIP_PACKET ReassembleDatagram(
CurrentEntry = CurrentEntry->Flink;
}
- return IPPacket;
+ return TRUE;
}
@@ -289,8 +285,9 @@ VOID ProcessFragment(
USHORT FragLast;
BOOLEAN MoreFragments;
PIPv4_HEADER IPv4Header;
- PIP_PACKET Datagram;
+ IP_PACKET Datagram;
PIP_FRAGMENT Fragment;
+ BOOLEAN Success;
/* FIXME: Assume IPv4 */
@@ -448,26 +445,31 @@ VOID ProcessFragment(
TI_DbgPrint(DEBUG_IP, ("Complete datagram received.\n"));
- Datagram = ReassembleDatagram(IPDR);
+ /* FIXME: Assumes IPv4 */
+ IPInitializePacket(&Datagram, IP_ADDRESS_V4);
+
+ Success = ReassembleDatagram(&Datagram, IPDR);
RemoveIPDR(IPDR);
TcpipReleaseSpinLock(&IPDR->Lock, OldIrql);
FreeIPDR(IPDR);
- if (!Datagram)
+ if (!Success)
/* Not enough free resources, discard the packet */
return;
- DISPLAY_IP_PACKET(Datagram);
+ DISPLAY_IP_PACKET(&Datagram);
/* Give the packet to the protocol dispatcher */
- IPDispatchProtocol(IF, Datagram);
+ IPDispatchProtocol(IF, &Datagram);
+
+ IF->Stats.InBytes += Datagram.TotalSize;
/* We're done with this datagram */
- exFreePool(Datagram->Header);
+ exFreePool(Datagram.Header);
TI_DbgPrint(MAX_TRACE, ("Freeing datagram at (0x%X).\n", Datagram));
- (*Datagram->Free)(Datagram);
+ (*Datagram.Free)(&Datagram);
} else
TcpipReleaseSpinLock(&IPDR->Lock, OldIrql);
}
diff --git a/reactos/lib/drivers/ip/network/router.c b/reactos/lib/drivers/ip/network/router.c
index 9ad58478177..2911da9ba85 100644
--- a/reactos/lib/drivers/ip/network/router.c
+++ b/reactos/lib/drivers/ip/network/router.c
@@ -415,7 +415,6 @@ PFIB_ENTRY RouterCreateRoute(
*/
{
KIRQL OldIrql;
- PFIB_ENTRY FIBE;
PLIST_ENTRY CurrentEntry;
PLIST_ENTRY NextEntry;
PFIB_ENTRY Current;
@@ -450,13 +449,7 @@ PFIB_ENTRY RouterCreateRoute(
return NULL;
}
- FIBE = RouterAddRoute(NetworkAddress, Netmask, NCE, Metric);
- if (!FIBE) {
- /* Not enough free resources */
- NBRemoveNeighbor(NCE);
- }
-
- return FIBE;
+ return RouterAddRoute(NetworkAddress, Netmask, NCE, Metric);
}
diff --git a/reactos/lib/drivers/ip/network/transmit.c b/reactos/lib/drivers/ip/network/transmit.c
index 1d78bfd773a..8372762079a 100644
--- a/reactos/lib/drivers/ip/network/transmit.c
+++ b/reactos/lib/drivers/ip/network/transmit.c
@@ -114,14 +114,17 @@ BOOLEAN PrepareNextFragment(
RtlCopyMemory(IFC->Data, IFC->DatagramData, DataSize); // SAFE
- FragOfs = (USHORT)IFC->Position; // Swap?
+ /* Fragment offset is in 8 byte blocks */
+ FragOfs = (USHORT)(IFC->Position / 8);
+
if (MoreFragments)
FragOfs |= IPv4_MF_MASK;
else
FragOfs &= ~IPv4_MF_MASK;
Header = IFC->Header;
- Header->FlagsFragOfs = FragOfs;
+ Header->FlagsFragOfs = WH2N(FragOfs);
+ Header->TotalLength = WH2N((USHORT)(DataSize + IFC->HeaderSize));
/* FIXME: Handle options */
@@ -240,6 +243,8 @@ NTSTATUS IPSendDatagram(PIP_PACKET IPPacket, PNEIGHBOR_CACHE_ENTRY NCE,
* send routine (IPSendFragment)
*/
{
+ UINT PacketSize;
+
TI_DbgPrint(MAX_TRACE, ("Called. IPPacket (0x%X) NCE (0x%X)\n", IPPacket, NCE));
DISPLAY_IP_PACKET(IPPacket);
@@ -248,21 +253,13 @@ NTSTATUS IPSendDatagram(PIP_PACKET IPPacket, PNEIGHBOR_CACHE_ENTRY NCE,
/* Fetch path MTU now, because it may change */
TI_DbgPrint(MID_TRACE,("PathMTU: %d\n", NCE->Interface->MTU));
- if ((IPPacket->Flags & IP_PACKET_FLAG_RAW) == 0) {
- /* Calculate checksum of IP header */
- TI_DbgPrint(MID_TRACE,("-> not IP_PACKET_FLAG_RAW\n"));
- ((PIPv4_HEADER)IPPacket->Header)->Checksum = 0;
+ NdisQueryPacket(IPPacket->NdisPacket,
+ NULL,
+ NULL,
+ NULL,
+ &PacketSize);
- ((PIPv4_HEADER)IPPacket->Header)->Checksum = (USHORT)
- IPv4Checksum(IPPacket->Header, IPPacket->HeaderSize, 0);
- TI_DbgPrint(MID_TRACE,("IP Check: %x\n", ((PIPv4_HEADER)IPPacket->Header)->Checksum));
-
- TI_DbgPrint(MAX_TRACE, ("Sending packet (length is %d).\n",
- WN2H(((PIPv4_HEADER)IPPacket->Header)->TotalLength)));
- } else {
- TI_DbgPrint(MAX_TRACE, ("Sending raw packet (flags are 0x%X).\n",
- IPPacket->Flags));
- }
+ NCE->Interface->Stats.OutBytes += PacketSize;
return SendFragments(IPPacket, NCE, NCE->Interface->MTU,
Complete, Context);
diff --git a/reactos/lib/drivers/ip/transport/datagram/datagram.c b/reactos/lib/drivers/ip/transport/datagram/datagram.c
index 6a7bd36ec43..620a0484944 100644
--- a/reactos/lib/drivers/ip/transport/datagram/datagram.c
+++ b/reactos/lib/drivers/ip/transport/datagram/datagram.c
@@ -106,7 +106,10 @@ VOID DGDeliverData(
while((CurrentEntry != &AddrFile->ReceiveQueue) && (!Found)) {
Current = CONTAINING_RECORD(CurrentEntry, DATAGRAM_RECEIVE_REQUEST, ListEntry);
- if( DstPort == AddrFile->Port ) {
+ if( DstPort == AddrFile->Port &&
+ (AddrIsEqual(DstAddress, &AddrFile->Address) ||
+ AddrIsUnspecified(&AddrFile->Address) ||
+ AddrIsUnspecified(DstAddress))) {
Found = TRUE;
/* Remove the request from the queue */
RemoveEntryList(&Current->ListEntry);
@@ -263,7 +266,8 @@ NTSTATUS DGReceiveDatagram(
}
else
{
- ReceiveRequest->RemotePort = 0;
+ ReceiveRequest->RemotePort = 0;
+ AddrInitIPv4(&ReceiveRequest->RemoteAddress, 0);
}
IoMarkIrpPending(Irp);
diff --git a/reactos/lib/drivers/ip/transport/rawip/rawip.c b/reactos/lib/drivers/ip/transport/rawip/rawip.c
index 2c8b5701a6c..8e5cc3fff83 100644
--- a/reactos/lib/drivers/ip/transport/rawip/rawip.c
+++ b/reactos/lib/drivers/ip/transport/rawip/rawip.c
@@ -59,7 +59,7 @@ NTSTATUS AddGenericHeaderIPv4(
/* Length of header and data */
IPHeader->TotalLength = WH2N((USHORT)IPPacket->TotalSize);
/* Identification */
- IPHeader->Id = 0;
+ IPHeader->Id = (USHORT)Random();
/* One fragment at offset 0 */
IPHeader->FlagsFragOfs = 0;
/* Time-to-Live is 128 */
@@ -126,7 +126,7 @@ NTSTATUS BuildRawIpPacket(
Status = AddGenericHeaderIPv4
(RemoteAddress, RemotePort,
LocalAddress, LocalPort, Packet, DataLen,
- IPPROTO_ICMP, /* XXX Figure out a better way to do this */
+ IPPROTO_RAW,
0, (PVOID *)&Payload );
break;
case IP_ADDRESS_V6:
@@ -210,11 +210,19 @@ NTSTATUS RawIPSendDatagram(
return STATUS_UNSUCCESSFUL;
}
+ TI_DbgPrint(MID_TRACE,("About to get route to destination\n"));
+
+ if(!(NCE = RouteGetRouteToDestination( &RemoteAddress )))
+ return STATUS_NETWORK_UNREACHABLE;
+
LocalAddress = AddrFile->Address;
if (AddrIsUnspecified(&LocalAddress))
{
- if (!IPGetDefaultAddress(&LocalAddress))
- return STATUS_UNSUCCESSFUL;
+ /* If the local address is unspecified (0),
+ * then use the unicast address of the
+ * interface we're sending over
+ */
+ LocalAddress = NCE->Interface->Unicast;
}
Status = BuildRawIpPacket( &Packet,
@@ -228,13 +236,6 @@ NTSTATUS RawIPSendDatagram(
if( !NT_SUCCESS(Status) )
return Status;
- TI_DbgPrint(MID_TRACE,("About to get route to destination\n"));
-
- if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
- FreeNdisPacket(Packet.NdisPacket);
- return STATUS_NETWORK_UNREACHABLE;
- }
-
TI_DbgPrint(MID_TRACE,("About to send datagram\n"));
if (!NT_SUCCESS(Status = IPSendDatagram( &Packet, NCE, RawIpSendPacketComplete, NULL )))
@@ -331,7 +332,7 @@ NTSTATUS RawIPStartup(VOID)
#endif
/* Register this protocol with IP layer */
- IPRegisterProtocol(IPPROTO_ICMP, RawIpReceive);
+ IPRegisterProtocol(IPPROTO_RAW, RawIpReceive);
return STATUS_SUCCESS;
}
@@ -345,7 +346,7 @@ NTSTATUS RawIPShutdown(VOID)
*/
{
/* Deregister this protocol with IP layer */
- IPRegisterProtocol(IPPROTO_ICMP, NULL);
+ IPRegisterProtocol(IPPROTO_RAW, NULL);
return STATUS_SUCCESS;
}
diff --git a/reactos/lib/drivers/ip/transport/tcp/accept.c b/reactos/lib/drivers/ip/transport/tcp/accept.c
index 6057da38310..f9648fa5058 100644
--- a/reactos/lib/drivers/ip/transport/tcp/accept.c
+++ b/reactos/lib/drivers/ip/transport/tcp/accept.c
@@ -11,50 +11,52 @@
#include "precomp.h"
NTSTATUS TCPServiceListeningSocket( PCONNECTION_ENDPOINT Listener,
- PCONNECTION_ENDPOINT Connection,
- PTDI_REQUEST_KERNEL Request ) {
+ PCONNECTION_ENDPOINT Connection,
+ PTDI_REQUEST_KERNEL Request ) {
NTSTATUS Status;
SOCKADDR_IN OutAddr;
OSK_UINT OutAddrLen;
PTA_IP_ADDRESS RequestAddressReturn;
PTDI_CONNECTION_INFORMATION WhoIsConnecting;
+ ASSERT_LOCKED(&TCPLock);
+
/* Unpack TDI info -- We need the return connection information
* struct to return the address so it can be filtered if needed
* by WSAAccept -- The returned address will be passed on to
* userland after we complete this irp */
WhoIsConnecting = (PTDI_CONNECTION_INFORMATION)
- Request->ReturnConnectionInformation;
+ Request->ReturnConnectionInformation;
Status = TCPTranslateError
- ( OskitTCPAccept( Listener->SocketContext,
- &Connection->SocketContext,
- &OutAddr,
- sizeof(OutAddr),
- &OutAddrLen,
- Request->RequestFlags & TDI_QUERY_ACCEPT ? 0 : 1 ) );
+ ( OskitTCPAccept( Listener->SocketContext,
+ &Connection->SocketContext,
+ &OutAddr,
+ sizeof(OutAddr),
+ &OutAddrLen,
+ Request->RequestFlags & TDI_QUERY_ACCEPT ? 0 : 1 ) );
TI_DbgPrint(DEBUG_TCP,("Status %x\n", Status));
if( NT_SUCCESS(Status) && Status != STATUS_PENDING ) {
- RequestAddressReturn = WhoIsConnecting->RemoteAddress;
+ RequestAddressReturn = WhoIsConnecting->RemoteAddress;
- TI_DbgPrint(DEBUG_TCP,("Copying address to %x (Who %x)\n",
- RequestAddressReturn, WhoIsConnecting));
+ TI_DbgPrint(DEBUG_TCP,("Copying address to %x (Who %x)\n",
+ RequestAddressReturn, WhoIsConnecting));
RequestAddressReturn->TAAddressCount = 1;
- RequestAddressReturn->Address[0].AddressLength = OutAddrLen;
+ RequestAddressReturn->Address[0].AddressLength = OutAddrLen;
/* BSD uses the first byte of the sockaddr struct as a length.
* Since windows doesn't do that we strip it */
- RequestAddressReturn->Address[0].AddressType =
- (OutAddr.sin_family >> 8) & 0xff;
+ RequestAddressReturn->Address[0].AddressType =
+ (OutAddr.sin_family >> 8) & 0xff;
- RtlCopyMemory( &RequestAddressReturn->Address[0].Address,
- ((PCHAR)&OutAddr) + sizeof(USHORT),
- sizeof(RequestAddressReturn->Address[0].Address[0]) );
+ RtlCopyMemory( &RequestAddressReturn->Address[0].Address,
+ ((PCHAR)&OutAddr) + sizeof(USHORT),
+ sizeof(RequestAddressReturn->Address[0].Address[0]) );
- TI_DbgPrint(DEBUG_TCP,("Done copying\n"));
+ TI_DbgPrint(DEBUG_TCP,("Done copying\n"));
}
TI_DbgPrint(DEBUG_TCP,("Status %x\n", Status));
@@ -71,7 +73,7 @@ NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog ) {
TI_DbgPrint(DEBUG_TCP,("TCPListen started\n"));
TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext %x\n",
- Connection->SocketContext));
+ Connection->SocketContext));
ASSERT(Connection);
ASSERT_KM_POINTER(Connection->SocketContext);
@@ -81,16 +83,16 @@ NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog ) {
AddressToBind.sin_family = AF_INET;
memcpy( &AddressToBind.sin_addr,
- &Connection->AddressFile->Address.Address.IPv4Address,
- sizeof(AddressToBind.sin_addr) );
+ &Connection->AddressFile->Address.Address.IPv4Address,
+ sizeof(AddressToBind.sin_addr) );
AddressToBind.sin_port = Connection->AddressFile->Port;
TI_DbgPrint(DEBUG_TCP,("AddressToBind - %x:%x\n", AddressToBind.sin_addr, AddressToBind.sin_port));
Status = TCPTranslateError( OskitTCPBind( Connection->SocketContext,
- Connection,
- &AddressToBind,
- sizeof(AddressToBind) ) );
+ Connection,
+ &AddressToBind,
+ sizeof(AddressToBind) ) );
if (NT_SUCCESS(Status))
Status = TCPTranslateError( OskitTCPListen( Connection->SocketContext, Backlog ) );
@@ -103,58 +105,60 @@ NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog ) {
}
VOID TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener,
- PCONNECTION_ENDPOINT Connection ) {
+ PCONNECTION_ENDPOINT Connection ) {
PLIST_ENTRY ListEntry;
PTDI_BUCKET Bucket;
+ KIRQL OldIrql;
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+ KeAcquireSpinLock(&Listener->Lock, &OldIrql);
ListEntry = Listener->ListenRequest.Flink;
while ( ListEntry != &Listener->ListenRequest ) {
- Bucket = CONTAINING_RECORD(ListEntry, TDI_BUCKET, Entry);
+ Bucket = CONTAINING_RECORD(ListEntry, TDI_BUCKET, Entry);
- if( Bucket->AssociatedEndpoint == Connection ) {
- RemoveEntryList( &Bucket->Entry );
- exFreePool( Bucket );
- break;
- }
-
- ListEntry = ListEntry->Flink;
+ if( Bucket->AssociatedEndpoint == Connection ) {
+ RemoveEntryList( &Bucket->Entry );
+ exFreePool( Bucket );
+ break;
}
- TcpipRecursiveMutexLeave( &TCPLock );
+ ListEntry = ListEntry->Flink;
+ }
+
+ KeReleaseSpinLock(&Listener->Lock, OldIrql);
}
-NTSTATUS TCPAccept
-( PTDI_REQUEST Request,
- PCONNECTION_ENDPOINT Listener,
- PCONNECTION_ENDPOINT Connection,
- PTCP_COMPLETION_ROUTINE Complete,
- PVOID Context ) {
- NTSTATUS Status;
- PTDI_BUCKET Bucket;
+NTSTATUS TCPAccept ( PTDI_REQUEST Request,
+ PCONNECTION_ENDPOINT Listener,
+ PCONNECTION_ENDPOINT Connection,
+ PTCP_COMPLETION_ROUTINE Complete,
+ PVOID Context )
+{
+ NTSTATUS Status;
+ PTDI_BUCKET Bucket;
- TI_DbgPrint(DEBUG_TCP,("TCPAccept started\n"));
+ TI_DbgPrint(DEBUG_TCP,("TCPAccept started\n"));
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+ TcpipRecursiveMutexEnter( &TCPLock, TRUE );
- Status = TCPServiceListeningSocket( Listener, Connection,
- (PTDI_REQUEST_KERNEL)Request );
+ Status = TCPServiceListeningSocket( Listener, Connection,
+ (PTDI_REQUEST_KERNEL)Request );
- if( Status == STATUS_PENDING ) {
- Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) );
+ TcpipRecursiveMutexLeave( &TCPLock );
- if( Bucket ) {
- Bucket->AssociatedEndpoint = Connection;
- Bucket->Request.RequestNotifyObject = Complete;
- Bucket->Request.RequestContext = Context;
- InsertHeadList( &Listener->ListenRequest, &Bucket->Entry );
- } else
- Status = STATUS_NO_MEMORY;
- }
+ if( Status == STATUS_PENDING ) {
+ Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) );
- TcpipRecursiveMutexLeave( &TCPLock );
+ if( Bucket ) {
+ Bucket->AssociatedEndpoint = Connection;
+ Bucket->Request.RequestNotifyObject = Complete;
+ Bucket->Request.RequestContext = Context;
+ IoMarkIrpPending((PIRP)Context);
+ ExInterlockedInsertTailList( &Listener->ListenRequest, &Bucket->Entry, &Listener->Lock );
+ } else
+ Status = STATUS_NO_MEMORY;
+ }
- TI_DbgPrint(DEBUG_TCP,("TCPAccept finished %x\n", Status));
- return Status;
+ TI_DbgPrint(DEBUG_TCP,("TCPAccept finished %x\n", Status));
+ return Status;
}
diff --git a/reactos/lib/drivers/ip/transport/tcp/event.c b/reactos/lib/drivers/ip/transport/tcp/event.c
index cdb527689fa..bd67997dc14 100644
--- a/reactos/lib/drivers/ip/transport/tcp/event.c
+++ b/reactos/lib/drivers/ip/transport/tcp/event.c
@@ -11,46 +11,48 @@
#include "precomp.h"
int TCPSocketState(void *ClientData,
- void *WhichSocket,
- void *WhichConnection,
- OSK_UINT NewState ) {
+ void *WhichSocket,
+ void *WhichConnection,
+ OSK_UINT NewState ) {
PCONNECTION_ENDPOINT Connection = WhichConnection;
+ ASSERT_LOCKED(&TCPLock);
+
TI_DbgPrint(MID_TRACE,("Flags: %c%c%c%c\n",
- NewState & SEL_CONNECT ? 'C' : 'c',
- NewState & SEL_READ ? 'R' : 'r',
- NewState & SEL_FIN ? 'F' : 'f',
- NewState & SEL_ACCEPT ? 'A' : 'a'));
+ NewState & SEL_CONNECT ? 'C' : 'c',
+ NewState & SEL_READ ? 'R' : 'r',
+ NewState & SEL_FIN ? 'F' : 'f',
+ NewState & SEL_ACCEPT ? 'A' : 'a'));
TI_DbgPrint(DEBUG_TCP,("Called: NewState %x (Conn %x) (Change %x)\n",
- NewState, Connection,
- Connection ? Connection->State ^ NewState :
- NewState));
+ NewState, Connection,
+ Connection ? Connection->State ^ NewState :
+ NewState));
if( !Connection ) {
- TI_DbgPrint(DEBUG_TCP,("Socket closing.\n"));
- Connection = FileFindConnectionByContext( WhichSocket );
- if( !Connection )
- return 0;
- else
- TI_DbgPrint(DEBUG_TCP,("Found socket %x\n", Connection));
+ TI_DbgPrint(DEBUG_TCP,("Socket closing.\n"));
+ Connection = FileFindConnectionByContext( WhichSocket );
+ if( !Connection )
+ return 0;
+ else
+ TI_DbgPrint(DEBUG_TCP,("Found socket %x\n", Connection));
}
TI_DbgPrint(MID_TRACE,("Connection signalled: %d\n",
- Connection->Signalled));
+ Connection->Signalled));
Connection->SignalState |= NewState;
if( !Connection->Signalled ) {
- Connection->Signalled = TRUE;
- InsertTailList( &SignalledConnections, &Connection->SignalList );
+ Connection->Signalled = TRUE;
+ ExInterlockedInsertTailList( &SignalledConnectionsList, &Connection->SignalList, &SignalledConnectionsLock );
}
return 0;
}
void TCPPacketSendComplete( PVOID Context,
- PNDIS_PACKET NdisPacket,
- NDIS_STATUS NdisStatus ) {
+ PNDIS_PACKET NdisPacket,
+ NDIS_STATUS NdisStatus ) {
TI_DbgPrint(DEBUG_TCP,("called %x\n", NdisPacket));
FreeNdisPacket(NdisPacket);
TI_DbgPrint(DEBUG_TCP,("done\n"));
@@ -65,33 +67,35 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) {
IP_ADDRESS RemoteAddress, LocalAddress;
PIPv4_HEADER Header;
+ ASSERT_LOCKED(&TCPLock);
+
if( *data == 0x45 ) { /* IPv4 */
- Header = (PIPv4_HEADER)data;
- LocalAddress.Type = IP_ADDRESS_V4;
- LocalAddress.Address.IPv4Address = Header->SrcAddr;
- RemoteAddress.Type = IP_ADDRESS_V4;
- RemoteAddress.Address.IPv4Address = Header->DstAddr;
+ Header = (PIPv4_HEADER)data;
+ LocalAddress.Type = IP_ADDRESS_V4;
+ LocalAddress.Address.IPv4Address = Header->SrcAddr;
+ RemoteAddress.Type = IP_ADDRESS_V4;
+ RemoteAddress.Address.IPv4Address = Header->DstAddr;
} else {
- TI_DbgPrint(MIN_TRACE,("Outgoing packet is not IPv4\n"));
- OskitDumpBuffer( data, len );
- return OSK_EINVAL;
+ TI_DbgPrint(MIN_TRACE,("Outgoing packet is not IPv4\n"));
+ OskitDumpBuffer( data, len );
+ return OSK_EINVAL;
}
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
- TI_DbgPrint(MIN_TRACE,("No route to %s\n", A2S(&RemoteAddress)));
- return OSK_EADDRNOTAVAIL;
+ TI_DbgPrint(MIN_TRACE,("No route to %s\n", A2S(&RemoteAddress)));
+ return OSK_EADDRNOTAVAIL;
}
NdisStatus = AllocatePacketWithBuffer( &Packet.NdisPacket, NULL,
- MaxLLHeaderSize + len );
+ MaxLLHeaderSize + len );
if (NdisStatus != NDIS_STATUS_SUCCESS) {
- TI_DbgPrint(DEBUG_TCP, ("Error from NDIS: %08x\n", NdisStatus));
- return OSK_ENOBUFS;
+ TI_DbgPrint(DEBUG_TCP, ("Error from NDIS: %08x\n", NdisStatus));
+ return OSK_ENOBUFS;
}
GetDataPtr( Packet.NdisPacket, MaxLLHeaderSize,
- (PCHAR *)&Packet.Header, &Packet.ContigSize );
+ (PCHAR *)&Packet.Header, &Packet.ContigSize );
RtlCopyMemory( Packet.Header, data, len );
@@ -110,41 +114,46 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) {
}
int TCPSleep( void *ClientData, void *token, int priority, char *msg,
- int tmio ) {
+ int tmio ) {
PSLEEPING_THREAD SleepingThread;
+ LARGE_INTEGER Timeout;
+
+ ASSERT_LOCKED(&TCPLock);
TI_DbgPrint(DEBUG_TCP,
- ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n",
- token, priority, msg, tmio));
+ ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n",
+ token, priority, msg, tmio));
SleepingThread = exAllocatePool( NonPagedPool, sizeof( *SleepingThread ) );
if( SleepingThread ) {
- KeInitializeEvent( &SleepingThread->Event, NotificationEvent, FALSE );
- SleepingThread->SleepToken = token;
+ KeInitializeEvent( &SleepingThread->Event, NotificationEvent, FALSE );
+ SleepingThread->SleepToken = token;
- /* We're going to sleep and need to release the lock, otherwise
+ /* We're going to sleep and need to release the lock, otherwise
it's impossible to re-enter oskittcp to deliver the event that's
going to wake us */
- TcpipRecursiveMutexLeave( &TCPLock );
+ TcpipRecursiveMutexLeave( &TCPLock );
- TcpipAcquireFastMutex( &SleepingThreadsLock );
- InsertTailList( &SleepingThreadsList, &SleepingThread->Entry );
- TcpipReleaseFastMutex( &SleepingThreadsLock );
+ TcpipAcquireFastMutex( &SleepingThreadsLock );
+ InsertTailList( &SleepingThreadsList, &SleepingThread->Entry );
+ TcpipReleaseFastMutex( &SleepingThreadsLock );
- TI_DbgPrint(DEBUG_TCP,("Waiting on %x\n", token));
- KeWaitForSingleObject( &SleepingThread->Event,
- WrSuspended,
- KernelMode,
- TRUE,
- NULL );
+ Timeout.QuadPart = Int32x32To64(tmio, -10000);
- TcpipAcquireFastMutex( &SleepingThreadsLock );
- RemoveEntryList( &SleepingThread->Entry );
- TcpipReleaseFastMutex( &SleepingThreadsLock );
+ TI_DbgPrint(DEBUG_TCP,("Waiting on %x\n", token));
+ KeWaitForSingleObject( &SleepingThread->Event,
+ Executive,
+ KernelMode,
+ TRUE,
+ (tmio != 0) ? &Timeout : NULL );
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+ TcpipAcquireFastMutex( &SleepingThreadsLock );
+ RemoveEntryList( &SleepingThread->Entry );
+ TcpipReleaseFastMutex( &SleepingThreadsLock );
- exFreePool( SleepingThread );
+ TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+
+ exFreePool( SleepingThread );
} else
return OSK_ENOBUFS;
@@ -156,16 +165,18 @@ void TCPWakeup( void *ClientData, void *token ) {
PLIST_ENTRY Entry;
PSLEEPING_THREAD SleepingThread;
+ ASSERT_LOCKED(&TCPLock);
+
TcpipAcquireFastMutex( &SleepingThreadsLock );
Entry = SleepingThreadsList.Flink;
while( Entry != &SleepingThreadsList ) {
- SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry);
- TI_DbgPrint(DEBUG_TCP,("Sleeper @ %x\n", SleepingThread));
- if( SleepingThread->SleepToken == token ) {
- TI_DbgPrint(DEBUG_TCP,("Setting event to wake %x\n", token));
- KeSetEvent( &SleepingThread->Event, IO_NETWORK_INCREMENT, FALSE );
- }
- Entry = Entry->Flink;
+ SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry);
+ TI_DbgPrint(DEBUG_TCP,("Sleeper @ %x\n", SleepingThread));
+ if( SleepingThread->SleepToken == token ) {
+ TI_DbgPrint(DEBUG_TCP,("Setting event to wake %x\n", token));
+ KeSetEvent( &SleepingThread->Event, IO_NETWORK_INCREMENT, FALSE );
+ }
+ Entry = Entry->Flink;
}
TcpipReleaseFastMutex( &SleepingThreadsLock );
}
@@ -216,10 +227,12 @@ TCPMemStartup( void )
}
void *TCPMalloc( void *ClientData,
- OSK_UINT Bytes, OSK_PCHAR File, OSK_UINT Line ) {
+ OSK_UINT Bytes, OSK_PCHAR File, OSK_UINT Line ) {
void *v;
ULONG Signature;
+ ASSERT_LOCKED(&TCPLock);
+
#if 0 != MEM_PROFILE
static OSK_UINT *Sizes = NULL, *Counts = NULL, ArrayAllocated = 0;
static OSK_UINT ArrayUsed = 0, AllocationCount = 0;
@@ -228,84 +241,86 @@ void *TCPMalloc( void *ClientData,
Found = 0;
for ( i = 0; i < ArrayUsed && ! Found; i++ ) {
- Found = ( Sizes[i] == Bytes );
- if ( Found ) {
- Counts[i]++;
- }
+ Found = ( Sizes[i] == Bytes );
+ if ( Found ) {
+ Counts[i]++;
+ }
}
if ( ! Found ) {
- if ( ArrayAllocated <= ArrayUsed ) {
- NewSize = ( 0 == ArrayAllocated ? 16 : 2 * ArrayAllocated );
- NewArray = exAllocatePool( NonPagedPool, 2 * NewSize * sizeof( OSK_UINT ) );
- if ( NULL != NewArray ) {
- if ( 0 != ArrayAllocated ) {
- memcpy( NewArray, Sizes,
- ArrayAllocated * sizeof( OSK_UINT ) );
- exFreePool( Sizes );
- memcpy( NewArray + NewSize, Counts,
- ArrayAllocated * sizeof( OSK_UINT ) );
- exFreePool( Counts );
- }
- Sizes = NewArray;
- Counts = NewArray + NewSize;
- ArrayAllocated = NewSize;
- } else if ( 0 != ArrayAllocated ) {
- exFreePool( Sizes );
- exFreePool( Counts );
- ArrayAllocated = 0;
- }
- }
- if ( ArrayUsed < ArrayAllocated ) {
- Sizes[ArrayUsed] = Bytes;
- Counts[ArrayUsed] = 1;
- ArrayUsed++;
- }
+ if ( ArrayAllocated <= ArrayUsed ) {
+ NewSize = ( 0 == ArrayAllocated ? 16 : 2 * ArrayAllocated );
+ NewArray = exAllocatePool( NonPagedPool, 2 * NewSize * sizeof( OSK_UINT ) );
+ if ( NULL != NewArray ) {
+ if ( 0 != ArrayAllocated ) {
+ memcpy( NewArray, Sizes,
+ ArrayAllocated * sizeof( OSK_UINT ) );
+ exFreePool( Sizes );
+ memcpy( NewArray + NewSize, Counts,
+ ArrayAllocated * sizeof( OSK_UINT ) );
+ exFreePool( Counts );
+ }
+ Sizes = NewArray;
+ Counts = NewArray + NewSize;
+ ArrayAllocated = NewSize;
+ } else if ( 0 != ArrayAllocated ) {
+ exFreePool( Sizes );
+ exFreePool( Counts );
+ ArrayAllocated = 0;
+ }
+ }
+ if ( ArrayUsed < ArrayAllocated ) {
+ Sizes[ArrayUsed] = Bytes;
+ Counts[ArrayUsed] = 1;
+ ArrayUsed++;
+ }
}
if ( 0 == (++AllocationCount % MEM_PROFILE) ) {
- TI_DbgPrint(DEBUG_TCP, ("Memory allocation size profile:\n"));
- for ( i = 0; i < ArrayUsed; i++ ) {
- TI_DbgPrint(DEBUG_TCP,
- ("Size %4u Count %5u\n", Sizes[i], Counts[i]));
- }
- TI_DbgPrint(DEBUG_TCP, ("End of memory allocation size profile\n"));
+ TI_DbgPrint(DEBUG_TCP, ("Memory allocation size profile:\n"));
+ for ( i = 0; i < ArrayUsed; i++ ) {
+ TI_DbgPrint(DEBUG_TCP,
+ ("Size %4u Count %5u\n", Sizes[i], Counts[i]));
+ }
+ TI_DbgPrint(DEBUG_TCP, ("End of memory allocation size profile\n"));
}
#endif /* MEM_PROFILE */
if ( SMALL_SIZE == Bytes ) {
- v = ExAllocateFromNPagedLookasideList( &SmallLookasideList );
- Signature = SIGNATURE_SMALL;
+ v = ExAllocateFromNPagedLookasideList( &SmallLookasideList );
+ Signature = SIGNATURE_SMALL;
} else if ( LARGE_SIZE == Bytes ) {
- v = ExAllocateFromNPagedLookasideList( &LargeLookasideList );
- Signature = SIGNATURE_LARGE;
+ v = ExAllocateFromNPagedLookasideList( &LargeLookasideList );
+ Signature = SIGNATURE_LARGE;
} else {
- v = ExAllocatePool( NonPagedPool, Bytes + sizeof(ULONG) );
- Signature = SIGNATURE_OTHER;
+ v = ExAllocatePool( NonPagedPool, Bytes + sizeof(ULONG) );
+ Signature = SIGNATURE_OTHER;
}
if( v ) {
- *((ULONG *) v) = Signature;
- v = (void *)((char *) v + sizeof(ULONG));
- TrackWithTag( FOURCC('f','b','s','d'), v, (PCHAR)File, Line );
+ *((ULONG *) v) = Signature;
+ v = (void *)((char *) v + sizeof(ULONG));
+ TrackWithTag( FOURCC('f','b','s','d'), v, (PCHAR)File, Line );
}
return v;
}
void TCPFree( void *ClientData,
- void *data, OSK_PCHAR File, OSK_UINT Line ) {
+ void *data, OSK_PCHAR File, OSK_UINT Line ) {
ULONG Signature;
+ ASSERT_LOCKED(&TCPLock);
+
UntrackFL( (PCHAR)File, Line, data, FOURCC('f','b','s','d') );
data = (void *)((char *) data - sizeof(ULONG));
Signature = *((ULONG *) data);
if ( SIGNATURE_SMALL == Signature ) {
- ExFreeToNPagedLookasideList( &SmallLookasideList, data );
+ ExFreeToNPagedLookasideList( &SmallLookasideList, data );
} else if ( SIGNATURE_LARGE == Signature ) {
- ExFreeToNPagedLookasideList( &LargeLookasideList, data );
+ ExFreeToNPagedLookasideList( &LargeLookasideList, data );
} else if ( SIGNATURE_OTHER == Signature ) {
- ExFreePool( data );
+ ExFreePool( data );
} else {
- ASSERT( FALSE );
+ ASSERT( FALSE );
}
}
diff --git a/reactos/lib/drivers/ip/transport/tcp/if.c b/reactos/lib/drivers/ip/transport/tcp/if.c
index 3f78bd01ae5..d9598aff798 100644
--- a/reactos/lib/drivers/ip/transport/tcp/if.c
+++ b/reactos/lib/drivers/ip/transport/tcp/if.c
@@ -33,12 +33,16 @@ struct ifnet *ifnet;
POSK_IFADDR TCPGetInterfaceData( PIP_INTERFACE IF ) {
NTSTATUS Status;
POSK_IFADDR ifaddr = IF->TCPContext;
+ struct sockaddr_in *addr_in;
+ struct sockaddr_in *dstaddr_in;
ASSERT(ifaddr);
+ ASSERT_LOCKED(&TCPLock);
+
RtlZeroMemory(ifaddr, sizeof(OSK_IFADDR) + 2 * sizeof( struct sockaddr_in ));
- struct sockaddr_in *addr_in = (struct sockaddr_in *)&ifaddr[1];
- struct sockaddr_in *dstaddr_in = (struct sockaddr_in *)&addr_in[1];
+ addr_in = (struct sockaddr_in *)&ifaddr[1];
+ dstaddr_in = (struct sockaddr_in *)&addr_in[1];
TI_DbgPrint(DEBUG_TCPIF,("Called\n"));
@@ -49,13 +53,13 @@ POSK_IFADDR TCPGetInterfaceData( PIP_INTERFACE IF ) {
ifaddr->ifa_addr = (struct sockaddr *)addr_in;
Status = GetInterfaceIPv4Address( IF,
- ADE_UNICAST,
- (PULONG)&addr_in->sin_addr.s_addr );
+ ADE_UNICAST,
+ (PULONG)&addr_in->sin_addr.s_addr );
ASSERT(NT_SUCCESS(Status));
TI_DbgPrint(DEBUG_TCPIF,("interface %x : addr %x\n",
- IF, addr_in->sin_addr.s_addr));
+ IF, addr_in->sin_addr.s_addr));
ifaddr->ifa_flags = 0; /* XXX what goes here? */
ifaddr->ifa_refcnt = 0; /* Anachronistic */
@@ -68,20 +72,22 @@ POSK_IFADDR TCPGetInterfaceData( PIP_INTERFACE IF ) {
}
POSK_IFADDR TCPFindInterface( void *ClientData,
- OSK_UINT AddrType,
- OSK_UINT FindType,
- OSK_SOCKADDR *ReqAddr,
- OSK_IFADDR *Interface ) {
+ OSK_UINT AddrType,
+ OSK_UINT FindType,
+ OSK_SOCKADDR *ReqAddr,
+ OSK_IFADDR *Interface ) {
PIP_INTERFACE IF;
IP_ADDRESS Destination;
struct sockaddr_in *addr_in = (struct sockaddr_in *)ReqAddr;
POSK_IFADDR InterfaceData;
+ ASSERT_LOCKED(&TCPLock);
+
TI_DbgPrint(DEBUG_TCPIF,("called for type %d\n", FindType));
if( !ReqAddr ) {
- TI_DbgPrint(DEBUG_TCPIF,("no addr or no ifaddr (%x)\n", ReqAddr));
- return NULL;
+ TI_DbgPrint(DEBUG_TCPIF,("no addr or no ifaddr (%x)\n", ReqAddr));
+ return NULL;
}
Destination.Type = IP_ADDRESS_V4;
@@ -95,7 +101,7 @@ POSK_IFADDR TCPFindInterface( void *ClientData,
InterfaceData = TCPGetInterfaceData(IF);
addr_in = (struct sockaddr_in *)
- InterfaceData->ifa_addr;
+ InterfaceData->ifa_addr;
TI_DbgPrint(DEBUG_TCPIF,("returning addr %x\n", addr_in->sin_addr.s_addr));
diff --git a/reactos/lib/drivers/ip/transport/tcp/tcp.c b/reactos/lib/drivers/ip/transport/tcp/tcp.c
index 0e943f06cdb..77b5da92226 100644
--- a/reactos/lib/drivers/ip/transport/tcp/tcp.c
+++ b/reactos/lib/drivers/ip/transport/tcp/tcp.c
@@ -15,14 +15,14 @@
LONG TCP_IPIdentification = 0;
static BOOLEAN TCPInitialized = FALSE;
static NPAGED_LOOKASIDE_LIST TCPSegmentList;
-LIST_ENTRY SignalledConnections;
+LIST_ENTRY SignalledConnectionsList;
+KSPIN_LOCK SignalledConnectionsLock;
LIST_ENTRY SleepingThreadsList;
FAST_MUTEX SleepingThreadsLock;
RECURSIVE_MUTEX TCPLock;
PORT_SET TCPPorts;
-static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection,
- ULONG NewState ) {
+static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection ) {
NTSTATUS Status = STATUS_SUCCESS;
PTCP_COMPLETION_ROUTINE Complete;
PTDI_BUCKET Bucket;
@@ -30,13 +30,82 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection,
PIRP Irp;
PMDL Mdl;
+ ASSERT_LOCKED(&TCPLock);
+
TI_DbgPrint(MID_TRACE,("Handling signalled state on %x (%x)\n",
Connection, Connection->SocketContext));
+ if( Connection->SignalState & SEL_FIN ) {
+ TI_DbgPrint(DEBUG_TCP, ("EOF From socket\n"));
+
+ while ((Entry = ExInterlockedRemoveHeadList( &Connection->ReceiveRequest,
+ &Connection->Lock )) != NULL)
+ {
+ DISCONNECT_TYPE DisType;
+ PIO_STACK_LOCATION IrpSp;
+ Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
+ Complete = Bucket->Request.RequestNotifyObject;
+ IrpSp = IoGetCurrentIrpStackLocation((PIRP)Bucket->Request.RequestContext);
+
+ /* We have to notify oskittcp of the abortion */
+ DisType.Type = TDI_DISCONNECT_RELEASE | TDI_DISCONNECT_ABORT;
+ DisType.Context = Connection;
+ DisType.Irp = (PIRP)Bucket->Request.RequestContext;
+ DisType.FileObject = IrpSp->FileObject;
+
+ ChewCreate(NULL, sizeof(DISCONNECT_TYPE),
+ DispDoDisconnect, &DisType);
+ }
+
+ while ((Entry = ExInterlockedRemoveHeadList( &Connection->SendRequest,
+ &Connection->Lock )) != NULL)
+ {
+ DISCONNECT_TYPE DisType;
+ PIO_STACK_LOCATION IrpSp;
+ Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
+ Complete = Bucket->Request.RequestNotifyObject;
+ IrpSp = IoGetCurrentIrpStackLocation((PIRP)Bucket->Request.RequestContext);
+
+ /* We have to notify oskittcp of the abortion */
+ DisType.Type = TDI_DISCONNECT_RELEASE;
+ DisType.Context = Connection;
+ DisType.Irp = (PIRP)Bucket->Request.RequestContext;
+ DisType.FileObject = IrpSp->FileObject;
+
+ ChewCreate(NULL, sizeof(DISCONNECT_TYPE),
+ DispDoDisconnect, &DisType);
+ }
+
+ while ((Entry = ExInterlockedRemoveHeadList( &Connection->ListenRequest,
+ &Connection->Lock )) != NULL)
+ {
+ Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
+ Complete = Bucket->Request.RequestNotifyObject;
+
+ /* We have to notify oskittcp of the abortion */
+ TCPAbortListenForSocket(Connection->AddressFile->Listener,
+ Connection);
+
+ Complete( Bucket->Request.RequestContext, STATUS_CANCELLED, 0 );
+ }
+
+ while ((Entry = ExInterlockedRemoveHeadList( &Connection->ConnectRequest,
+ &Connection->Lock )) != NULL)
+ {
+ Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
+ Complete = Bucket->Request.RequestNotifyObject;
+
+ Complete( Bucket->Request.RequestContext, STATUS_CANCELLED, 0 );
+ }
+
+ Connection->SignalState = 0;
+ }
+
/* Things that can happen when we try the initial connection */
- if( NewState & SEL_CONNECT ) {
- while( !IsListEmpty( &Connection->ConnectRequest ) ) {
- Entry = RemoveHeadList( &Connection->ConnectRequest );
+ if( Connection->SignalState & SEL_CONNECT ) {
+ while( (Entry = ExInterlockedRemoveHeadList( &Connection->ConnectRequest,
+ &Connection->Lock )) != NULL ) {
+
TI_DbgPrint(DEBUG_TCP, ("Connect Event\n"));
Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
@@ -44,200 +113,173 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection,
TI_DbgPrint(DEBUG_TCP,
("Completing Request %x\n", Bucket->Request.RequestContext));
- if( (NewState & (SEL_CONNECT | SEL_FIN)) ==
- (SEL_CONNECT | SEL_FIN) )
- Status = STATUS_CONNECTION_REFUSED;
- else
- Status = STATUS_SUCCESS;
-
- Complete( Bucket->Request.RequestContext, Status, 0 );
+ Complete( Bucket->Request.RequestContext, STATUS_SUCCESS, 0 );
/* Frees the bucket allocated in TCPConnect */
exFreePool( Bucket );
}
}
- if( NewState & SEL_ACCEPT ) {
- /* Handle readable on a listening socket --
- * TODO: Implement filtering
- */
+ if( Connection->SignalState & SEL_ACCEPT ) {
+ /* Handle readable on a listening socket --
+ * TODO: Implement filtering
+ */
- TI_DbgPrint(DEBUG_TCP,("Accepting new connection on %x (Queue: %s)\n",
- Connection,
- IsListEmpty(&Connection->ListenRequest) ?
- "empty" : "nonempty"));
+ TI_DbgPrint(DEBUG_TCP,("Accepting new connection on %x (Queue: %s)\n",
+ Connection,
+ IsListEmpty(&Connection->ListenRequest) ?
+ "empty" : "nonempty"));
- while( !IsListEmpty( &Connection->ListenRequest ) ) {
- PIO_STACK_LOCATION IrpSp;
+ while( (Entry = ExInterlockedRemoveHeadList( &Connection->ListenRequest,
+ &Connection->Lock )) != NULL ) {
+ PIO_STACK_LOCATION IrpSp;
- Entry = RemoveHeadList( &Connection->ListenRequest );
- Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
- Complete = Bucket->Request.RequestNotifyObject;
+ Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
+ Complete = Bucket->Request.RequestNotifyObject;
- Irp = Bucket->Request.RequestContext;
- IrpSp = IoGetCurrentIrpStackLocation( Irp );
+ Irp = Bucket->Request.RequestContext;
+ IrpSp = IoGetCurrentIrpStackLocation( Irp );
- TI_DbgPrint(DEBUG_TCP,("Getting the socket\n"));
- Status = TCPServiceListeningSocket
- ( Connection->AddressFile->Listener,
- Bucket->AssociatedEndpoint,
- (PTDI_REQUEST_KERNEL)&IrpSp->Parameters );
+ TI_DbgPrint(DEBUG_TCP,("Getting the socket\n"));
+ Status = TCPServiceListeningSocket
+ ( Connection->AddressFile->Listener,
+ Bucket->AssociatedEndpoint,
+ (PTDI_REQUEST_KERNEL)&IrpSp->Parameters );
- TI_DbgPrint(DEBUG_TCP,("Socket: Status: %x\n"));
+ TI_DbgPrint(DEBUG_TCP,("Socket: Status: %x\n"));
- if( Status == STATUS_PENDING ) {
- InsertHeadList( &Connection->ListenRequest, &Bucket->Entry );
- break;
- } else {
- Complete( Bucket->Request.RequestContext, Status, 0 );
- exFreePool( Bucket );
- }
- }
- }
-
- /* Things that happen after we're connected */
- if( NewState & SEL_READ ) {
- TI_DbgPrint(DEBUG_TCP,("Readable: irp list %s\n",
- IsListEmpty(&Connection->ReceiveRequest) ?
- "empty" : "nonempty"));
-
- while( !IsListEmpty( &Connection->ReceiveRequest ) ) {
- OSK_UINT RecvLen = 0, Received = 0;
- PVOID RecvBuffer = 0;
-
- Entry = RemoveHeadList( &Connection->ReceiveRequest );
- Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
- Complete = Bucket->Request.RequestNotifyObject;
-
- Irp = Bucket->Request.RequestContext;
- Mdl = Irp->MdlAddress;
-
- TI_DbgPrint(DEBUG_TCP,
- ("Getting the user buffer from %x\n", Mdl));
-
- NdisQueryBuffer( Mdl, &RecvBuffer, &RecvLen );
-
- TI_DbgPrint(DEBUG_TCP,
- ("Reading %d bytes to %x\n", RecvLen, RecvBuffer));
-
- TI_DbgPrint(DEBUG_TCP, ("Connection: %x\n", Connection));
- TI_DbgPrint
- (DEBUG_TCP,
- ("Connection->SocketContext: %x\n",
- Connection->SocketContext));
- TI_DbgPrint(DEBUG_TCP, ("RecvBuffer: %x\n", RecvBuffer));
-
- Status = TCPTranslateError
- ( OskitTCPRecv( Connection->SocketContext,
- RecvBuffer,
- RecvLen,
- &Received,
- 0 ) );
-
- TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Received));
-
- if( Status == STATUS_SUCCESS ) {
- TI_DbgPrint(DEBUG_TCP,("Received %d bytes with status %x\n",
- Received, Status));
-
- Complete( Bucket->Request.RequestContext,
- STATUS_SUCCESS, Received );
- exFreePool( Bucket );
- } else if( Status == STATUS_PENDING ) {
- InsertHeadList
- ( &Connection->ReceiveRequest, &Bucket->Entry );
- break;
- } else {
- TI_DbgPrint(DEBUG_TCP,
- ("Completing Receive request: %x %x\n",
- Bucket->Request, Status));
- Complete( Bucket->Request.RequestContext, Status, 0 );
- exFreePool( Bucket );
- }
- }
- }
- if( NewState & SEL_WRITE ) {
- TI_DbgPrint(DEBUG_TCP,("Writeable: irp list %s\n",
- IsListEmpty(&Connection->SendRequest) ?
- "empty" : "nonempty"));
-
- while( !IsListEmpty( &Connection->SendRequest ) ) {
- OSK_UINT SendLen = 0, Sent = 0;
- PVOID SendBuffer = 0;
-
- Entry = RemoveHeadList( &Connection->SendRequest );
- Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
- Complete = Bucket->Request.RequestNotifyObject;
-
- Irp = Bucket->Request.RequestContext;
- Mdl = Irp->MdlAddress;
-
- TI_DbgPrint(DEBUG_TCP,
- ("Getting the user buffer from %x\n", Mdl));
-
- NdisQueryBuffer( Mdl, &SendBuffer, &SendLen );
-
- TI_DbgPrint(DEBUG_TCP,
- ("Writing %d bytes to %x\n", SendLen, SendBuffer));
-
- TI_DbgPrint(DEBUG_TCP, ("Connection: %x\n", Connection));
- TI_DbgPrint
- (DEBUG_TCP,
- ("Connection->SocketContext: %x\n",
- Connection->SocketContext));
-
- Status = TCPTranslateError
- ( OskitTCPSend( Connection->SocketContext,
- SendBuffer,
- SendLen,
- &Sent,
- 0 ) );
-
- TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Sent));
-
- if( Status == STATUS_SUCCESS ) {
- TI_DbgPrint(DEBUG_TCP,("Sent %d bytes with status %x\n",
- Sent, Status));
-
- Complete( Bucket->Request.RequestContext,
- STATUS_SUCCESS, Sent );
- exFreePool( Bucket );
- } else if( Status == STATUS_PENDING ) {
- InsertHeadList
- ( &Connection->SendRequest, &Bucket->Entry );
- break;
- } else {
- TI_DbgPrint(DEBUG_TCP,
- ("Completing Send request: %x %x\n",
- Bucket->Request, Status));
- Complete( Bucket->Request.RequestContext, Status, 0 );
- exFreePool( Bucket );
- }
- }
- }
-
- if( NewState & SEL_FIN ) {
- PLIST_ENTRY ListsToErase[4];
- UINT i;
-
- TI_DbgPrint(DEBUG_TCP, ("EOF From socket\n"));
-
- ListsToErase[0] = &Connection->ReceiveRequest;
- ListsToErase[1] = &Connection->ListenRequest;
- ListsToErase[2] = &Connection->ConnectRequest;
- ListsToErase[3] = &Connection->SendRequest;
-
- for( i = 0; i < 4; i++ ) {
- while( !IsListEmpty( ListsToErase[i] ) ) {
- Entry = RemoveHeadList( ListsToErase[i] );
- Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
- Complete = Bucket->Request.RequestNotifyObject;
- Complete( Bucket->Request.RequestContext, STATUS_CANCELLED, 0 );
+ if( Status == STATUS_PENDING ) {
+ ExInterlockedInsertHeadList( &Connection->ListenRequest, &Bucket->Entry, &Connection->Lock );
+ break;
+ } else {
+ Complete( Bucket->Request.RequestContext, Status, 0 );
exFreePool( Bucket );
}
}
}
+ /* Things that happen after we're connected */
+ if( Connection->SignalState & SEL_READ ) {
+ TI_DbgPrint(DEBUG_TCP,("Readable: irp list %s\n",
+ IsListEmpty(&Connection->ReceiveRequest) ?
+ "empty" : "nonempty"));
+
+ while( (Entry = ExInterlockedRemoveHeadList( &Connection->ReceiveRequest,
+ &Connection->Lock )) != NULL ) {
+ OSK_UINT RecvLen = 0, Received = 0;
+ PVOID RecvBuffer = 0;
+
+ Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
+ Complete = Bucket->Request.RequestNotifyObject;
+
+ Irp = Bucket->Request.RequestContext;
+ Mdl = Irp->MdlAddress;
+
+ TI_DbgPrint(DEBUG_TCP,
+ ("Getting the user buffer from %x\n", Mdl));
+
+ NdisQueryBuffer( Mdl, &RecvBuffer, &RecvLen );
+
+ TI_DbgPrint(DEBUG_TCP,
+ ("Reading %d bytes to %x\n", RecvLen, RecvBuffer));
+
+ TI_DbgPrint(DEBUG_TCP, ("Connection: %x\n", Connection));
+ TI_DbgPrint
+ (DEBUG_TCP,
+ ("Connection->SocketContext: %x\n",
+ Connection->SocketContext));
+ TI_DbgPrint(DEBUG_TCP, ("RecvBuffer: %x\n", RecvBuffer));
+
+ Status = TCPTranslateError
+ ( OskitTCPRecv( Connection->SocketContext,
+ RecvBuffer,
+ RecvLen,
+ &Received,
+ 0 ) );
+
+ TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Received));
+
+ if( Status == STATUS_SUCCESS ) {
+ TI_DbgPrint(DEBUG_TCP,("Received %d bytes with status %x\n",
+ Received, Status));
+
+ Complete( Bucket->Request.RequestContext,
+ STATUS_SUCCESS, Received );
+ exFreePool( Bucket );
+ } else if( Status == STATUS_PENDING ) {
+ ExInterlockedInsertHeadList
+ ( &Connection->ReceiveRequest, &Bucket->Entry, &Connection->Lock );
+ break;
+ } else {
+ TI_DbgPrint(DEBUG_TCP,
+ ("Completing Receive request: %x %x\n",
+ Bucket->Request, Status));
+ Complete( Bucket->Request.RequestContext, Status, 0 );
+ exFreePool( Bucket );
+ }
+ }
+ }
+ if( Connection->SignalState & SEL_WRITE ) {
+ TI_DbgPrint(DEBUG_TCP,("Writeable: irp list %s\n",
+ IsListEmpty(&Connection->SendRequest) ?
+ "empty" : "nonempty"));
+
+ while( (Entry = ExInterlockedRemoveHeadList( &Connection->SendRequest,
+ &Connection->Lock )) != NULL ) {
+ OSK_UINT SendLen = 0, Sent = 0;
+ PVOID SendBuffer = 0;
+
+ Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
+ Complete = Bucket->Request.RequestNotifyObject;
+
+ Irp = Bucket->Request.RequestContext;
+ Mdl = Irp->MdlAddress;
+
+ TI_DbgPrint(DEBUG_TCP,
+ ("Getting the user buffer from %x\n", Mdl));
+
+ NdisQueryBuffer( Mdl, &SendBuffer, &SendLen );
+
+ TI_DbgPrint(DEBUG_TCP,
+ ("Writing %d bytes to %x\n", SendLen, SendBuffer));
+
+ TI_DbgPrint(DEBUG_TCP, ("Connection: %x\n", Connection));
+ TI_DbgPrint
+ (DEBUG_TCP,
+ ("Connection->SocketContext: %x\n",
+ Connection->SocketContext));
+
+ Status = TCPTranslateError
+ ( OskitTCPSend( Connection->SocketContext,
+ SendBuffer,
+ SendLen,
+ &Sent,
+ 0 ) );
+
+ TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Sent));
+
+ if( Status == STATUS_SUCCESS ) {
+ TI_DbgPrint(DEBUG_TCP,("Sent %d bytes with status %x\n",
+ Sent, Status));
+
+ Complete( Bucket->Request.RequestContext,
+ STATUS_SUCCESS, Sent );
+ exFreePool( Bucket );
+ } else if( Status == STATUS_PENDING ) {
+ ExInterlockedInsertHeadList
+ ( &Connection->SendRequest, &Bucket->Entry, &Connection->Lock );
+ break;
+ } else {
+ TI_DbgPrint(DEBUG_TCP,
+ ("Completing Send request: %x %x\n",
+ Bucket->Request, Status));
+ Complete( Bucket->Request.RequestContext, Status, 0 );
+ exFreePool( Bucket );
+ }
+ }
+ }
+
+ Connection->SignalState = 0;
Connection->Signalled = FALSE;
}
@@ -245,19 +287,19 @@ VOID DrainSignals() {
PCONNECTION_ENDPOINT Connection;
PLIST_ENTRY ListEntry;
- while( !IsListEmpty( &SignalledConnections ) ) {
- ListEntry = RemoveHeadList( &SignalledConnections );
- Connection = CONTAINING_RECORD( ListEntry, CONNECTION_ENDPOINT,
- SignalList );
- HandleSignalledConnection( Connection, Connection->SignalState );
+ while( (ListEntry = ExInterlockedRemoveHeadList(&SignalledConnectionsList,
+ &SignalledConnectionsLock)) != NULL) {
+ Connection = CONTAINING_RECORD( ListEntry, CONNECTION_ENDPOINT,
+ SignalList );
+ HandleSignalledConnection( Connection );
}
}
PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint( PVOID ClientContext ) {
PCONNECTION_ENDPOINT Connection =
- exAllocatePool(NonPagedPool, sizeof(CONNECTION_ENDPOINT));
+ exAllocatePool(NonPagedPool, sizeof(CONNECTION_ENDPOINT));
if (!Connection)
- return Connection;
+ return Connection;
TI_DbgPrint(DEBUG_CPOINT, ("Connection point file object allocated at (0x%X).\n", Connection));
@@ -277,31 +319,30 @@ PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint( PVOID ClientContext ) {
}
VOID TCPFreeConnectionEndpoint( PCONNECTION_ENDPOINT Connection ) {
- TI_DbgPrint(DEBUG_TCP, ("Freeing TCP Endpoint\n"));
+ TI_DbgPrint(DEBUG_TCP, ("Freeing TCP Endpoint\n"));
exFreePool( Connection );
}
NTSTATUS TCPSocket( PCONNECTION_ENDPOINT Connection,
- UINT Family, UINT Type, UINT Proto ) {
+ UINT Family, UINT Type, UINT Proto ) {
NTSTATUS Status;
- TI_DbgPrint(DEBUG_TCP,("Called: Connection %x, Family %d, Type %d, "
- "Proto %d\n",
- Connection, Family, Type, Proto));
+ ASSERT_LOCKED(&TCPLock);
+
+ TI_DbgPrint(DEBUG_TCP,("Called: Connection %x, Family %d, Type %d, "
+ "Proto %d\n",
+ Connection, Family, Type, Proto));
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
Status = TCPTranslateError( OskitTCPSocket( Connection,
- &Connection->SocketContext,
- Family,
- Type,
- Proto ) );
+ &Connection->SocketContext,
+ Family,
+ Type,
+ Proto ) );
ASSERT_KM_POINTER(Connection->SocketContext);
TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext %x\n",
- Connection->SocketContext));
-
- TcpipRecursiveMutexLeave( &TCPLock );
+ Connection->SocketContext));
return Status;
}
@@ -316,14 +357,14 @@ VOID TCPReceive(PIP_INTERFACE Interface, PIP_PACKET IPPacket)
*/
{
TI_DbgPrint(DEBUG_TCP,("Sending packet %d (%d) to oskit\n",
- IPPacket->TotalSize,
- IPPacket->HeaderSize));
+ IPPacket->TotalSize,
+ IPPacket->HeaderSize));
TcpipRecursiveMutexEnter( &TCPLock, TRUE );
OskitTCPReceiveDatagram( IPPacket->Header,
- IPPacket->TotalSize,
- IPPacket->HeaderSize );
+ IPPacket->TotalSize,
+ IPPacket->HeaderSize );
DrainSignals();
@@ -332,28 +373,28 @@ VOID TCPReceive(PIP_INTERFACE Interface, PIP_PACKET IPPacket)
/* event.c */
int TCPSocketState( void *ClientData,
- void *WhichSocket,
- void *WhichConnection,
- OSK_UINT NewState );
+ void *WhichSocket,
+ void *WhichConnection,
+ OSK_UINT NewState );
int TCPPacketSend( void *ClientData,
- OSK_PCHAR Data,
- OSK_UINT Len );
+ OSK_PCHAR Data,
+ OSK_UINT Len );
POSK_IFADDR TCPFindInterface( void *ClientData,
- OSK_UINT AddrType,
- OSK_UINT FindType,
- OSK_SOCKADDR *ReqAddr );
+ OSK_UINT AddrType,
+ OSK_UINT FindType,
+ OSK_SOCKADDR *ReqAddr );
NTSTATUS TCPMemStartup( void );
void *TCPMalloc( void *ClientData,
- OSK_UINT bytes, OSK_PCHAR file, OSK_UINT line );
+ OSK_UINT bytes, OSK_PCHAR file, OSK_UINT line );
void TCPFree( void *ClientData,
- void *data, OSK_PCHAR file, OSK_UINT line );
+ void *data, OSK_PCHAR file, OSK_UINT line );
void TCPMemShutdown( void );
int TCPSleep( void *ClientData, void *token, int priority, char *msg,
- int tmio );
+ int tmio );
void TCPWakeup( void *ClientData, void *token );
@@ -440,33 +481,36 @@ NTSTATUS TCPStartup(VOID)
TcpipRecursiveMutexInit( &TCPLock );
ExInitializeFastMutex( &SleepingThreadsLock );
+ KeInitializeSpinLock( &SignalledConnectionsLock );
InitializeListHead( &SleepingThreadsList );
- InitializeListHead( &SignalledConnections );
+ InitializeListHead( &SignalledConnectionsList );
Status = TCPMemStartup();
if ( ! NT_SUCCESS(Status) ) {
- return Status;
+ return Status;
}
Status = PortsStartup( &TCPPorts, 1, 0xfffe );
if( !NT_SUCCESS(Status) ) {
- TCPMemShutdown();
- return Status;
+ TCPMemShutdown();
+ return Status;
}
+ TcpipRecursiveMutexEnter(&TCPLock, TRUE);
RegisterOskitTCPEventHandlers( &EventHandlers );
InitOskitTCP();
+ TcpipRecursiveMutexLeave(&TCPLock);
/* Register this protocol with IP layer */
IPRegisterProtocol(IPPROTO_TCP, TCPReceive);
ExInitializeNPagedLookasideList(
- &TCPSegmentList, /* Lookaside list */
- NULL, /* Allocate routine */
- NULL, /* Free routine */
- 0, /* Flags */
- sizeof(TCP_SEGMENT), /* Size of each entry */
- TAG('T','C','P','S'), /* Tag */
- 0); /* Depth */
+ &TCPSegmentList, /* Lookaside list */
+ NULL, /* Allocate routine */
+ NULL, /* Free routine */
+ 0, /* Flags */
+ sizeof(TCP_SEGMENT), /* Size of each entry */
+ TAG('T','C','P','S'), /* Tag */
+ 0); /* Depth */
StartTimer();
@@ -486,7 +530,7 @@ NTSTATUS TCPShutdown(VOID)
LARGE_INTEGER WaitForThread;
if (!TCPInitialized)
- return STATUS_SUCCESS;
+ return STATUS_SUCCESS;
WaitForThread.QuadPart = -2500000; /* 250 ms */
KeSetEvent(&TimerLoopEvent, IO_NO_INCREMENT, FALSE);
@@ -537,27 +581,31 @@ NTSTATUS TCPConnect
IP_ADDRESS RemoteAddress;
USHORT RemotePort;
PTDI_BUCKET Bucket;
- PNEIGHBOR_CACHE_ENTRY NCE;
+ PNEIGHBOR_CACHE_ENTRY NCE;
TI_DbgPrint(DEBUG_TCP,("TCPConnect: Called\n"));
+ ASSERT_LOCKED(&TCPLock);
+
Status = AddrBuildAddress
- ((PTRANSPORT_ADDRESS)ConnInfo->RemoteAddress,
- &RemoteAddress,
- &RemotePort);
+ ((PTRANSPORT_ADDRESS)ConnInfo->RemoteAddress,
+ &RemoteAddress,
+ &RemotePort);
- if (!(NCE = RouteGetRouteToDestination(&RemoteAddress)))
- {
- return STATUS_NETWORK_UNREACHABLE;
- }
+ if (!NT_SUCCESS(Status)) {
+ TI_DbgPrint(DEBUG_TCP, ("Could not AddrBuildAddress in TCPConnect\n"));
+ return Status;
+ }
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+ if (!(NCE = RouteGetRouteToDestination(&RemoteAddress)))
+ {
+ return STATUS_NETWORK_UNREACHABLE;
+ }
- if (Connection->State & SEL_FIN)
- {
- TcpipRecursiveMutexLeave( &TCPLock );
- return STATUS_REMOTE_DISCONNECT;
- }
+ if (Connection->State & SEL_FIN)
+ {
+ return STATUS_REMOTE_DISCONNECT;
+ }
/* Freed in TCPSocketState */
TI_DbgPrint(DEBUG_TCP,
@@ -565,48 +613,42 @@ NTSTATUS TCPConnect
RemoteAddress.Address.IPv4Address,
RemotePort));
- if (!NT_SUCCESS(Status)) {
- TI_DbgPrint(DEBUG_TCP, ("Could not AddrBuildAddress in TCPConnect\n"));
- TcpipRecursiveMutexLeave( &TCPLock );
- return Status;
- }
-
AddressToConnect.sin_family = AF_INET;
AddressToBind = AddressToConnect;
- AddressToBind.sin_addr.s_addr = NCE->Interface->Unicast.Address.IPv4Address;
+ AddressToBind.sin_addr.s_addr = NCE->Interface->Unicast.Address.IPv4Address;
Status = TCPTranslateError
( OskitTCPBind( Connection->SocketContext,
- Connection,
- &AddressToBind,
- sizeof(AddressToBind) ) );
+ Connection,
+ &AddressToBind,
+ sizeof(AddressToBind) ) );
if (NT_SUCCESS(Status)) {
memcpy( &AddressToConnect.sin_addr,
- &RemoteAddress.Address.IPv4Address,
- sizeof(AddressToConnect.sin_addr) );
+ &RemoteAddress.Address.IPv4Address,
+ sizeof(AddressToConnect.sin_addr) );
AddressToConnect.sin_port = RemotePort;
Status = TCPTranslateError
- ( OskitTCPConnect( Connection->SocketContext,
- Connection,
- &AddressToConnect,
- sizeof(AddressToConnect) ) );
+ ( OskitTCPConnect( Connection->SocketContext,
+ Connection,
+ &AddressToConnect,
+ sizeof(AddressToConnect) ) );
- if (Status == STATUS_PENDING)
- {
- Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) );
- if( !Bucket ) return STATUS_NO_MEMORY;
+ if (Status == STATUS_PENDING)
+ {
+ Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) );
+ if( !Bucket ) return STATUS_NO_MEMORY;
+
+ Bucket->Request.RequestNotifyObject = (PVOID)Complete;
+ Bucket->Request.RequestContext = Context;
+
+ IoMarkIrpPending((PIRP)Context);
- Bucket->Request.RequestNotifyObject = (PVOID)Complete;
- Bucket->Request.RequestContext = Context;
-
- InsertHeadList( &Connection->ConnectRequest, &Bucket->Entry );
- }
+ ExInterlockedInsertTailList( &Connection->ConnectRequest, &Bucket->Entry, &Connection->Lock );
+ }
}
- TcpipRecursiveMutexLeave( &TCPLock );
-
return Status;
}
@@ -619,29 +661,27 @@ NTSTATUS TCPDisconnect
PVOID Context ) {
NTSTATUS Status;
- TI_DbgPrint(DEBUG_TCP,("started\n"));
+ ASSERT_LOCKED(&TCPLock);
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+ TI_DbgPrint(DEBUG_TCP,("started\n"));
switch( Flags & (TDI_DISCONNECT_ABORT | TDI_DISCONNECT_RELEASE) ) {
case 0:
case TDI_DISCONNECT_ABORT:
- Flags = 0;
- break;
+ Flags = 0;
+ break;
case TDI_DISCONNECT_ABORT | TDI_DISCONNECT_RELEASE:
- Flags = 2;
- break;
+ Flags = 2;
+ break;
case TDI_DISCONNECT_RELEASE:
- Flags = 1;
- break;
+ Flags = 1;
+ break;
}
Status = TCPTranslateError
- ( OskitTCPShutdown( Connection->SocketContext, Flags ) );
-
- TcpipRecursiveMutexLeave( &TCPLock );
+ ( OskitTCPShutdown( Connection->SocketContext, Flags ) );
TI_DbgPrint(DEBUG_TCP,("finished %x\n", Status));
@@ -654,15 +694,13 @@ NTSTATUS TCPClose
TI_DbgPrint(DEBUG_TCP,("TCPClose started\n"));
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-
- Status = TCPTranslateError( OskitTCPClose( Connection->SocketContext ) );
+ ASSERT_LOCKED(&TCPLock);
/* Make our code remove all pending IRPs */
Connection->State |= SEL_FIN;
DrainSignals();
- TcpipRecursiveMutexLeave( &TCPLock );
+ Status = TCPTranslateError( OskitTCPClose( Connection->SocketContext ) );
TI_DbgPrint(DEBUG_TCP,("TCPClose finished %x\n", Status));
@@ -685,56 +723,53 @@ NTSTATUS TCPReceiveData
TI_DbgPrint(DEBUG_TCP,("Called for %d bytes (on socket %x)\n",
ReceiveLength, Connection->SocketContext));
+ ASSERT_LOCKED(&TCPLock);
+
ASSERT_KM_POINTER(Connection->SocketContext);
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-
- /* Closing */
- if (Connection->State & SEL_FIN)
- {
- TcpipRecursiveMutexLeave( &TCPLock );
- *BytesReceived = 0;
- return STATUS_REMOTE_DISCONNECT;
- }
+ /* Closing */
+ if (Connection->State & SEL_FIN)
+ {
+ *BytesReceived = 0;
+ return STATUS_REMOTE_DISCONNECT;
+ }
NdisQueryBuffer( Buffer, &DataBuffer, &DataLen );
TI_DbgPrint(DEBUG_TCP,("TCP>|< Got an MDL %x (%x:%d)\n", Buffer, DataBuffer, DataLen));
Status = TCPTranslateError
- ( OskitTCPRecv
- ( Connection->SocketContext,
- DataBuffer,
- DataLen,
- &Received,
- ReceiveFlags ) );
+ ( OskitTCPRecv
+ ( Connection->SocketContext,
+ DataBuffer,
+ DataLen,
+ &Received,
+ ReceiveFlags ) );
TI_DbgPrint(DEBUG_TCP,("OskitTCPReceive: %x, %d\n", Status, Received));
/* Keep this request around ... there was no data yet */
if( Status == STATUS_PENDING ) {
- /* Freed in TCPSocketState */
- Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) );
- if( !Bucket ) {
- TI_DbgPrint(DEBUG_TCP,("Failed to allocate bucket\n"));
- TcpipRecursiveMutexLeave( &TCPLock );
- return STATUS_NO_MEMORY;
- }
+ /* Freed in TCPSocketState */
+ Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) );
+ if( !Bucket ) {
+ TI_DbgPrint(DEBUG_TCP,("Failed to allocate bucket\n"));
+ return STATUS_NO_MEMORY;
+ }
- Bucket->Request.RequestNotifyObject = Complete;
- Bucket->Request.RequestContext = Context;
- *BytesReceived = 0;
+ Bucket->Request.RequestNotifyObject = Complete;
+ Bucket->Request.RequestContext = Context;
+ *BytesReceived = 0;
- InsertTailList( &Connection->ReceiveRequest, &Bucket->Entry );
- Status = STATUS_PENDING;
- TI_DbgPrint(DEBUG_TCP,("Queued read irp\n"));
+ IoMarkIrpPending((PIRP)Context);
+
+ ExInterlockedInsertTailList( &Connection->ReceiveRequest, &Bucket->Entry, &Connection->Lock );
+ TI_DbgPrint(DEBUG_TCP,("Queued read irp\n"));
} else {
- TI_DbgPrint(DEBUG_TCP,("Got status %x, bytes %d\n", Status, Received));
- *BytesReceived = Received;
+ TI_DbgPrint(DEBUG_TCP,("Got status %x, bytes %d\n", Status, Received));
+ *BytesReceived = Received;
}
- TcpipRecursiveMutexLeave( &TCPLock );
-
TI_DbgPrint(DEBUG_TCP,("Status %x\n", Status));
return Status;
@@ -752,55 +787,53 @@ NTSTATUS TCPSendData
NTSTATUS Status;
PTDI_BUCKET Bucket;
+ ASSERT_LOCKED(&TCPLock);
+
TI_DbgPrint(DEBUG_TCP,("Called for %d bytes (on socket %x)\n",
SendLength, Connection->SocketContext));
ASSERT_KM_POINTER(Connection->SocketContext);
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-
TI_DbgPrint(DEBUG_TCP,("Connection = %x\n", Connection));
TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext = %x\n",
- Connection->SocketContext));
+ Connection->SocketContext));
- /* Closing */
- if (Connection->State & SEL_FIN)
- {
- TcpipRecursiveMutexLeave( &TCPLock );
- *BytesSent = 0;
- return STATUS_REMOTE_DISCONNECT;
- }
+ /* Closing */
+ if (Connection->State & SEL_FIN)
+ {
+ *BytesSent = 0;
+ return STATUS_REMOTE_DISCONNECT;
+ }
Status = TCPTranslateError
- ( OskitTCPSend( Connection->SocketContext,
- (OSK_PCHAR)BufferData, SendLength,
- &Sent, 0 ) );
+ ( OskitTCPSend( Connection->SocketContext,
+ (OSK_PCHAR)BufferData, SendLength,
+ &Sent, 0 ) );
TI_DbgPrint(DEBUG_TCP,("OskitTCPSend: %x, %d\n", Status, Sent));
/* Keep this request around ... there was no data yet */
if( Status == STATUS_PENDING ) {
- /* Freed in TCPSocketState */
- Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) );
- if( !Bucket ) {
- TI_DbgPrint(DEBUG_TCP,("Failed to allocate bucket\n"));
- TcpipRecursiveMutexLeave( &TCPLock );
- return STATUS_NO_MEMORY;
- }
-
- Bucket->Request.RequestNotifyObject = Complete;
- Bucket->Request.RequestContext = Context;
- *BytesSent = 0;
-
- InsertTailList( &Connection->SendRequest, &Bucket->Entry );
- TI_DbgPrint(DEBUG_TCP,("Queued write irp\n"));
+ /* Freed in TCPSocketState */
+ Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) );
+ if( !Bucket ) {
+ TI_DbgPrint(DEBUG_TCP,("Failed to allocate bucket\n"));
+ return STATUS_NO_MEMORY;
+ }
+
+ Bucket->Request.RequestNotifyObject = Complete;
+ Bucket->Request.RequestContext = Context;
+ *BytesSent = 0;
+
+ IoMarkIrpPending((PIRP)Context);
+
+ ExInterlockedInsertTailList( &Connection->SendRequest, &Bucket->Entry, &Connection->Lock );
+ TI_DbgPrint(DEBUG_TCP,("Queued write irp\n"));
} else {
- TI_DbgPrint(DEBUG_TCP,("Got status %x, bytes %d\n", Status, Sent));
- *BytesSent = Sent;
+ TI_DbgPrint(DEBUG_TCP,("Got status %x, bytes %d\n", Status, Sent));
+ *BytesSent = Sent;
}
-
- TcpipRecursiveMutexLeave( &TCPLock );
-
+
TI_DbgPrint(DEBUG_TCP,("Status %x\n", Status));
return Status;
@@ -812,8 +845,8 @@ VOID TCPTimeout(VOID) {
UINT TCPAllocatePort( UINT HintPort ) {
if( HintPort ) {
- if( AllocatePort( &TCPPorts, HintPort ) ) return HintPort;
- else {
+ if( AllocatePort( &TCPPorts, HintPort ) ) return HintPort;
+ else {
TI_DbgPrint
(MID_TRACE,("We got a hint port but couldn't allocate it\n"));
return (UINT)-1;
@@ -833,7 +866,7 @@ NTSTATUS TCPGetSockAddress
OSK_UI16 LocalPort, RemotePort;
PTA_IP_ADDRESS AddressIP = (PTA_IP_ADDRESS)Address;
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+ ASSERT_LOCKED(&TCPLock);
OskitTCPGetAddress
( Connection->SocketContext,
@@ -846,8 +879,6 @@ NTSTATUS TCPGetSockAddress
AddressIP->Address[0].Address[0].sin_port = GetRemote ? RemotePort : LocalPort;
AddressIP->Address[0].Address[0].in_addr = GetRemote ? RemoteAddress : LocalAddress;
- TcpipRecursiveMutexLeave( &TCPLock );
-
return STATUS_SUCCESS;
}
@@ -866,19 +897,19 @@ VOID TCPRemoveIRP( PCONNECTION_ENDPOINT Endpoint, PIRP Irp ) {
TcpipAcquireSpinLock( &Endpoint->Lock, &OldIrql );
for( i = 0; i < 4; i++ )
- {
- for( Entry = ListHead[i]->Flink;
- Entry != ListHead[i];
- Entry = Entry->Flink )
- {
- Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
- if( Bucket->Request.RequestContext == Irp )
- {
- RemoveEntryList( &Bucket->Entry );
- exFreePool( Bucket );
- break;
- }
- }
+ {
+ for( Entry = ListHead[i]->Flink;
+ Entry != ListHead[i];
+ Entry = Entry->Flink )
+ {
+ Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
+ if( Bucket->Request.RequestContext == Irp )
+ {
+ RemoveEntryList( &Bucket->Entry );
+ exFreePool( Bucket );
+ break;
+ }
+ }
}
TcpipReleaseSpinLock( &Endpoint->Lock, OldIrql );
diff --git a/reactos/lib/drivers/ip/transport/udp/udp.c b/reactos/lib/drivers/ip/transport/udp/udp.c
index a3d3ec04f1a..a723eeaf1dc 100644
--- a/reactos/lib/drivers/ip/transport/udp/udp.c
+++ b/reactos/lib/drivers/ip/transport/udp/udp.c
@@ -161,7 +161,7 @@ NTSTATUS UDPSendDatagram(
IP_PACKET Packet;
PTA_IP_ADDRESS RemoteAddressTa = (PTA_IP_ADDRESS)ConnInfo->RemoteAddress;
IP_ADDRESS RemoteAddress;
- IP_ADDRESS LocalAddress;
+ IP_ADDRESS LocalAddress;
USHORT RemotePort;
NTSTATUS Status;
PNEIGHBOR_CACHE_ENTRY NCE;
@@ -186,12 +186,15 @@ NTSTATUS UDPSendDatagram(
return STATUS_NETWORK_UNREACHABLE;
}
- LocalAddress = AddrFile->Address;
- if (AddrIsUnspecified(&LocalAddress))
- {
- if (!IPGetDefaultAddress(&LocalAddress))
- return FALSE;
- }
+ LocalAddress = AddrFile->Address;
+ if (AddrIsUnspecified(&LocalAddress))
+ {
+ /* If the local address is unspecified (0),
+ * then use the unicast address of the
+ * interface we're sending over
+ */
+ LocalAddress = NCE->Interface->Unicast;
+ }
Status = BuildUDPPacket( &Packet,
&RemoteAddress,
@@ -309,12 +312,12 @@ NTSTATUS UDPStartup(
* Status of operation
*/
{
+ NTSTATUS Status;
+
#ifdef __NTDRIVER__
RtlZeroMemory(&UDPStats, sizeof(UDP_STATISTICS));
#endif
- NTSTATUS Status;
-
Status = PortsStartup( &UDPPorts, 1, UDP_STARTING_PORT + UDP_DYNAMIC_PORTS );
if( !NT_SUCCESS(Status) ) return Status;
diff --git a/reactos/lib/drivers/oskittcp/oskittcp/uipc_socket.c b/reactos/lib/drivers/oskittcp/oskittcp/uipc_socket.c
index 900dec138b9..1472f94c0d2 100644
--- a/reactos/lib/drivers/oskittcp/oskittcp/uipc_socket.c
+++ b/reactos/lib/drivers/oskittcp/oskittcp/uipc_socket.c
@@ -190,7 +190,7 @@ soclose(so)
goto drop;
while (so->so_state & SS_ISCONNECTED) {
error = tsleep((caddr_t)&so->so_timeo,
- PSOCK | PCATCH, netcls, so->so_linger);
+ PSOCK | PCATCH, netcls, so->so_linger * 1000);
if (error)
break;
}
diff --git a/reactos/lib/drivers/sound/mmebuddy/capabilities.c b/reactos/lib/drivers/sound/mmebuddy/capabilities.c
index 2e64067e56a..c8ff6586a74 100644
--- a/reactos/lib/drivers/sound/mmebuddy/capabilities.c
+++ b/reactos/lib/drivers/sound/mmebuddy/capabilities.c
@@ -28,7 +28,8 @@
MMRESULT
GetSoundDeviceCapabilities(
IN PSOUND_DEVICE SoundDevice,
- OUT DWORD_PTR Capabilities, // FIXME: why use DWORD_PTR for an OUT value?
+ IN DWORD DeviceId,
+ OUT PVOID Capabilities,
IN DWORD CapabilitiesSize)
{
MMDEVICE_TYPE DeviceType;
@@ -104,6 +105,7 @@ GetSoundDeviceCapabilities(
return MMSYSERR_NOTSUPPORTED;
return FunctionTable->GetCapabilities(SoundDevice,
- (PVOID)Capabilities,
+ DeviceId,
+ Capabilities,
CapabilitiesSize);
}
diff --git a/reactos/lib/drivers/sound/mmebuddy/deviceinstance.c b/reactos/lib/drivers/sound/mmebuddy/deviceinstance.c
index cbfa56a521c..8646e55e81a 100644
--- a/reactos/lib/drivers/sound/mmebuddy/deviceinstance.c
+++ b/reactos/lib/drivers/sound/mmebuddy/deviceinstance.c
@@ -13,6 +13,13 @@
#include
#include
+/*
+ Restrain ourselves from flooding the kernel device!
+*/
+
+#define SOUND_KERNEL_BUFFER_COUNT 10
+#define SOUND_KERNEL_BUFFER_SIZE 16384
+
MMRESULT
AllocateSoundDeviceInstance(
OUT PSOUND_DEVICE_INSTANCE* SoundDeviceInstance)
@@ -27,6 +34,11 @@ AllocateSoundDeviceInstance(
if ( ! NewInstance )
return MMSYSERR_NOMEM;
+ /* Use default frame size */
+ NewInstance->FrameSize = SOUND_KERNEL_BUFFER_SIZE;
+ /* Use default buffer count */
+ NewInstance->BufferCount = SOUND_KERNEL_BUFFER_COUNT;
+
/* Provide the caller with the new instance pointer */
*SoundDeviceInstance = NewInstance;
diff --git a/reactos/lib/drivers/sound/mmebuddy/mmewrap.c b/reactos/lib/drivers/sound/mmebuddy/mmewrap.c
index aa66a9ecbdf..8ecd6c6259a 100644
--- a/reactos/lib/drivers/sound/mmebuddy/mmewrap.c
+++ b/reactos/lib/drivers/sound/mmebuddy/mmewrap.c
@@ -72,6 +72,7 @@ MmeGetSoundDeviceCapabilities(
return Result;
return GetSoundDeviceCapabilities(SoundDevice,
+ DeviceId,
Capabilities,
CapabilitiesSize);
}
@@ -121,7 +122,7 @@ MmeOpenWaveDevice(
if ( ! MMSUCCESS(Result) )
return TranslateInternalMmResult(Result);
- Result = SetWaveDeviceFormat(SoundDeviceInstance, Format, sizeof(WAVEFORMATEX));
+ Result = SetWaveDeviceFormat(SoundDeviceInstance, DeviceId, Format, sizeof(WAVEFORMATEX));
if ( ! MMSUCCESS(Result) )
{
/* TODO: Destroy sound instance */
@@ -204,3 +205,46 @@ MmeResetWavePlayback(
return StopStreaming(SoundDeviceInstance);
}
+
+MMRESULT
+MmeGetPosition(
+ IN MMDEVICE_TYPE DeviceType,
+ IN DWORD DeviceId,
+ IN DWORD PrivateHandle,
+ IN MMTIME* Time,
+ IN DWORD Size)
+{
+ MMRESULT Result;
+ PSOUND_DEVICE_INSTANCE SoundDeviceInstance;
+ PSOUND_DEVICE SoundDevice;
+ PMMFUNCTION_TABLE FunctionTable;
+
+ VALIDATE_MMSYS_PARAMETER( PrivateHandle );
+ SoundDeviceInstance = (PSOUND_DEVICE_INSTANCE) PrivateHandle;
+
+ if ( ! IsValidSoundDeviceInstance(SoundDeviceInstance) )
+ return MMSYSERR_INVALHANDLE;
+
+ Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice);
+ if ( ! MMSUCCESS(Result) )
+ return TranslateInternalMmResult(Result);
+
+ if ( Size != sizeof(MMTIME) )
+ return MMSYSERR_INVALPARAM;
+
+ Result = GetSoundDeviceFunctionTable(SoundDevice, &FunctionTable);
+ if ( ! MMSUCCESS(Result) )
+ return TranslateInternalMmResult(Result);
+
+ if ( FunctionTable->GetPos == NULL )
+ {
+ /* This indicates bad practice, really! If you can open, why not close?! */
+ return MMSYSERR_NOTSUPPORTED;
+ }
+
+ /* Call the driver */
+ Result = FunctionTable->GetPos(SoundDeviceInstance, Time);
+
+ return Result;
+}
+
diff --git a/reactos/lib/drivers/sound/mmebuddy/wave/format.c b/reactos/lib/drivers/sound/mmebuddy/wave/format.c
index 1b59c9ea86a..ecc5bbc1d9a 100644
--- a/reactos/lib/drivers/sound/mmebuddy/wave/format.c
+++ b/reactos/lib/drivers/sound/mmebuddy/wave/format.c
@@ -53,6 +53,7 @@ QueryWaveDeviceFormatSupport(
MMRESULT
SetWaveDeviceFormat(
IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
+ IN DWORD DeviceId,
IN LPWAVEFORMATEX Format,
IN DWORD FormatSize)
{
@@ -87,5 +88,5 @@ SetWaveDeviceFormat(
if ( ! FunctionTable->SetWaveFormat )
return MMSYSERR_NOTSUPPORTED;
- return FunctionTable->SetWaveFormat(SoundDeviceInstance, Format, FormatSize);
+ return FunctionTable->SetWaveFormat(SoundDeviceInstance, DeviceId, Format, FormatSize);
}
diff --git a/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c b/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c
index ea4c4b5b106..147c301755e 100644
--- a/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c
+++ b/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c
@@ -16,14 +16,6 @@
#include
-/*
- Restrain ourselves from flooding the kernel device!
-*/
-
-#define SOUND_KERNEL_BUFFER_COUNT 10
-#define SOUND_KERNEL_BUFFER_SIZE 16384
-
-
/*
DoWaveStreaming
Check if there is streaming to be done, and if so, do it.
@@ -52,7 +44,7 @@ DoWaveStreaming(
SND_ASSERT( FunctionTable->CommitWaveBuffer );
/* No point in doing anything if no resources available to use */
- if ( SoundDeviceInstance->OutstandingBuffers >= SOUND_KERNEL_BUFFER_COUNT )
+ if ( SoundDeviceInstance->OutstandingBuffers >= SoundDeviceInstance->BufferCount )
{
SND_TRACE(L"DoWaveStreaming: No available buffers to stream with - doing nothing\n");
return;
@@ -67,7 +59,7 @@ DoWaveStreaming(
return;
}
- while ( ( SoundDeviceInstance->OutstandingBuffers < SOUND_KERNEL_BUFFER_COUNT ) &&
+ while ( ( SoundDeviceInstance->OutstandingBuffers < SoundDeviceInstance->BufferCount ) &&
( Header ) )
{
HeaderExtension = (PWAVEHDR_EXTENSION) Header->reserved;
@@ -98,8 +90,8 @@ DoWaveStreaming(
BytesRemaining = Header->dwBufferLength - HeaderExtension->BytesCommitted;
/* We can commit anything up to the buffer size limit */
- BytesToCommit = BytesRemaining > SOUND_KERNEL_BUFFER_SIZE ?
- SOUND_KERNEL_BUFFER_SIZE :
+ BytesToCommit = BytesRemaining > SoundDeviceInstance->FrameSize ?
+ SoundDeviceInstance->FrameSize :
BytesRemaining;
/* Should always have something to commit by this point */
diff --git a/reactos/lib/drivers/sound/mmebuddy/wave/wodMessage.c b/reactos/lib/drivers/sound/mmebuddy/wave/wodMessage.c
index d2fd787609f..3eece4270bc 100644
--- a/reactos/lib/drivers/sound/mmebuddy/wave/wodMessage.c
+++ b/reactos/lib/drivers/sound/mmebuddy/wave/wodMessage.c
@@ -113,6 +113,7 @@ wodMessage(
case WODM_GETPOS :
{
+ Result = MmeGetPosition(WAVE_OUT_DEVICE_TYPE, DeviceId, PrivateHandle, (MMTIME*)Parameter1, Parameter2);
break;
}
}
diff --git a/reactos/lib/drivers/sound/mment4/control.c b/reactos/lib/drivers/sound/mment4/control.c
index 0d32d2e09ea..87a9a4f9d50 100644
--- a/reactos/lib/drivers/sound/mment4/control.c
+++ b/reactos/lib/drivers/sound/mment4/control.c
@@ -200,6 +200,7 @@ QueryNt4WaveDeviceFormatSupport(
MMRESULT
SetNt4WaveDeviceFormat(
IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
+ IN DWORD DeviceId,
IN LPWAVEFORMATEX Format,
IN DWORD FormatSize)
{
diff --git a/reactos/lib/fslib/vfatlib/check/vfat.h b/reactos/lib/fslib/vfatlib/check/vfat.h
index 25b79d68a42..79e235737c3 100755
--- a/reactos/lib/fslib/vfatlib/check/vfat.h
+++ b/reactos/lib/fslib/vfatlib/check/vfat.h
@@ -3,7 +3,6 @@
#include
#include
#include
-#include
#include
#include
diff --git a/reactos/lib/pseh/i386/framebased-gcchack.c b/reactos/lib/pseh/i386/framebased-gcchack.c
index af725a4da1c..fa59b4d15a6 100644
--- a/reactos/lib/pseh/i386/framebased-gcchack.c
+++ b/reactos/lib/pseh/i386/framebased-gcchack.c
@@ -192,6 +192,7 @@ void _SEH2Handle(_SEH2Frame_t * frame, volatile _SEH2TryLevel_t * trylevel)
_SEH2GlobalUnwind(frame);
_SEH2LocalUnwind(frame, &fulltrylevel->SHT_Common);
+ frame->SF_TopTryLevel = fulltrylevel->SHT_Common.ST_Next;
__SEH2Handle
(
diff --git a/reactos/lib/pseh/pseh.rbuild b/reactos/lib/pseh/pseh.rbuild
index 085e9d40601..3d2cbfeef4d 100644
--- a/reactos/lib/pseh/pseh.rbuild
+++ b/reactos/lib/pseh/pseh.rbuild
@@ -4,8 +4,11 @@
framebased.S
- framebased-gcchack.c
- framebased-gcchack-asm.S
+
+
+ framebased-gcchack.c
+ framebased-gcchack-asm.S
+
diff --git a/reactos/lib/rtl/exception.c b/reactos/lib/rtl/exception.c
index b0581ae3ed6..15c1fe8d306 100644
--- a/reactos/lib/rtl/exception.c
+++ b/reactos/lib/rtl/exception.c
@@ -66,6 +66,11 @@ RtlRaiseException(PEXCEPTION_RECORD ExceptionRecord)
RtlRaiseStatus(Status);
}
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4717)
+#endif
+
/*
* @implemented
*/
@@ -113,6 +118,10 @@ RtlRaiseStatus(NTSTATUS Status)
RtlRaiseStatus(Status);
}
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
/*
* @implemented
*/
diff --git a/reactos/lib/rtl/generictable.c b/reactos/lib/rtl/generictable.c
index 0d8f7807147..272182d0ba3 100644
--- a/reactos/lib/rtl/generictable.c
+++ b/reactos/lib/rtl/generictable.c
@@ -619,7 +619,7 @@ RtlEnumerateGenericTableWithoutSplayingAvl(IN PRTL_AVL_TABLE Table,
IN OUT PVOID *RestartKey)
{
/* FIXME! */
- return RtlEnumerateGenericTableWithoutSplayingAvl(Table, RestartKey);
+ return NULL;
}
/*
diff --git a/reactos/lib/rtl/sprintf.c b/reactos/lib/rtl/sprintf.c
index c213adaeb2f..252de8dab0e 100644
--- a/reactos/lib/rtl/sprintf.c
+++ b/reactos/lib/rtl/sprintf.c
@@ -226,7 +226,9 @@ numberf(char * buf, char * end, double num, int base, int size, int precision, i
{
x = num;
tmp[i++] = digits[do_div(&x,base)];
+#ifndef _M_ARM // Missing __floatdidf in CeGCC 0.55 -- GCC 4.4
num=x;
+#endif
}
if (i > precision)
precision = i;
diff --git a/reactos/lib/rtl/swprintf.c b/reactos/lib/rtl/swprintf.c
index c4b7fa95b71..e47d49af03e 100644
--- a/reactos/lib/rtl/swprintf.c
+++ b/reactos/lib/rtl/swprintf.c
@@ -226,7 +226,9 @@ numberf(wchar_t * buf, wchar_t * end, double num, int base, int size, int precis
{
x = num;
tmp[i++] = digits[do_div(&x,base)];
+#ifndef _M_ARM // Missing __floatdidf in CeGCC 0.55 -- GCC 4.4
num = x;
+#endif
}
if (i > precision)
precision = i;
diff --git a/reactos/lib/sdk/crt/crt.rbuild b/reactos/lib/sdk/crt/crt.rbuild
index f713b8977f6..4611d63b2a1 100644
--- a/reactos/lib/sdk/crt/crt.rbuild
+++ b/reactos/lib/sdk/crt/crt.rbuild
@@ -116,9 +116,6 @@
frexp.c
huge_val.c
hypot.c
- j0_y0.c
- j1_y1.c
- jn_yn.c
ldiv.c
modf.c
rand.c
@@ -158,6 +155,9 @@
fmod.c
ldexp.c
+ j0_y0.c
+ j1_y1.c
+ jn_yn.c
@@ -182,6 +182,9 @@
sqrtf.S
tan.S
+ j0_y0.c
+ j1_y1.c
+ jn_yn.c
stubs.c
diff --git a/reactos/lib/sdk/crt/include/float.h b/reactos/lib/sdk/crt/include/float.h
index 087b59092b6..48281188df5 100644
--- a/reactos/lib/sdk/crt/include/float.h
+++ b/reactos/lib/sdk/crt/include/float.h
@@ -101,9 +101,6 @@
#ifndef DBL_MAX_10_EXP
#define DBL_MAX_10_EXP 308
#endif
-#ifndef S_IFIFO
-#define S_IFIFO -1
-#endif
#ifndef UINT64_MAX
#define UINT64_MAX 0xffffffffffffffff
#endif
@@ -117,10 +114,10 @@ extern "C" {
#ifndef _CRTIMP
#ifdef _DLL
#define _CRTIMP __declspec(dllimport)
-#else
+#else
#define _CRTIMP
#endif /* _DLL */
-#endif
+#endif
/* Set the FPU control word as cw = (cw & ~unMask) | (unNew & unMask),
* i.e. change the bits in unMask to have the values they have in unNew,
diff --git a/reactos/lib/sdk/crt/include/internal/wine/cppexcept.h b/reactos/lib/sdk/crt/include/internal/wine/cppexcept.h
index 7db1e82b259..29e41e8307f 100644
--- a/reactos/lib/sdk/crt/include/internal/wine/cppexcept.h
+++ b/reactos/lib/sdk/crt/include/internal/wine/cppexcept.h
@@ -52,6 +52,7 @@
#define EH_STACK_INVALID 0x08
#define EH_NESTED_CALL 0x10
+#ifndef _M_ARM
static inline EXCEPTION_REGISTRATION_RECORD *__wine_push_frame( EXCEPTION_REGISTRATION_RECORD *frame )
{
#if defined(__i386__)
@@ -77,6 +78,7 @@ static inline EXCEPTION_REGISTRATION_RECORD *__wine_pop_frame( EXCEPTION_REGISTR
return frame->Next;
#endif
}
+#endif
#define __TRY _SEH2_TRY
#define __EXCEPT(func) _SEH2_EXCEPT(func(_SEH2_GetExceptionInformation()))
diff --git a/reactos/lib/sdk/crt/stdio/lnx_sprintf.c b/reactos/lib/sdk/crt/stdio/lnx_sprintf.c
index 82465b24e9b..79daca4e7ea 100644
--- a/reactos/lib/sdk/crt/stdio/lnx_sprintf.c
+++ b/reactos/lib/sdk/crt/stdio/lnx_sprintf.c
@@ -168,7 +168,7 @@ numberf(char * buf, char * end, double num, char exp_sign, int size, int precisi
int ro = 0;
int isize;
- double frac, intr;
+ double num2, frac, intr;
double p;
char c, sign, digits[66];
@@ -185,7 +185,12 @@ numberf(char * buf, char * end, double num, char exp_sign, int size, int precisi
if ( exp_sign == 'g' || exp_sign == 'G' || exp_sign == 'e' || exp_sign == 'E' )
{
ie = ((unsigned int)n.n->exponent - (unsigned int)0x3ff);
- exponent = ie/3.321928;
+ if (*n.__n == 0.0)
+ exponent = 0.0;
+ else
+ {
+ exponent = ie/3.321928;
+ }
}
if ( exp_sign == 'g' || exp_sign == 'G' )
@@ -201,17 +206,27 @@ numberf(char * buf, char * end, double num, char exp_sign, int size, int precisi
if ( exp_sign == 'e' || exp_sign == 'E' )
{
frac = modf(exponent,&e);
- /* FIXME: this exponent over-/underflow scheme doesn't comply with the wanted behaviour
- * needed at all or completely different in original? */
-#if 0
- if ( frac > 0.5 )
- e++;
- else if ( frac < -0.5 )
+ if (num < 0.0)
e--;
-#endif
+ if (frac >= 0.5)
+ e++;
+ else if (frac < -0.5)
+ e--;
+
+ num2 = num/pow(10.0L,(long double)e);
+ if (num2 < 1.0 && num2 > -1.0)
+ {
+ e--;
+ num2 = num/pow(10.0L,(long double)e);
+ }
+ else if (num2 < -10.0 && num2 > 10.0)
+ {
+ e++;
+ num2 = num/pow(10.0L,(long double)e);
+ }
/* size-5 because "e+abc" is going to follow */
- buf = numberf(buf, end, num/pow(10.0L,(long double)e), 'f', size-5, precision, type);
+ buf = numberf(buf, end, num2, 'f', size-5, precision, type);
isize = 4;
while(*(buf-1) == ' ')
{
diff --git a/reactos/lib/sdk/crt/stdio/popen.c b/reactos/lib/sdk/crt/stdio/popen.c
index a9624796add..ab5efa83bfa 100644
--- a/reactos/lib/sdk/crt/stdio/popen.c
+++ b/reactos/lib/sdk/crt/stdio/popen.c
@@ -1,20 +1,20 @@
/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS system libraries
- * FILE: lib/crt/??????
- * PURPOSE: Unknown
- * PROGRAMER: Unknown
- * UPDATE HISTORY:
- * 25/11/05: Created
- */
+* COPYRIGHT: See COPYING in the top level directory
+* PROJECT: ReactOS system libraries
+* FILE: lib/crt/??????
+* PURPOSE: Unknown
+* PROGRAMER: Unknown
+* UPDATE HISTORY:
+* 25/11/05: Created
+*/
#include
#include
#ifdef _UNICODE
- #define sT "S"
+#define sT "S"
#else
- #define sT "s"
+#define sT "s"
#endif
#define MK_STR(s) #s
@@ -27,104 +27,102 @@ unsigned split_oflags(unsigned oflags); //FIXME: Remove
*/
FILE *_tpopen (const _TCHAR *cm, const _TCHAR *md) /* program name, pipe mode */
{
- _TCHAR *szCmdLine=NULL;
- _TCHAR *szComSpec=NULL;
- _TCHAR *s;
- FILE *pf;
- HANDLE hReadPipe, hWritePipe;
- BOOL result;
- STARTUPINFO StartupInfo;
- PROCESS_INFORMATION ProcessInformation;
- SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
+ _TCHAR *szCmdLine=NULL;
+ _TCHAR *szComSpec=NULL;
+ _TCHAR *s;
+ FILE *pf;
+ HANDLE hReadPipe, hWritePipe;
+ BOOL result;
+ STARTUPINFO StartupInfo;
+ PROCESS_INFORMATION ProcessInformation;
+ SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
- TRACE(MK_STR(_tpopen)"('%"sT"', '%"sT"')\n", cm, md);
+ TRACE(MK_STR(_tpopen)"('%"sT"', '%"sT"')\n", cm, md);
- if (cm == NULL)
- return( NULL );
+ if (cm == NULL)
+ return( NULL );
- szComSpec = _tgetenv(_T("COMSPEC"));
- if (szComSpec == NULL)
- {
- szComSpec = _T("cmd.exe");
- }
+ szComSpec = _tgetenv(_T("COMSPEC"));
+ if (szComSpec == NULL)
+ {
+ szComSpec = _T("cmd.exe");
+ }
- s = max(_tcsrchr(szComSpec, '\\'), _tcsrchr(szComSpec, '/'));
- if (s == NULL)
- s = szComSpec;
- else
- s++;
+ s = max(_tcsrchr(szComSpec, '\\'), _tcsrchr(szComSpec, '/'));
+ if (s == NULL)
+ s = szComSpec;
+ else
+ s++;
- szCmdLine = malloc((_tcslen(s) + 4 + _tcslen(cm) + 1) * sizeof(_TCHAR));
- if (szCmdLine == NULL)
- {
- return NULL;
- }
+ szCmdLine = malloc((_tcslen(s) + 4 + _tcslen(cm) + 1) * sizeof(_TCHAR));
+ if (szCmdLine == NULL)
+ {
+ return NULL;
+ }
- _tcscpy(szCmdLine, s);
- s = _tcsrchr(szCmdLine, '.');
- if (s)
- *s = 0;
- _tcscat(szCmdLine, _T(" /C "));
- _tcscat(szCmdLine, cm);
+ _tcscpy(szCmdLine, s);
+ s = _tcsrchr(szCmdLine, '.');
+ if (s)
+ *s = 0;
+ _tcscat(szCmdLine, _T(" /C "));
+ _tcscat(szCmdLine, cm);
- if ( !CreatePipe(&hReadPipe,&hWritePipe,&sa,1024))
- {
+ if ( !CreatePipe(&hReadPipe,&hWritePipe,&sa,1024))
+ {
+ free (szCmdLine);
+ return NULL;
+ }
+
+ memset(&StartupInfo, 0, sizeof(STARTUPINFO));
+ StartupInfo.cb = sizeof(STARTUPINFO);
+
+ if (*md == 'r' ) {
+ StartupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+ StartupInfo.hStdOutput = hWritePipe;
+ StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
+ }
+ else if ( *md == 'w' ) {
+ StartupInfo.hStdInput = hReadPipe;
+ StartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
+ StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
+ }
+
+ if (StartupInfo.dwFlags & STARTF_USESTDHANDLES)
+ StartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
+
+ result = CreateProcess(szComSpec,
+ szCmdLine,
+ NULL,
+ NULL,
+ TRUE,
+ 0,
+ NULL,
+ NULL,
+ &StartupInfo,
+ &ProcessInformation);
free (szCmdLine);
- return NULL;
- }
- memset(&StartupInfo, 0, sizeof(STARTUPINFO));
- StartupInfo.cb = sizeof(STARTUPINFO);
-
- if (*md == 'r' ) {
- StartupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
- StartupInfo.hStdOutput = hWritePipe;
- StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
- }
- else if ( *md == 'w' ) {
- StartupInfo.hStdInput = hReadPipe;
- StartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
- StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
- }
-
- if (StartupInfo.dwFlags & STARTF_USESTDHANDLES)
- StartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
-
- result = CreateProcess(szComSpec,
- szCmdLine,
- NULL,
- NULL,
- TRUE,
- 0,
- NULL,
- NULL,
- &StartupInfo,
- &ProcessInformation);
- free (szCmdLine);
-
- if (result == FALSE)
- {
- CloseHandle(hReadPipe);
- CloseHandle(hWritePipe);
- return NULL;
- }
-
- CloseHandle(ProcessInformation.hThread);
-
- if ( *md == 'r' )
+ if (result == FALSE)
{
- pf = _tfdopen(alloc_fd(hReadPipe, split_oflags(_fmode)) , _T("r"));
- CloseHandle(hWritePipe);
- }
- else
- {
- pf = _tfdopen( alloc_fd(hWritePipe, split_oflags(_fmode)) , _T("w"));
- CloseHandle(hReadPipe);
+ CloseHandle(hReadPipe);
+ CloseHandle(hWritePipe);
+ return NULL;
}
- //pf->_tmpfname = ProcessInformation.hProcess;
+ CloseHandle(ProcessInformation.hThread);
- return( pf );
+ if ( *md == 'r' )
+ {
+ pf = _tfdopen(alloc_fd(hReadPipe, split_oflags(_fmode)) , _T("r"));
+ CloseHandle(hWritePipe);
+ }
+ else
+ {
+ pf = _tfdopen( alloc_fd(hWritePipe, split_oflags(_fmode)) , _T("w"));
+ CloseHandle(hReadPipe);
+ }
+
+ return( pf );
}
#ifndef _UNICODE
@@ -134,12 +132,12 @@ FILE *_tpopen (const _TCHAR *cm, const _TCHAR *md) /* program name, pipe mode */
*/
int _pclose (FILE *pp)
{
- TRACE("_pclose(%x)",pp);
+ TRACE("_pclose(%x)",pp);
- fclose(pp);
- //if (!TerminateProcess(pp->_tmpfname ,0))
- // return( -1 );
- return( 0 );
+ fclose(pp);
+ //if (!TerminateProcess(pp->_tmpfname ,0))
+ // return( -1 );
+ return( 0 );
}
#endif
diff --git a/reactos/lib/sdk/delayimp/delayimp.c b/reactos/lib/sdk/delayimp/delayimp.c
new file mode 100644
index 00000000000..25476887e4c
--- /dev/null
+++ b/reactos/lib/sdk/delayimp/delayimp.c
@@ -0,0 +1,100 @@
+/*
+ * PROJECT: ReactOS SDK Library
+ * LICENSE: LGPL, see LGPL.txt in top level directory.
+ * FILE: lib/sdk/delayimp/delayimp.c
+ * PURPOSE: Library for delay importing from dlls
+ * PROGRAMMERS: Timo Kreuzer
+ *
+ */
+
+#include
+#include
+
+/**** load helper ****/
+
+FARPROC WINAPI
+__delayLoadHelper2(PCImgDelayDescr pidd, PImgThunkData pIATEntry)
+{
+ DelayLoadInfo dli;
+ int index;
+ PImgThunkData pIAT;
+ PImgThunkData pINT;
+ HMODULE *phMod;
+ FARPROC pProc;
+
+ pIAT = PFromRva(pidd->rvaIAT);
+ pINT = PFromRva(pidd->rvaINT);
+ phMod = PFromRva(pidd->rvaHmod);
+ index = IndexFromPImgThunkData(pIATEntry, pIAT);
+
+ dli.cb = sizeof(dli);
+ dli.pidd = pidd;
+ dli.ppfn = (FARPROC*)pIATEntry->u1.Function;
+ dli.szDll = PFromRva(pidd->rvaDLLName);
+ dli.dlp.fImportByName = !(pINT[index].u1.Ordinal & IMAGE_ORDINAL_FLAG);
+ if (dli.dlp.fImportByName)
+ {
+ /* u1.AdressOfData points to a IMAGE_IMPORT_BY_NAME struct */
+ PIMAGE_IMPORT_BY_NAME piibn = PFromRva((RVA)pINT[index].u1.AddressOfData);
+ dli.dlp.szProcName = (LPCSTR)&piibn->Name;
+ }
+ else
+ {
+ dli.dlp.dwOrdinal = pINT[index].u1.Ordinal & ~IMAGE_ORDINAL_FLAG;
+ }
+ dli.hmodCur = *phMod;
+ dli.pfnCur = (FARPROC)pIAT[index].u1.Function;
+ dli.dwLastError = GetLastError();
+ pProc = __pfnDliNotifyHook2(dliStartProcessing, &dli);
+ if (pProc)
+ {
+ pIAT[index].u1.Function = (DWORD_PTR)pProc;
+ return pProc;
+ }
+
+ if (dli.hmodCur == NULL)
+ {
+ dli.hmodCur = LoadLibraryA(dli.szDll);
+ if (!dli.hmodCur)
+ {
+ dli.dwLastError = GetLastError();
+ __pfnDliFailureHook2(dliFailLoadLib, &dli);
+// if (ret)
+// {
+// }
+ // FIXME: raise exception;
+ return NULL;
+ }
+ *phMod = dli.hmodCur;
+ }
+
+ /* dli.dlp.szProcName might also contain the ordinal */
+ pProc = GetProcAddress(dli.hmodCur, dli.dlp.szProcName);
+ if (!pProc)
+ {
+ dli.dwLastError = GetLastError();
+ __pfnDliFailureHook2(dliFailGetProc, &dli);
+ // FIXME: handle return value & raise exception
+ return NULL;
+ }
+ pIAT[index].u1.Function = (DWORD_PTR)pProc;
+
+ return pProc;
+}
+
+/*** The default hooks ***/
+
+FARPROC WINAPI
+DefaultDliNotifyHook2(unsigned dliNotify, PDelayLoadInfo pdli)
+{
+ return NULL;
+}
+
+FARPROC WINAPI
+DefaultDliFailureHook2(unsigned dliNotify, PDelayLoadInfo pdli)
+{
+ return NULL;
+}
+
+PfnDliHook __pfnDliNotifyHook2 = DefaultDliNotifyHook2;
+PfnDliHook __pfnDliFailureHook2 = DefaultDliFailureHook2;
diff --git a/reactos/lib/sdk/delayimp/delayimp.rbuild b/reactos/lib/sdk/delayimp/delayimp.rbuild
new file mode 100644
index 00000000000..ad7b7df6dcd
--- /dev/null
+++ b/reactos/lib/sdk/delayimp/delayimp.rbuild
@@ -0,0 +1,7 @@
+
+
+
+
+ delayimp.c
+
+
diff --git a/reactos/lib/sdk/dxguid/dxguid-mingw.c b/reactos/lib/sdk/dxguid/dxguid-mingw.c
index 9c5b567765d..a93784f4803 100644
--- a/reactos/lib/sdk/dxguid/dxguid-mingw.c
+++ b/reactos/lib/sdk/dxguid/dxguid-mingw.c
@@ -66,6 +66,7 @@ DEFINE_GUID(IID_IDirectMusicSynth8,0x53cab625,0x2711,0x4c9f,0x9d,0xe7,0x1b,0x7f,
DEFINE_GUID(IID_IDirectMusicSynthSink,0x09823663,0x5c85,0x11d2,0xaf,0xa6,0x00,0xaa,0x00,0x24,0xd8,0xb6);
DEFINE_GUID(IID_IKsFastClock,0xc9902485,0xc180,0x11d2,0x84,0x73,0xd4,0x23,0x94,0x45,0x9e,0x5e);
DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
+DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
/* Match ms dxsdk 2004 dec these guids exist in dxguid, tested by Magnus Olsen */
DEFINE_GUID(CLSID_DirectMusicAudioPathConfig, 0xEE0B9CA0, 0xA81E, 0x11D3, 0x9B, 0xD1, 0x00, 0x80, 0xC7, 0x15, 0x0A, 0x74);
diff --git a/reactos/lib/sdk/sdk.rbuild b/reactos/lib/sdk/sdk.rbuild
index c896f0ca8cf..757a5f98d52 100644
--- a/reactos/lib/sdk/sdk.rbuild
+++ b/reactos/lib/sdk/sdk.rbuild
@@ -5,6 +5,9 @@
+
+
+
diff --git a/reactos/lib/sdk/uuid/uuid.rbuild b/reactos/lib/sdk/uuid/uuid.rbuild
index 6c687483973..b699d2f7f70 100644
--- a/reactos/lib/sdk/uuid/uuid.rbuild
+++ b/reactos/lib/sdk/uuid/uuid.rbuild
@@ -1,6 +1,5 @@
- include/reactos/wine
uuid.c
diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE
index fc5c5421549..b961cd104a3 100644
--- a/reactos/media/doc/README.WINE
+++ b/reactos/media/doc/README.WINE
@@ -52,6 +52,7 @@ reactos/dll/win32/comdlg32 # Autosync
reactos/dll/win32/compstui # Autosync
reactos/dll/win32/credui # Autosync
reactos/dll/win32/crypt32 # Synced to Wine-1_1_21
+reactos/dll/win32/cryptdlg # Autosync
reactos/dll/win32/cryptdll # Autosync
reactos/dll/win32/cryptnet # Autosync
reactos/dll/win32/cryptui # Autosync
@@ -231,7 +232,9 @@ User32 -
reactos/dll/win32/user32/controls/scrollbar.c # Forked
reactos/dll/win32/user32/controls/static.c # Synced to Wine-1_1_22
- reactos/dll/win32/user32/misc/dde.c # Synced to wine 1.1.17 (dde_misc.c)
+ reactos/dll/win32/user32/include/dde_private.h # Synced to wine 1.1.24
+
+ reactos/dll/win32/user32/misc/dde.c # Synced to wine 1.1.24 (dde_misc.c)
reactos/dll/win32/user32/misc/ddeclient.c # Synced to Wine-1_1_23
reactos/dll/win32/user32/misc/ddeserver.c # Synced to Wine-1_1_23
reactos/dll/win32/user32/misc/exticon.c # Synced to Wine-1_1_22
diff --git a/reactos/modules/directory.rbuild b/reactos/modules/directory.rbuild
index ade26fe1f12..7c33c54cb7c 100644
--- a/reactos/modules/directory.rbuild
+++ b/reactos/modules/directory.rbuild
@@ -22,11 +22,4 @@
-
-
-
-
-
-
-
diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c
index bcf4ec4e79b..f16628ff8f8 100644
--- a/reactos/ntoskrnl/cc/copy.c
+++ b/reactos/ntoskrnl/cc/copy.c
@@ -247,6 +247,17 @@ WriteCacheSegment(PCACHE_SEGMENT CacheSeg)
{
Size = CacheSeg->Bcb->CacheSegmentSize;
}
+ //
+ // Nonpaged pool PDEs in ReactOS must actually be synchronized between the
+ // MmGlobalPageDirectory and the real system PDE directory. What a mess...
+ //
+ {
+ int i = 0;
+ do
+ {
+ MmGetPfnForProcess(NULL, (PVOID)((ULONG_PTR)CacheSeg->BaseAddress + (i << PAGE_SHIFT)));
+ } while (++i < (Size >> PAGE_SHIFT));
+ }
Mdl = alloca(MmSizeOfMdl(CacheSeg->BaseAddress, Size));
MmInitializeMdl(Mdl, CacheSeg->BaseAddress, Size);
MmBuildMdlForNonPagedPool(Mdl);
diff --git a/reactos/ntoskrnl/config/ntapi.c b/reactos/ntoskrnl/config/ntapi.c
index 3a95860dd1f..3dd8e4f7a31 100644
--- a/reactos/ntoskrnl/config/ntapi.c
+++ b/reactos/ntoskrnl/config/ntapi.c
@@ -23,9 +23,9 @@ NtCreateKey(OUT PHANDLE KeyHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN ULONG TitleIndex,
- IN PUNICODE_STRING Class,
+ IN PUNICODE_STRING Class OPTIONAL,
IN ULONG CreateOptions,
- OUT PULONG Disposition)
+ OUT PULONG Disposition OPTIONAL)
{
NTSTATUS Status = STATUS_SUCCESS;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
@@ -58,6 +58,8 @@ NtCreateKey(OUT PHANDLE KeyHandle,
ProbeForRead(ObjectAttributes,
sizeof(OBJECT_ATTRIBUTES),
sizeof(ULONG));
+
+ if (Disposition) ProbeForWriteUlong(Disposition);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
@@ -228,6 +230,7 @@ NtEnumerateKey(IN HANDLE KeyHandle,
IN ULONG Length,
OUT PULONG ResultLength)
{
+ KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status;
PCM_KEY_BODY KeyObject;
REG_ENUMERATE_KEY_INFORMATION EnumerateKeyInfo;
@@ -254,6 +257,29 @@ NtEnumerateKey(IN HANDLE KeyHandle,
NULL);
if (!NT_SUCCESS(Status)) return Status;
+ if (PreviousMode != KernelMode)
+ {
+ _SEH2_TRY
+ {
+ ProbeForWriteUlong(ResultLength);
+ ProbeForWrite(KeyInformation,
+ Length,
+ sizeof(ULONG));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ if (!NT_SUCCESS(Status))
+ {
+ /* Dereference and return status */
+ ObDereferenceObject(KeyObject);
+ return Status;
+ }
+ }
+
/* Setup the callback */
PostOperationInfo.Object = (PVOID)KeyObject;
EnumerateKeyInfo.Object = (PVOID)KeyObject;
@@ -293,6 +319,7 @@ NtEnumerateValueKey(IN HANDLE KeyHandle,
IN ULONG Length,
OUT PULONG ResultLength)
{
+ KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status;
PCM_KEY_BODY KeyObject;
REG_ENUMERATE_VALUE_KEY_INFORMATION EnumerateValueKeyInfo;
@@ -319,6 +346,29 @@ NtEnumerateValueKey(IN HANDLE KeyHandle,
NULL);
if (!NT_SUCCESS(Status)) return Status;
+ if (PreviousMode != KernelMode)
+ {
+ _SEH2_TRY
+ {
+ ProbeForWriteUlong(ResultLength);
+ ProbeForWrite(KeyValueInformation,
+ Length,
+ sizeof(ULONG));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ if (!NT_SUCCESS(Status))
+ {
+ /* Dereference and return status */
+ ObDereferenceObject(KeyObject);
+ return Status;
+ }
+ }
+
/* Setup the callback */
PostOperationInfo.Object = (PVOID)KeyObject;
EnumerateValueKeyInfo.Object = (PVOID)KeyObject;
@@ -358,6 +408,7 @@ NtQueryKey(IN HANDLE KeyHandle,
IN ULONG Length,
OUT PULONG ResultLength)
{
+ KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status;
PCM_KEY_BODY KeyObject;
REG_QUERY_KEY_INFORMATION QueryKeyInfo;
@@ -414,6 +465,29 @@ NtQueryKey(IN HANDLE KeyHandle,
/* Quit on failure */
if (!NT_SUCCESS(Status)) return Status;
+ if (PreviousMode != KernelMode)
+ {
+ _SEH2_TRY
+ {
+ ProbeForWriteUlong(ResultLength);
+ ProbeForWrite(KeyInformation,
+ Length,
+ sizeof(ULONG));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ if (!NT_SUCCESS(Status))
+ {
+ /* Dereference and return status */
+ ObDereferenceObject(KeyObject);
+ return Status;
+ }
+ }
+
/* Setup the callback */
PostOperationInfo.Object = (PVOID)KeyObject;
QueryKeyInfo.Object = (PVOID)KeyObject;
@@ -452,6 +526,7 @@ NtQueryValueKey(IN HANDLE KeyHandle,
IN ULONG Length,
OUT PULONG ResultLength)
{
+ KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status;
PCM_KEY_BODY KeyObject;
REG_QUERY_VALUE_KEY_INFORMATION QueryValueKeyInfo;
@@ -470,6 +545,29 @@ NtQueryValueKey(IN HANDLE KeyHandle,
NULL);
if (!NT_SUCCESS(Status)) return Status;
+ if (PreviousMode != KernelMode)
+ {
+ _SEH2_TRY
+ {
+ ProbeForWriteUlong(ResultLength);
+ ProbeForWrite(KeyValueInformation,
+ Length,
+ sizeof(ULONG));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ if (!NT_SUCCESS(Status))
+ {
+ /* Dereference and return status */
+ ObDereferenceObject(KeyObject);
+ return Status;
+ }
+ }
+
/* Make sure the name is aligned properly */
if ((ValueNameCopy.Length & (sizeof(WCHAR) - 1)))
{
diff --git a/reactos/ntoskrnl/dbgk/dbgkobj.c b/reactos/ntoskrnl/dbgk/dbgkobj.c
index 528b9c94511..13676884150 100644
--- a/reactos/ntoskrnl/dbgk/dbgkobj.c
+++ b/reactos/ntoskrnl/dbgk/dbgkobj.c
@@ -1512,7 +1512,7 @@ NTAPI
NtCreateDebugObject(OUT PHANDLE DebugHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
- IN BOOLEAN KillProcessOnExit)
+ IN ULONG Flags)
{
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
PDEBUG_OBJECT DebugObject;
@@ -1537,6 +1537,9 @@ NtCreateDebugObject(OUT PHANDLE DebugHandle,
if (!NT_SUCCESS(Status)) return Status;
}
+ /* Check for invalid flags */
+ if (Flags & ~DBGK_ALL_FLAGS) return STATUS_INVALID_PARAMETER;
+
/* Create the Object */
Status = ObCreateObject(PreviousMode,
DbgkDebugObjectType,
@@ -1561,7 +1564,7 @@ NtCreateDebugObject(OUT PHANDLE DebugHandle,
FALSE);
/* Set the Flags */
- DebugObject->KillProcessOnExit = KillProcessOnExit;
+ DebugObject->Flags = Flags;
/* Insert it */
Status = ObInsertObject((PVOID)DebugObject,
diff --git a/reactos/ntoskrnl/ex/fastinterlck.c b/reactos/ntoskrnl/ex/fastinterlck.c
index d09b0851740..c247bec26cf 100644
--- a/reactos/ntoskrnl/ex/fastinterlck.c
+++ b/reactos/ntoskrnl/ex/fastinterlck.c
@@ -19,6 +19,7 @@
#undef ExInterlockedAddULong
#undef ExInterlockedIncrementLong
#undef ExInterlockedDecrementLong
+#undef ExInterlockedAddLargeStatistic
/* FUNCTIONS ******************************************************************/
@@ -288,7 +289,7 @@ ExInterlockedRemoveHeadList(IN PLIST_ENTRY ListHead,
VOID
FASTCALL
-ExInterlockedAddLargeStatistic(IN PLARGE_INTEGER Addend,
+ExInterlockedAddLargeStatistic(IN PLONGLONG Addend,
IN ULONG Increment)
{
UNIMPLEMENTED;
@@ -296,7 +297,7 @@ ExInterlockedAddLargeStatistic(IN PLARGE_INTEGER Addend,
LONGLONG
FASTCALL
-ExInterlockedCompareExchange64(IN OUT PLONGLONG Destination,
+ExInterlockedCompareExchange64(IN OUT LONGLONG volatile *Destination,
IN PLONGLONG Exchange,
IN PLONGLONG Comparand,
IN PKSPIN_LOCK Lock)
diff --git a/reactos/ntoskrnl/ex/shutdown.c b/reactos/ntoskrnl/ex/shutdown.c
index 44d629097b5..b83ca0edcdb 100644
--- a/reactos/ntoskrnl/ex/shutdown.c
+++ b/reactos/ntoskrnl/ex/shutdown.c
@@ -133,6 +133,10 @@ ShutdownThreadMain(PVOID Context)
"\n"
};
LARGE_INTEGER Now;
+#ifdef CONFIG_SMP
+ LONG i;
+ KIRQL OldIrql;
+#endif
/* Run the thread on the boot processor */
KeSetSystemAffinityThread(1);
@@ -160,7 +164,6 @@ ShutdownThreadMain(PVOID Context)
PspShutdownProcessManager();
CmShutdownSystem();
- MiShutdownMemoryManager();
IoShutdownRegisteredFileSystems();
IoShutdownRegisteredDevices();
@@ -173,9 +176,6 @@ ShutdownThreadMain(PVOID Context)
HalReturnToFirmware (FIRMWARE_OFF);
#else
#ifdef CONFIG_SMP
- LONG i;
- KIRQL OldIrql;
-
OldIrql = KeRaiseIrqlToDpcLevel();
/* Halt all other processors */
for (i = 0; i < KeNumberProcessors; i++)
diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c
index c704046a3c4..4177b36347a 100644
--- a/reactos/ntoskrnl/ex/sysinfo.c
+++ b/reactos/ntoskrnl/ex/sysinfo.c
@@ -956,10 +956,11 @@ QSI_DEF(SystemProcessorPerformanceInformation)
}
CurrentTime.QuadPart = KeQueryInterruptTime();
- Prcb = KeGetCurrentPrcb();
-
for (i = 0; i < KeNumberProcessors; i++)
{
+ /* Get the PRCB on this processor */
+ Prcb = KiProcessorBlock[i];
+
/* Calculate total user and kernel times */
TotalTime = Prcb->IdleThread->KernelTime + Prcb->IdleThread->UserTime;
Spi->IdleTime.QuadPart = UInt32x32To64(TotalTime, KeMaximumIncrement);
@@ -969,7 +970,6 @@ QSI_DEF(SystemProcessorPerformanceInformation)
Spi->InterruptTime.QuadPart = UInt32x32To64(Prcb->InterruptTime, KeMaximumIncrement);
Spi->InterruptCount = Prcb->InterruptCount;
Spi++;
- Prcb = (PKPRCB)((ULONG_PTR)Prcb + PAGE_SIZE);
}
return STATUS_SUCCESS;
diff --git a/reactos/ntoskrnl/ex/uuid.c b/reactos/ntoskrnl/ex/uuid.c
index 82e02c38ff4..ef860be9981 100644
--- a/reactos/ntoskrnl/ex/uuid.c
+++ b/reactos/ntoskrnl/ex/uuid.c
@@ -239,9 +239,10 @@ ExpAllocateLocallyUniqueId(OUT LUID *LocallyUniqueId)
PrevLuid = LuidValue;
NewLuid = RtlLargeIntegerAdd(PrevLuid,
LuidIncrement);
- } while(InterlockedCompareExchange64(&LuidValue.QuadPart,
- NewLuid.QuadPart,
- PrevLuid.QuadPart) != PrevLuid.QuadPart);
+ } while(ExInterlockedCompareExchange64(&LuidValue.QuadPart,
+ &NewLuid.QuadPart,
+ &PrevLuid.QuadPart,
+ NULL) != PrevLuid.QuadPart);
LocallyUniqueId->LowPart = NewLuid.u.LowPart;
LocallyUniqueId->HighPart = NewLuid.u.HighPart;
diff --git a/reactos/ntoskrnl/fsrtl/fastio.c b/reactos/ntoskrnl/fsrtl/fastio.c
index c5ee9139ac7..bd20e5a53ee 100644
--- a/reactos/ntoskrnl/fsrtl/fastio.c
+++ b/reactos/ntoskrnl/fsrtl/fastio.c
@@ -746,7 +746,7 @@ FsRtlGetFileSize(IN PFILE_OBJECT FileObject,
IoStackLocation->Parameters.QueryFile.FileInformationClass = FileStandardInformation;
/* Send the IRP to the related device object */
- Status = IofCallDriver(DeviceObject,Irp);
+ Status = IoCallDriver(DeviceObject,Irp);
/* Standard DDK IRP result processing */
if (Status == STATUS_PENDING)
diff --git a/reactos/ntoskrnl/include/internal/arm/mm.h b/reactos/ntoskrnl/include/internal/arm/mm.h
index d049a39523c..0631351a99a 100644
--- a/reactos/ntoskrnl/include/internal/arm/mm.h
+++ b/reactos/ntoskrnl/include/internal/arm/mm.h
@@ -7,6 +7,12 @@
#define PDE_SHIFT 20
#define PDE_SIZE (1 << PDE_SHIFT)
+
+//
+// FIXFIX: This is all wrong now!!!
+//
+
+
//
// Number of bits corresponding to the area that a coarse page table entry represents (4KB)
//
@@ -19,6 +25,11 @@
#define CPT_SHIFT 10
#define CPT_SIZE (1 << CPT_SHIFT)
+
+
+//
+// FIXFIX: This is all wrong now!!!
+//
typedef union _ARM_PTE
{
union
@@ -143,6 +154,11 @@ typedef enum _ARM_DOMAIN
ManagerDomain
} ARM_DOMAIN;
+
+//
+// FIXFIX: This is all wrong now!!!
+//
+
//
// Take 0x80812345 and extract:
// PTE_BASE[0x808][0x12]
@@ -153,7 +169,7 @@ typedef enum _ARM_DOMAIN
((((ULONG)(x) >> 12) & 0xFF) << 2))
#define MiGetPdeAddress(x) \
- (PMMPTE)(PDE_BASE + \
+ (PMMPDE_HARDWARE)(PDE_BASE + \
(((ULONG)(x) >> 20) << 2))
#define MiGetPdeOffset(x) (((ULONG)(x)) >> 22)
@@ -165,4 +181,36 @@ typedef enum _ARM_DOMAIN
struct _EPROCESS;
PULONG MmGetPageDirectory(VOID);
+
+//
+// FIXME: THESE ARE WRONG ATM.
+//
+#define MiAddressToPde(x) \
+((PMMPTE)(((((ULONG)(x)) >> 22) << 2) + PDE_BASE))
+#define MiAddressToPte(x) \
+((PMMPTE)(((((ULONG)(x)) >> 12) << 2) + PTE_BASE))
+#define MiAddressToPteOffset(x) \
+((((ULONG)(x)) << 10) >> 22)
+
+//
+// Convert a PTE into a corresponding address
+//
+#define MiPteToAddress(PTE) ((PVOID)((ULONG)(PTE) << 10))
+
+#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE))
+#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE)))
+#define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE)
+
+#define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.NonGlobal = 1)
+#define MI_MAKE_DIRTY_PAGE(x)
+#define MI_PAGE_DISABLE_CACHE(x) ((x)->u.Hard.Cached = 0)
+#define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.Buffered = 0)
+#define MI_PAGE_WRITE_COMBINED(x) ((x)->u.Hard.Buffered = 1)
+#define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.ExtendedAccess == 0)
+#define MI_IS_PAGE_COPY_ON_WRITE(x)FALSE
+#define MI_IS_PAGE_DIRTY(x) TRUE
+
+/* Easy accessing PFN in PTE */
+#define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)
+
#endif
diff --git a/reactos/ntoskrnl/include/internal/cc.h b/reactos/ntoskrnl/include/internal/cc.h
index f04e1979406..a2d769b646a 100644
--- a/reactos/ntoskrnl/include/internal/cc.h
+++ b/reactos/ntoskrnl/include/internal/cc.h
@@ -297,6 +297,21 @@ CcRosRequestCacheSegment(
CACHE_SEGMENT **CacheSeg
);
+NTSTATUS
+NTAPI
+CcRosInitializeFileCache(
+ PFILE_OBJECT FileObject,
+ ULONG CacheSegmentSize,
+ PCACHE_MANAGER_CALLBACKS CallBacks,
+ PVOID LazyWriterContext
+);
+
+NTSTATUS
+NTAPI
+CcRosReleaseFileCache(
+ PFILE_OBJECT FileObject
+);
+
NTSTATUS
NTAPI
CcTryToInitializeFileCache(PFILE_OBJECT FileObject);
diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h
index e39a129fd42..45f79909e4f 100644
--- a/reactos/ntoskrnl/include/internal/ex.h
+++ b/reactos/ntoskrnl/include/internal/ex.h
@@ -574,8 +574,8 @@ ExInsertFastReference(IN OUT PEX_FAST_REF FastRef,
return TRUE;
}
-BOOLEAN
FORCEINLINE
+BOOLEAN
ExReleaseFastReference(IN PEX_FAST_REF FastRef,
IN PVOID Object)
{
@@ -609,8 +609,8 @@ ExReleaseFastReference(IN PEX_FAST_REF FastRef,
return TRUE;
}
-EX_FAST_REF
FORCEINLINE
+EX_FAST_REF
ExSwapFastReference(IN PEX_FAST_REF FastRef,
IN PVOID Object)
{
@@ -636,8 +636,8 @@ ExSwapFastReference(IN PEX_FAST_REF FastRef,
return OldValue;
}
-EX_FAST_REF
FORCEINLINE
+EX_FAST_REF
ExCompareSwapFastReference(IN PEX_FAST_REF FastRef,
IN PVOID Object,
IN PVOID OldObject)
diff --git a/reactos/ntoskrnl/include/internal/i386/mm.h b/reactos/ntoskrnl/include/internal/i386/mm.h
index 67a4ddff817..80da0c48ed4 100644
--- a/reactos/ntoskrnl/include/internal/i386/mm.h
+++ b/reactos/ntoskrnl/include/internal/i386/mm.h
@@ -15,6 +15,10 @@ PULONG MmGetPageDirectory(VOID);
#define PAGETABLE_MAP (0xc0000000)
#define PAGEDIRECTORY_MAP (0xc0000000 + (PAGETABLE_MAP / (1024)))
+#define PTE_BASE 0xC0000000
+#define PDE_BASE 0xC0300000
+#define HYPER_SPACE 0xC0400000
+
/* Converting address to a corresponding PDE or PTE entry */
#define MiAddressToPde(x) \
((PMMPTE)(((((ULONG)(x)) >> 22) << 2) + PAGEDIRECTORY_MAP))
@@ -23,6 +27,11 @@ PULONG MmGetPageDirectory(VOID);
#define MiAddressToPteOffset(x) \
((((ULONG)(x)) << 10) >> 22)
+//
+// Convert a PTE into a corresponding address
+//
+#define MiPteToAddress(PTE) ((PVOID)((ULONG)(PTE) << 10))
+
#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE))
#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE)))
#define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE)
@@ -30,4 +39,13 @@ PULONG MmGetPageDirectory(VOID);
/* Easy accessing PFN in PTE */
#define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)
+#define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.Global = 0)
+#define MI_MAKE_DIRTY_PAGE(x) ((x)->u.Hard.Dirty = 1)
+#define MI_PAGE_DISABLE_CACHE(x) ((x)->u.Hard.CacheDisable = 1)
+#define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.WriteThrough = 1)
+#define MI_PAGE_WRITE_COMBINED(x) ((x)->u.Hard.WriteThrough = 0)
+#define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.Write == 1)
+#define MI_IS_PAGE_COPY_ON_WRITE(x)((x)->u.Hard.CopyOnWrite == 1)
+#define MI_IS_PAGE_DIRTY(x) ((x)->u.Hard.Dirty == 1)
+
#endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H */
diff --git a/reactos/ntoskrnl/include/internal/kd.h b/reactos/ntoskrnl/include/internal/kd.h
index bc88f5eec03..3002bad4189 100644
--- a/reactos/ntoskrnl/include/internal/kd.h
+++ b/reactos/ntoskrnl/include/internal/kd.h
@@ -342,7 +342,8 @@ typedef enum _KDP_DEBUG_SERVICE
KdSpare1 = 0x23, /* h */
KdSpare2 = 0x17, /* i */
KdSpare3 = 0x24, /* j */
- EnterDebugger = 0x25 /* k */
+ EnterDebugger = 0x25, /* k */
+ ThatsWhatSheSaid = 69 /* FIGURE IT OUT */
} KDP_DEBUG_SERVICE;
/* Dispatch Table for Wrapper Functions */
diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h
index f0791d27c55..4ece2123b33 100644
--- a/reactos/ntoskrnl/include/internal/ke.h
+++ b/reactos/ntoskrnl/include/internal/ke.h
@@ -790,6 +790,7 @@ KeTrapFrameToContext(
IN OUT PCONTEXT Context
);
+DECLSPEC_NORETURN
VOID
NTAPI
KeBugCheckWithTf(
diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h
index 1172afd43a3..eaea19e5db2 100644
--- a/reactos/ntoskrnl/include/internal/mm.h
+++ b/reactos/ntoskrnl/include/internal/mm.h
@@ -21,7 +21,6 @@ extern ULONG MmPagedPoolSize;
extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor;
extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg;
extern ULONG MmHighestPhysicalPage;
-extern PVOID MmPfnDatabase;
struct _KTRAP_FRAME;
struct _EPROCESS;
@@ -30,6 +29,8 @@ struct _MM_PAGEOP;
typedef ULONG SWAPENTRY;
typedef ULONG PFN_TYPE, *PPFN_TYPE;
+#define MI_STATIC_MEMORY_AREAS (8)
+
#define MEMORY_AREA_INVALID (0)
#define MEMORY_AREA_SECTION_VIEW (1)
#define MEMORY_AREA_CONTINUOUS_MEMORY (2)
@@ -44,6 +45,7 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE;
#define MEMORY_AREA_PAGED_POOL (12)
#define MEMORY_AREA_NO_ACCESS (13)
#define MEMORY_AREA_PEB_OR_TEB (14)
+#define MEMORY_AREA_STATIC (0x80000000)
#define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
@@ -59,9 +61,8 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE;
/* Number of list heads to use */
#define MI_FREE_POOL_LISTS 4
-#define HYPER_SPACE (0xC0400000)
-
#define MI_HYPERSPACE_PTES (256 - 1)
+#define MI_ZERO_PTES (32)
#define MI_MAPPING_RANGE_START (ULONG)HYPER_SPACE
#define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \
MI_HYPERSPACE_PTES * PAGE_SIZE)
@@ -103,7 +104,8 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE;
#define MC_USER (1)
#define MC_PPOOL (2)
#define MC_NPPOOL (3)
-#define MC_MAXIMUM (4)
+#define MC_SYSTEM (4)
+#define MC_MAXIMUM (5)
#define PAGED_POOL_MASK 1
#define MUST_SUCCEED_POOL_MASK 2
@@ -289,31 +291,76 @@ typedef struct
ULONG PagingRequestsInLastFifteenMinutes;
} MM_STATS;
-typedef struct _PHYSICAL_PAGE
+//
+// These two mappings are actually used by Windows itself, based on the ASSERTS
+//
+#define StartOfAllocation ReadInProgress
+#define EndOfAllocation WriteInProgress
+
+typedef struct _MMPFNENTRY
{
+ USHORT Modified:1;
+ USHORT ReadInProgress:1; // StartOfAllocation
+ USHORT WriteInProgress:1; // EndOfAllocation
+ USHORT PrototypePte:1; // Zero
+ USHORT PageColor:4; // LockCount
+ USHORT PageLocation:3; // Consumer
+ USHORT RemovalRequested:1;
+ USHORT CacheAttribute:2; // Type
+ USHORT Rom:1;
+ USHORT ParityError:1;
+} MMPFNENTRY;
+
+typedef struct _MMPFN
+{
+ union
+ {
+ PFN_NUMBER Flink; // ListEntry.Flink
+ ULONG WsIndex;
+ PKEVENT Event;
+ NTSTATUS ReadStatus;
+ SINGLE_LIST_ENTRY NextStackPfn;
+ } u1;
+ PMMPTE PteAddress; // ListEntry.Blink
+ union
+ {
+ PFN_NUMBER Blink;
+ ULONG_PTR ShareCount; // MapCount
+ } u2;
union
{
struct
{
- ULONG Type: 2;
- ULONG Consumer: 3;
- ULONG Zero: 1;
- ULONG StartOfAllocation: 1;
- ULONG EndOfAllocation: 1;
- }
- Flags;
- ULONG AllFlags;
+ USHORT ReferenceCount; // ReferenceCount
+ MMPFNENTRY e1;
+ };
+ struct
+ {
+ USHORT ReferenceCount;
+ USHORT ShortFlags;
+ } e2;
+ } u3;
+ union
+ {
+ MMPTE OriginalPte;
+ LONG AweReferenceCount; // RmapListHead
};
+ union
+ {
+ ULONG_PTR EntireFrame; // SavedSwapEntry
+ struct
+ {
+ ULONG_PTR PteFrame:25;
+ ULONG_PTR InPageError:1;
+ ULONG_PTR VerifierAllocation:1;
+ ULONG_PTR AweAllocation:1;
+ ULONG_PTR Priority:3;
+ ULONG_PTR MustBeCached:1;
+ };
+ } u4;
+} MMPFN, *PMMPFN;
- LIST_ENTRY ListEntry;
- ULONG ReferenceCount;
- SWAPENTRY SavedSwapEntry;
- ULONG LockCount;
- ULONG MapCount;
- struct _MM_RMAP_ENTRY* RmapListHead;
-}
-PHYSICAL_PAGE, *PPHYSICAL_PAGE;
-
+extern PMMPFN MmPfnDatabase;
extern MM_STATS MmStats;
typedef struct _MM_PAGEOP
@@ -991,24 +1038,23 @@ MmPageOutPhysicalAddress(PFN_TYPE Page);
/* freelist.c **********************************************************/
-#define ASSERT_PFN(x) ASSERT((x)->Flags.Type != 0)
+#define ASSERT_PFN(x) ASSERT((x)->u3.e1.CacheAttribute != 0)
FORCEINLINE
-PPHYSICAL_PAGE
+PMMPFN
MiGetPfnEntry(IN PFN_TYPE Pfn)
{
- PPHYSICAL_PAGE Page;
- extern PPHYSICAL_PAGE MmPageArray;
- extern ULONG MmPageArraySize;
-
- /* Mark MmPageArraySize as unreferenced, otherwise it will appear as an unused variable on a Release build */
- UNREFERENCED_PARAMETER(MmPageArraySize);
+ PMMPFN Page;
+ extern RTL_BITMAP MiPfnBitMap;
/* Make sure the PFN number is valid */
- ASSERT(Pfn <= MmPageArraySize);
+ if (Pfn > MmHighestPhysicalPage) return NULL;
+
+ /* Make sure this page actually has a PFN entry */
+ if ((MiPfnBitMap.Buffer) && !(RtlTestBit(&MiPfnBitMap, Pfn))) return NULL;
/* Get the entry */
- Page = &MmPageArray[Pfn];
+ Page = &MmPfnDatabase[Pfn];
/* Make sure it's valid */
ASSERT_PFN(Page);
@@ -1017,6 +1063,16 @@ MiGetPfnEntry(IN PFN_TYPE Pfn)
return Page;
};
+FORCEINLINE
+PFN_NUMBER
+MiGetPfnEntryIndex(IN PMMPFN Pfn1)
+{
+ //
+ // This will return the Page Frame Number (PFN) from the MMPFN
+ //
+ return Pfn1 - MmPfnDatabase;
+}
+
PFN_TYPE
NTAPI
MmGetLRUNextUserPage(PFN_TYPE PreviousPage);
@@ -1072,13 +1128,20 @@ MmInitializePageList(
VOID
);
+VOID
+NTAPI
+MmDumpPfnDatabase(
+ VOID
+);
+
PFN_TYPE
NTAPI
MmGetContinuousPages(
ULONG NumberOfBytes,
PHYSICAL_ADDRESS LowestAcceptableAddress,
PHYSICAL_ADDRESS HighestAcceptableAddress,
- PHYSICAL_ADDRESS BoundaryAddressMultiple
+ PHYSICAL_ADDRESS BoundaryAddressMultiple,
+ BOOLEAN ZeroPages
);
NTSTATUS
@@ -1106,19 +1169,33 @@ MiUnmapPageInHyperSpace(IN PEPROCESS Process,
PVOID
NTAPI
-MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page);
+MiMapPagesToZeroInHyperSpace(IN PMMPFN *Pages,
+ IN PFN_NUMBER NumberOfPages);
+
+VOID
+NTAPI
+MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress,
+ IN PFN_NUMBER NumberOfPages);
//
// ReactOS Compatibility Layer
//
-PVOID
FORCEINLINE
+PVOID
MmCreateHyperspaceMapping(IN PFN_NUMBER Page)
{
HyperProcess = (PEPROCESS)KeGetCurrentThread()->ApcState.Process;
return MiMapPageInHyperSpace(HyperProcess, Page, &HyperIrql);
}
+FORCEINLINE
+PVOID
+MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page)
+{
+ PMMPFN Pfn1 = MiGetPfnEntry(Page);
+ return MiMapPagesToZeroInHyperSpace(&Pfn1, 1);
+}
+
#define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
/* i386/page.c *********************************************************/
@@ -1278,16 +1355,6 @@ BOOLEAN
NTAPI
MmIsPageInUse(PFN_TYPE Page);
-VOID
-NTAPI
-MmSetFlagsPage(
- PFN_TYPE Page,
- ULONG Flags);
-
-ULONG
-NTAPI
-MmGetFlagsPage(PFN_TYPE Page);
-
VOID
NTAPI
MmSetSavedSwapEntryPage(
diff --git a/reactos/ntoskrnl/include/internal/ntoskrnl.h b/reactos/ntoskrnl/include/internal/ntoskrnl.h
index 916eb261dab..72a55660fc5 100644
--- a/reactos/ntoskrnl/include/internal/ntoskrnl.h
+++ b/reactos/ntoskrnl/include/internal/ntoskrnl.h
@@ -194,12 +194,11 @@ C_ASSERT(FIELD_OFFSET(KTHREAD, TrapFrame) == KTHREAD_TRAP_FRAME);
C_ASSERT(FIELD_OFFSET(KTHREAD, CallbackStack) == KTHREAD_CALLBACK_STACK);
C_ASSERT(FIELD_OFFSET(KTHREAD, ApcState.Process) == KTHREAD_APCSTATE_PROCESS);
C_ASSERT(FIELD_OFFSET(KPROCESS, DirectoryTableBase) == KPROCESS_DIRECTORY_TABLE_BASE);
-C_ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST);
-
-C_ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF);
#endif
#ifdef _M_IX86
+C_ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST);
+C_ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF);
C_ASSERT(FIELD_OFFSET(KPCR, IRR) == KPCR_IRR);
C_ASSERT(FIELD_OFFSET(KPCR, IDR) == KPCR_IDR);
C_ASSERT(FIELD_OFFSET(KPCR, Irql) == KPCR_IRQL);
diff --git a/reactos/ntoskrnl/include/precomp.h b/reactos/ntoskrnl/include/precomp.h
index b6ebb0207d3..634ea9aa3fa 100644
--- a/reactos/ntoskrnl/include/precomp.h
+++ b/reactos/ntoskrnl/include/precomp.h
@@ -28,13 +28,9 @@
#define TEXT(s) L##s
#include
-/* FIXME: Temporary until CC Ros is gone */
-#include
+/* FIXME: Temporary until Winldr is used */
#include
-/* Disk Dump Driver Header */
-#include
-
/* C Headers */
#include
#include
diff --git a/reactos/ntoskrnl/kd/i386/kdmemsup.c b/reactos/ntoskrnl/kd/i386/kdmemsup.c
index d0d5fbe8092..ec0f7f0f83d 100644
--- a/reactos/ntoskrnl/kd/i386/kdmemsup.c
+++ b/reactos/ntoskrnl/kd/i386/kdmemsup.c
@@ -30,89 +30,6 @@
static BOOLEAN KdpPhysAccess = FALSE;
-#if 0
-extern ULONG MmGlobalKernelPageDirectory[1024];
-ULONG_PTR IdentityMapAddrHigh, IdentityMapAddrLow;
-
-ULONGLONG
-FASTCALL
-KdpPhysRead(ULONG_PTR Addr, LONG Len)
-{
- ULONGLONG Result = 0;
- ULONG_PTR OldCR3 = __readcr3(), OldCR4 = __readcr4();
-
- if (Addr & HIGH_PHYS_MASK)
- {
- Addr &= ~HIGH_PHYS_MASK;
- __writecr3(IdentityMapAddrHigh);
- }
- else
- __writecr3(IdentityMapAddrLow);
-
- __writecr4(OldCR4|CR4_PAGE_SIZE_BIT); // Turn on large page translation
- __invlpg((PVOID)Addr);
-
- switch (Len)
- {
- case 8:
- Result = *((PULONGLONG)Addr);
- break;
- case 4:
- Result = *((PULONG)Addr);
- break;
- case 2:
- Result = *((PUSHORT)Addr);
- break;
- case 1:
- Result = *((PUCHAR)Addr);
- break;
- }
- __writecr4(OldCR4); // Turn off large page translation
- __writecr3(OldCR3);
- __invlpg((PVOID)Addr);
-
- return Result;
-}
-
-VOID
-NTAPI
-KdpPhysWrite(ULONG_PTR Addr, LONG Len, ULONGLONG Value)
-{
- ULONG_PTR OldCR3 = __readcr3(), OldCR4 = __readcr4();
-
- if (Addr & HIGH_PHYS_MASK)
- {
- Addr &= ~HIGH_PHYS_MASK;
- __writecr3(IdentityMapAddrHigh);
- }
- else
- __writecr3(IdentityMapAddrLow);
-
- __writecr4(OldCR4|CR4_PAGE_SIZE_BIT); // Turn on large page translation
- __invlpg((PVOID)Addr);
-
- switch (Len)
- {
- case 8:
- *((PULONGLONG)Addr) = Value;
- break;
- case 4:
- *((PULONG)Addr) = Value;
- break;
- case 2:
- *((PUSHORT)Addr) = Value;
- break;
- case 1:
- *((PUCHAR)Addr) = Value;
- break;
- }
- __writecr4(OldCR4); // Turn off large page translation
- __writecr3(OldCR3);
- __invlpg((PVOID)Addr);
-}
-
-#else
-
static
ULONG_PTR
KdpPhysMap(ULONG_PTR PhysAddr, LONG Len)
@@ -194,7 +111,6 @@ KdpPhysWrite(ULONG_PTR PhysAddr, LONG Len, ULONGLONG Value)
break;
}
}
-#endif
BOOLEAN
NTAPI
@@ -291,60 +207,11 @@ KdpSafeWriteMemory(ULONG_PTR Addr, LONG Len, ULONGLONG Value)
return TRUE;
}
-#if 0
-VOID
-NTAPI
-KdpEnableSafeMem()
-{
- int i;
- PULONG IdentityMapVirt;
- PHYSICAL_ADDRESS IdentityMapPhys, Highest = { };
-
- if (KdpPhysAccess)
- return;
-
- Highest.LowPart = (ULONG)-1;
- /* Allocate a physical page and map it to copy the phys copy code onto */
- IdentityMapVirt = (PULONG)MmAllocateContiguousMemory(2 * PAGE_SIZE, Highest);
- IdentityMapPhys = MmGetPhysicalAddress(IdentityMapVirt);
- IdentityMapAddrHigh = IdentityMapPhys.LowPart;
-
- /* Copy the kernel space */
- memcpy(IdentityMapVirt,
- MmGlobalKernelPageDirectory,
- PAGE_SIZE);
-
- /* Set up 512 4Mb pages (high 2Gig identity mapped) */
- for (i = 0; i < 512; i++)
- {
- IdentityMapVirt[i] =
- HIGH_PHYS_MASK | (i << 22) | PDE_PS_BIT | PDE_W_BIT | PDE_PRESENT_BIT;
- }
-
- /* Allocate a physical page and map it to copy the phys copy code onto */
- IdentityMapAddrLow = IdentityMapAddrHigh + PAGE_SIZE;
- IdentityMapVirt += PAGE_SIZE / sizeof(ULONG);
-
- /* Copy the kernel space */
- memcpy(IdentityMapVirt,
- MmGlobalKernelPageDirectory,
- PAGE_SIZE);
-
- /* Set up 512 4Mb pages (low 2Gig identity mapped) */
- for (i = 0; i < 512; i++)
- {
- IdentityMapVirt[i] = (i << 22) | PDE_PS_BIT | PDE_W_BIT | PDE_PRESENT_BIT;
- }
-
- KdpPhysAccess = TRUE;
-}
-
-#else
-
VOID
NTAPI
KdpEnableSafeMem(VOID)
{
KdpPhysAccess = TRUE;
}
-#endif
+
+/* EOF */
diff --git a/reactos/ntoskrnl/kd/kdinit.c b/reactos/ntoskrnl/kd/kdinit.c
index 1633af11efd..aae380e922a 100644
--- a/reactos/ntoskrnl/kd/kdinit.c
+++ b/reactos/ntoskrnl/kd/kdinit.c
@@ -42,47 +42,6 @@ PKDP_INIT_ROUTINE InitRoutines[KdMax] = {KdpScreenInit,
/* PRIVATE FUNCTIONS *********************************************************/
-PCHAR
-NTAPI
-KdpGetWrapperDebugMode(PCHAR Currentp2,
- PLOADER_PARAMETER_BLOCK LoaderBlock)
-{
- PCHAR p2 = Currentp2;
-
- /* Check for GDB Debugging */
- if (!_strnicmp(p2, "GDB", 3))
- {
- /* Enable it */
- p2 += 3;
- KdpDebugMode.Gdb = TRUE;
-
- /* Enable Debugging */
- KdDebuggerEnabled = TRUE;
- KdDebuggerNotPresent = FALSE;
- WrapperInitRoutine = KdpGdbStubInit;
- }
-
- /* Check for PICE Debugging */
- else if (!_strnicmp(p2, "PICE", 4))
- {
- /* Enable it */
- p2 += 4;
- KdpDebugMode.Pice = TRUE;
-
- /* Enable Debugging */
- KdDebuggerEnabled = TRUE;
- KdDebuggerNotPresent = FALSE;
- }
-
-#ifdef KDBG
- /* Get the KDBG Settings and enable it */
- KdDebuggerEnabled = TRUE;
- KdDebuggerNotPresent = FALSE;
- KdbpGetCommandLineSettings(LoaderBlock->LoadOptions);
-#endif
- return p2;
-}
-
PCHAR
NTAPI
KdpGetDebugMode(PCHAR Currentp2)
@@ -129,6 +88,31 @@ KdpGetDebugMode(PCHAR Currentp2)
KdpDebugMode.Bochs = TRUE;
}
+ /* Check for GDB Debugging */
+ else if (!_strnicmp(p2, "GDB", 3))
+ {
+ /* Enable it */
+ p2 += 3;
+ KdpDebugMode.Gdb = TRUE;
+
+ /* Enable Debugging */
+ KdDebuggerEnabled = TRUE;
+ KdDebuggerNotPresent = FALSE;
+ WrapperInitRoutine = KdpGdbStubInit;
+ }
+
+ /* Check for PICE Debugging */
+ else if (!_strnicmp(p2, "PICE", 4))
+ {
+ /* Enable it */
+ p2 += 4;
+ KdpDebugMode.Pice = TRUE;
+
+ /* Enable Debugging */
+ KdDebuggerEnabled = TRUE;
+ KdDebuggerNotPresent = FALSE;
+ }
+
return p2;
}
@@ -179,7 +163,7 @@ KdInitSystem(ULONG BootPhase,
/* Upcase it */
_strupr(CommandLine);
- /* Check for settings that we support */
+ /* XXX Check for settings that we support */
if (strstr(CommandLine, "BREAK")) KdpEarlyBreak = TRUE;
if (strstr(CommandLine, "NODEBUG")) KdDebuggerEnabled = FALSE;
if (strstr(CommandLine, "CRASHDEBUG")) KdDebuggerEnabled = FALSE;
@@ -190,16 +174,23 @@ KdInitSystem(ULONG BootPhase,
KdpDebugMode.Serial = TRUE;
}
+#ifdef KDBG
+ /* Get the KDBG Settings and enable it */
+ KdDebuggerEnabled = TRUE;
+ KdDebuggerNotPresent = FALSE;
+ KdbpGetCommandLineSettings(LoaderBlock->LoadOptions);
+#endif
+
/* Get the port and baud rate */
Port = strstr(CommandLine, "DEBUGPORT");
BaudRate = strstr(CommandLine, "BAUDRATE");
Irq = strstr(CommandLine, "IRQ");
- /* Check if we got the /DEBUGPORT parameter */
- if (Port)
+ /* Check if we got the /DEBUGPORT parameter(s) */
+ while (Port)
{
/* Move past the actual string, to reach the port*/
- Port += strlen("DEBUGPORT");
+ Port += sizeof("DEBUGPORT") - 1;
/* Now get past any spaces and skip the equal sign */
while (*Port == ' ') Port++;
@@ -207,15 +198,14 @@ KdInitSystem(ULONG BootPhase,
/* Get the debug mode and wrapper */
Port = KdpGetDebugMode(Port);
- Port = KdpGetWrapperDebugMode(Port, LoaderBlock);
- KdDebuggerEnabled = TRUE;
+ Port = strstr(Port, "DEBUGPORT");
}
/* Check if we got a baud rate */
if (BaudRate)
{
/* Move past the actual string, to reach the rate */
- BaudRate += strlen("BAUDRATE");
+ BaudRate += sizeof("BAUDRATE") - 1;
/* Now get past any spaces */
while (*BaudRate == ' ') BaudRate++;
@@ -233,7 +223,7 @@ KdInitSystem(ULONG BootPhase,
if (Irq)
{
/* Move past the actual string, to reach the rate */
- Irq += strlen("IRQ");
+ Irq += sizeof("IRQ") - 1;
/* Now get past any spaces */
while (*Irq == ' ') Irq++;
@@ -257,7 +247,7 @@ KdInitSystem(ULONG BootPhase,
if (WrapperInitRoutine) WrapperInitRoutine(&WrapperTable, 0);
return TRUE;
}
- else
+ else /* BootPhase > 0 */
{
#ifdef _M_IX86
KdpEnableSafeMem();
@@ -271,4 +261,4 @@ KdInitSystem(ULONG BootPhase,
return TRUE;
}
- /* EOF */
+/* EOF */
diff --git a/reactos/ntoskrnl/kd/kdio.c b/reactos/ntoskrnl/kd/kdio.c
index a2fa6a0dc0f..6a520e49868 100644
--- a/reactos/ntoskrnl/kd/kdio.c
+++ b/reactos/ntoskrnl/kd/kdio.c
@@ -293,11 +293,11 @@ KdpPrintString(LPSTR String,
}
/* Call the Wrapper Routine */
- if (WrapperInitRoutine) WrapperTable.KdpPrintRoutine(String, Length);
+ if (WrapperTable.KdpPrintRoutine)
+ WrapperTable.KdpPrintRoutine(String, Length);
/* Return the Length */
return Length;
}
/* EOF */
-
diff --git a/reactos/ntoskrnl/kd/kdmain.c b/reactos/ntoskrnl/kd/kdmain.c
index 34795b62b89..698bc75dcfc 100644
--- a/reactos/ntoskrnl/kd/kdmain.c
+++ b/reactos/ntoskrnl/kd/kdmain.c
@@ -85,6 +85,10 @@ KdpServiceDispatcher(ULONG Service,
case EnterDebugger:
DbgBreakPoint();
break;
+
+ case ThatsWhatSheSaid:
+ MmDumpPfnDatabase();
+ break;
default:
break;
@@ -116,7 +120,7 @@ KdpEnterDebuggerException(IN PKTRAP_FRAME TrapFrame,
IN KPROCESSOR_MODE PreviousMode,
IN BOOLEAN SecondChance)
{
- KD_CONTINUE_TYPE Return;
+ KD_CONTINUE_TYPE Return = kdHandleException;
ULONG ExceptionCommand = ExceptionRecord->ExceptionInformation[0];
#ifdef _M_IX86
ULONG EipOld;
@@ -137,7 +141,13 @@ KdpEnterDebuggerException(IN PKTRAP_FRAME TrapFrame,
KdpServiceDispatcher(BREAKPOINT_PRINT,
(PVOID)ExceptionRecord->ExceptionInformation[1],
ExceptionRecord->ExceptionInformation[2]);
+#ifdef _M_IX86
Context->Eax = STATUS_SUCCESS;
+#elif _M_ARM
+ Context->R0 = STATUS_SUCCESS;
+#else
+#error Please be portable when modifying code
+#endif
}
else if (ExceptionCommand == BREAKPOINT_LOAD_SYMBOLS)
{
@@ -163,12 +173,22 @@ KdpEnterDebuggerException(IN PKTRAP_FRAME TrapFrame,
EipOld = Context->Eip;
#endif
+#ifdef KDBG
/* Call KDBG if available */
Return = KdbEnterDebuggerException(ExceptionRecord,
PreviousMode,
Context,
TrapFrame,
!SecondChance);
+#else /* not KDBG */
+ if (WrapperInitRoutine)
+ {
+ /* Call GDB */
+ Return = WrapperTable.KdpExceptionRoutine(ExceptionRecord,
+ Context,
+ TrapFrame);
+ }
+#endif /* not KDBG */
/* Bump EIP over int 3 if debugger did not already change it */
if (ExceptionRecord->ExceptionCode == STATUS_BREAKPOINT)
diff --git a/reactos/ntoskrnl/kd/wrappers/gdbstub.c b/reactos/ntoskrnl/kd/wrappers/gdbstub.c
index eaa99022701..956197898a3 100644
--- a/reactos/ntoskrnl/kd/wrappers/gdbstub.c
+++ b/reactos/ntoskrnl/kd/wrappers/gdbstub.c
@@ -11,76 +11,17 @@
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
****************************************************************************/
-
/****************************************************************************
- * Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $
- *
- * Module name: remcom.c $
- * Revision: 1.34 $
- * Date: 91/03/09 12:29:49 $
* Contributor: Lake Stevens Instrument Division$
*
* Description: low level support for gdb debugger. $
*
- * Considerations: only works on target hardware $
- *
* Written by: Glenn Engel $
* ModuleState: Experimental $
*
- * NOTES: See Below $
- *
* Modified for 386 by Jim Kingdon, Cygnus Support.
* Modified for ReactOS by Casper S. Hornstrup
*
- * To enable debugger support, two things need to happen. One, setting
- * up a routine so that it is in the exception path, is necessary in order
- * to allow any breakpoints or error conditions to be properly intercepted
- * and reported to gdb.
- * Two, a breakpoint needs to be generated to begin communication.
- *
- * Because gdb will sometimes write to the stack area to execute function
- * calls, this program cannot rely on using the supervisor stack so it
- * uses it's own stack area.
- *
- *************
- *
- * The following gdb commands are supported:
- *
- * command function Return value
- *
- * g return the value of the CPU Registers hex data or ENN
- * G set the value of the CPU Registers OK or ENN
- *
- * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN
- * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN
- *
- * c Resume at current address SNN ( signal NN)
- * cAA..AA Continue at address AA..AA SNN
- *
- * s Step one instruction SNN
- * sAA..AA Step one instruction from AA..AA SNN
- *
- * k kill
- *
- * ? What was the last sigval ? SNN (signal NN)
- *
- * All commands and responses are sent with a packet which includes a
- * Checksum. A packet consists of
- *
- * $#.
- *
- * where
- * ::
- * :: < two hex digits computed as modulo 256 sum of >
- *
- * When a packet is received, it is first acknowledged with either '+' or '-'.
- * '+' indicates a successful transfer. '-' indicates a failed transfer.
- *
- * Example:
- *
- * Host: Reply:
- * $m0,10#2a +$00010203040506070809101112131415#42
- *
****************************************************************************/
#include
@@ -88,453 +29,376 @@
#include
/************************************************************************/
-/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
-/* at least NUMREGBYTES*2 are needed for register packets */
-#define BUFMAX 1000
static BOOLEAN GspInitialized;
-
static BOOLEAN GspRemoteDebug;
-static CONST CHAR HexChars[]="0123456789abcdef";
+static CONST CHAR HexChars[] = "0123456789abcdef";
-static PETHREAD GspRunThread; /* NULL means run all threads */
+static PETHREAD GspRunThread; /* NULL means run all threads */
static PETHREAD GspDbgThread;
static PETHREAD GspEnumThread;
static FAST_MUTEX GspLock;
extern LIST_ENTRY PsActiveProcessHead;
-KD_PORT_INFORMATION GdbPortInfo = { 2, 115200, 0 }; /* FIXME hardcoded for COM2, 115200 baud */
+
+/* FIXME hardcoded for COM2, 115200 baud */
+KD_PORT_INFORMATION GdbPortInfo = { 2, 115200, 0 };
+
+static CHAR GspInBuffer[1000];
+static CHAR GspOutBuffer[1000];
/* Number of Registers. */
#define NUMREGS 16
enum REGISTER_NAMES
{
- EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI,
- PC /* also known as eip */,
- PS /* also known as eflags */,
- CS, SS, DS, ES, FS, GS
+ EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI,
+ PC /* also known as eip */ ,
+ PS /* also known as eflags */ ,
+ CS, SS, DS, ES, FS, GS
};
typedef struct _CPU_REGISTER
{
- ULONG Size;
- ULONG OffsetInTF;
- ULONG OffsetInContext;
- BOOLEAN SetInContext;
+ ULONG Size;
+ ULONG OffsetInTF;
+ ULONG OffsetInContext;
+ BOOLEAN SetInContext;
} CPU_REGISTER, *PCPU_REGISTER;
static CPU_REGISTER GspRegisters[NUMREGS] =
{
- { 4, FIELD_OFFSET(KTRAP_FRAME, Eax), FIELD_OFFSET(CONTEXT, Eax), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, Ecx), FIELD_OFFSET(CONTEXT, Ecx), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, Edx), FIELD_OFFSET(CONTEXT, Edx), FALSE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, Ebx), FIELD_OFFSET(CONTEXT, Ebx), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp ), FIELD_OFFSET(CONTEXT, Esp), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, DbgEbp), FIELD_OFFSET(CONTEXT, Ebp), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, Esi), FIELD_OFFSET(CONTEXT, Esi), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, Edi), FIELD_OFFSET(CONTEXT, Edi), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, DbgEip), FIELD_OFFSET(CONTEXT, Eip), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, EFlags), FIELD_OFFSET(CONTEXT, EFlags), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, SegCs), FIELD_OFFSET(CONTEXT, SegCs), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, HardwareSegSs), FIELD_OFFSET(CONTEXT, SegSs), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, SegDs), FIELD_OFFSET(CONTEXT, SegDs), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, SegEs), FIELD_OFFSET(CONTEXT, SegEs), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, SegFs), FIELD_OFFSET(CONTEXT, SegFs), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, SegGs), FIELD_OFFSET(CONTEXT, SegGs), TRUE }
+ { 4, FIELD_OFFSET(KTRAP_FRAME, Eax), FIELD_OFFSET(CONTEXT, Eax), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, Ecx), FIELD_OFFSET(CONTEXT, Ecx), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, Edx), FIELD_OFFSET(CONTEXT, Edx), FALSE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, Ebx), FIELD_OFFSET(CONTEXT, Ebx), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp), FIELD_OFFSET(CONTEXT, Esp), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, DbgEbp), FIELD_OFFSET(CONTEXT, Ebp), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, Esi), FIELD_OFFSET(CONTEXT, Esi), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, Edi), FIELD_OFFSET(CONTEXT, Edi), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, DbgEip), FIELD_OFFSET(CONTEXT, Eip), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, EFlags), FIELD_OFFSET(CONTEXT, EFlags), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, SegCs), FIELD_OFFSET(CONTEXT, SegCs), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, HardwareSegSs), FIELD_OFFSET(CONTEXT, SegSs), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, SegDs), FIELD_OFFSET(CONTEXT, SegDs), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, SegEs), FIELD_OFFSET(CONTEXT, SegEs), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, SegFs), FIELD_OFFSET(CONTEXT, SegFs), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, SegGs), FIELD_OFFSET(CONTEXT, SegGs), TRUE }
};
-static PCHAR GspThreadStates[DeferredReady+1] =
+static PCHAR GspThreadStates[DeferredReady + 1] =
{
- "Initialized",
- "Ready",
- "Running",
- "Standby",
- "Terminated",
- "Waiting",
- "Transition",
- "DeferredReady"
+ "Initialized",
+ "Ready",
+ "Running",
+ "Standby",
+ "Terminated",
+ "Waiting",
+ "Transition",
+ "DeferredReady"
};
-
LONG
HexValue(CHAR ch)
{
- if ((ch >= '0') && (ch <= '9'))
- {
- return (ch - '0');
- }
- if ((ch >= 'a') && (ch <= 'f'))
- {
- return (ch - 'a' + 10);
- }
- if ((ch >= 'A') && (ch <= 'F'))
- {
- return (ch - 'A' + 10);
- }
+ if ((ch >= '0') && (ch <= '9'))
+ return (ch - '0');
- return -1;
+ if ((ch >= 'a') && (ch <= 'f'))
+ return (ch - 'a' + 10);
+
+ if ((ch >= 'A') && (ch <= 'F'))
+ return (ch - 'A' + 10);
+
+ return -1;
}
-static CHAR GspInBuffer[BUFMAX];
-static CHAR GspOutBuffer[BUFMAX];
-
VOID
GdbPutChar(UCHAR Value)
{
- KdPortPutByteEx(&GdbPortInfo, Value);
+ KdPortPutByteEx(&GdbPortInfo, Value);
}
UCHAR
GdbGetChar(VOID)
{
- UCHAR Value;
+ UCHAR Value;
- while (!KdPortGetByteEx(&GdbPortInfo, &Value))
- ;
+ while (!KdPortGetByteEx(&GdbPortInfo, &Value))
+ ;
- return Value;
+ return Value;
}
-/* scan for the sequence $# */
-
+/* scan for the sequence $# */
PCHAR
GspGetPacket()
{
- PCHAR Buffer = &GspInBuffer[0];
- CHAR Checksum;
- CHAR XmitChecksum;
- ULONG Count;
- CHAR ch;
+ PCHAR Buffer = &GspInBuffer[0];
+ CHAR Checksum;
+ CHAR XmitChecksum;
+ ULONG Count;
+ CHAR ch;
- while (TRUE)
+ while (TRUE)
{
- /* wait around for the start character, ignore all other characters */
- while ((ch = GdbGetChar ()) != '$')
- ;
+ /* wait around for the start character, ignore all other characters */
+ while ((ch = GdbGetChar()) != '$')
+ ;
- retry:
- Checksum = 0;
- XmitChecksum = -1;
- Count = 0;
+retry:
+ Checksum = 0;
+ XmitChecksum = -1;
+ Count = 0;
- /* now, read until a # or end of Buffer is found */
- while (Count < BUFMAX)
+ /* now, read until a # or end of Buffer is found */
+ while (Count < sizeof(GspInBuffer) - 1)
{
- ch = GdbGetChar();
- if (ch == '$')
- {
- goto retry;
- }
- if (ch == '#')
- {
- break;
- }
- Checksum = Checksum + ch;
- Buffer[Count] = ch;
- Count = Count + 1;
+ ch = GdbGetChar();
+ if (ch == '$')
+ goto retry;
+
+ if (ch == '#')
+ break;
+
+ Checksum = Checksum + ch;
+ Buffer[Count] = ch;
+ Count = Count + 1;
}
- Buffer[Count] = 0;
+ Buffer[Count] = 0;
- if (ch == '#')
+ if (ch == '#')
{
- ch = GdbGetChar();
- XmitChecksum = (CHAR)(HexValue(ch) << 4);
- ch = GdbGetChar();
- XmitChecksum += (CHAR)(HexValue(ch));
+ ch = GdbGetChar();
+ XmitChecksum = (CHAR)(HexValue(ch) << 4);
+ ch = GdbGetChar();
+ XmitChecksum += (CHAR)(HexValue(ch));
- if (Checksum != XmitChecksum)
+ if (Checksum != XmitChecksum)
{
- GdbPutChar('-'); /* failed checksum */
+ GdbPutChar('-'); /* failed checksum */
}
- else
+ else
{
- GdbPutChar('+'); /* successful transfer */
-
- return &Buffer[0];
+ GdbPutChar('+'); /* successful transfer */
+ return &Buffer[0];
}
}
}
}
-/* send the packet in Buffer. */
-
+/* send the packet in Buffer. */
VOID
GspPutPacket(PCHAR Buffer)
{
- CHAR Checksum;
- LONG Count;
- CHAR ch;
+ CHAR Checksum;
+ LONG Count;
+ CHAR ch;
- /* $#. */
- do
+ /* $#. */
+ do
{
- GdbPutChar('$');
- Checksum = 0;
- Count = 0;
+ GdbPutChar('$');
+ Checksum = 0;
+ Count = 0;
- while ((ch = Buffer[Count]))
+ while ((ch = Buffer[Count]))
{
- GdbPutChar(ch);
- Checksum += ch;
- Count += 1;
+ GdbPutChar(ch);
+ Checksum += ch;
+ Count += 1;
}
- GdbPutChar('#');
- GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
- GdbPutChar(HexChars[Checksum & 0xf]);
+ GdbPutChar('#');
+ GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
+ GdbPutChar(HexChars[Checksum & 0xf]);
}
- while (GdbGetChar() != '+');
+ while (GdbGetChar() != '+');
}
-
VOID
GspPutPacketNoWait(PCHAR Buffer)
{
- CHAR Checksum;
- LONG Count;
- CHAR ch;
+ CHAR Checksum;
+ LONG Count;
+ CHAR ch;
- /* $#. */
- GdbPutChar('$');
- Checksum = 0;
- Count = 0;
+ /* $#. */
+ GdbPutChar('$');
+ Checksum = 0;
+ Count = 0;
- while ((ch = Buffer[Count]))
+ while ((ch = Buffer[Count]))
{
- GdbPutChar(ch);
- Checksum += ch;
- Count += 1;
+ GdbPutChar(ch);
+ Checksum += ch;
+ Count += 1;
}
- GdbPutChar('#');
- GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
- GdbPutChar(HexChars[Checksum & 0xf]);
+ GdbPutChar('#');
+ GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
+ GdbPutChar(HexChars[Checksum & 0xf]);
}
-/* Indicate to caller of GspMem2Hex or GspHex2Mem that there has been an
- error. */
+/* Indicate to caller of GspMem2Hex or GspHex2Mem that there has been an error. */
static volatile BOOLEAN GspMemoryError = FALSE;
-static volatile void *GspAccessLocation = NULL;
static CHAR
GspReadMemSafe(PCHAR Address)
{
- CHAR ch;
- KdpSafeReadMemory((ULONG_PTR)Address, 1, &ch);
+ CHAR ch = 0;
+
+ if (!KdpSafeReadMemory((ULONG_PTR)Address, 1, &ch))
+ GspMemoryError = TRUE;
+
return ch;
}
-/* Convert the memory pointed to by Address into hex, placing result in Buffer */
-/* Return a pointer to the last char put in Buffer (null) */
-/* If MayFault is TRUE, then we should set GspMemoryError in response to
- a fault; if FALSE treat a fault like any other fault in the stub. */
-static PCHAR
-GspMem2Hex(PCHAR Address,
- PCHAR Buffer,
- LONG Count,
- BOOLEAN MayFault)
+static void
+GspWriteMemSafe(PCHAR Address, CHAR Ch)
{
- ULONG i;
- CHAR ch;
+ if (!KdpSafeWriteMemory((ULONG_PTR)Address, 1, Ch))
+ GspMemoryError = TRUE;
+}
- for (i = 0; i < (ULONG) Count; i++)
+/* Convert the memory pointed to by Address into hex, placing result in Buffer
+ * Return a pointer to the last char put in Buffer (null)
+ * If MayFault is TRUE, then we should set GspMemoryError in response to
+ * a fault; if FALSE treat a fault like any other fault in the stub.
+ */
+static PCHAR
+GspMem2Hex(PCHAR Address, PCHAR Buffer, LONG Count, BOOLEAN MayFault)
+{
+ ULONG i;
+ CHAR ch;
+
+ for (i = 0; i < (ULONG)Count; i++)
{
- if (MayFault)
+ if (MayFault)
{
- ch = GspReadMemSafe(Address);
- if (GspMemoryError)
- {
- return Buffer;
- }
+ ch = GspReadMemSafe(Address);
+ if (GspMemoryError)
+ return Buffer;
}
- else
+ else
{
- ch = *Address;
+ ch = *Address;
}
- *Buffer++ = HexChars[(ch >> 4) & 0xf];
- *Buffer++ = HexChars[ch & 0xf];
- Address++;
+ *Buffer++ = HexChars[(ch >> 4) & 0xf];
+ *Buffer++ = HexChars[ch & 0xf];
+ Address++;
}
- *Buffer = 0;
- return Buffer;
+ *Buffer = 0;
+ return Buffer;
}
static ULONG
-GspWriteMem(PCHAR Address,
- ULONG Count,
- BOOLEAN MayFault,
- CHAR (*GetContent)(PVOID Context, ULONG Offset),
- PVOID Context)
+GspWriteMem(PCHAR Address, ULONG Count, BOOLEAN MayFault,
+ CHAR (*GetContent)(PVOID Context, ULONG Offset), PVOID Context)
{
- PCHAR Current;
- PCHAR Page;
- ULONG CountInPage;
- ULONG i;
- CHAR ch;
- ULONG OldProt = 0;
+ PCHAR Current;
+ PCHAR Page;
+ ULONG CountInPage;
+ ULONG i;
+ CHAR ch;
- Current = Address;
- while (Current < Address + Count)
+ Current = Address;
+ while (Current < Address + Count)
{
- Page = (PCHAR)PAGE_ROUND_DOWN(Current);
- if (Address + Count <= Page + PAGE_SIZE)
+ Page = (PCHAR)PAGE_ROUND_DOWN(Current);
+ if (Address + Count <= Page + PAGE_SIZE)
{
- /* Fits in this page */
- CountInPage = Count;
+ /* Fits in this page */
+ CountInPage = Count;
}
- else
+ else
{
- /* Flows into next page, handle only current page in this iteration */
- CountInPage = PAGE_SIZE - (Address - Page);
- }
- if (MayFault)
- {
- OldProt = MmGetPageProtect(NULL, Address);
- MmSetPageProtect(NULL, Address, PAGE_EXECUTE_READWRITE);
+ /* Flows into next page, handle only current page in this iteration */
+ CountInPage = PAGE_SIZE - (Address - Page);
}
- for (i = 0; i < CountInPage && ! GspMemoryError; i++)
+ for (i = 0; i < CountInPage && !GspMemoryError; i++)
{
- ch = (*GetContent)(Context, Current - Address);
+ ch = (*GetContent)(Context, Current - Address);
- if (MayFault)
- {
- GspAccessLocation = Current;
- }
- *Current = ch;
- if (MayFault)
- {
- GspAccessLocation = NULL;
- }
- Current++;
+ if (MayFault)
+ GspWriteMemSafe(Current, ch);
+ else
+ *Current = ch;
+
+ Current++;
}
- if (MayFault)
+ if (MayFault)
{
- MmSetPageProtect(NULL, Page, OldProt);
- if (GspMemoryError)
- {
- return Current - Address;
- }
+ if (GspMemoryError)
+ return Current - Address;
}
}
- return Current - Address;
+ return Current - Address;
}
static CHAR
GspHex2MemGetContent(PVOID Context, ULONG Offset)
{
- return (CHAR)((HexValue(*((PCHAR) Context + 2 * Offset)) << 4) +
- HexValue(*((PCHAR) Context + 2 * Offset + 1)));
+ return (CHAR)((HexValue(*((PCHAR)Context + 2 * Offset)) << 4) +
+ HexValue(*((PCHAR)Context + 2 * Offset + 1)));
}
-/* Convert the hex array pointed to by Buffer into binary to be placed at Address */
-/* Return a pointer to the character AFTER the last byte read from Buffer */
+/* Convert the hex array pointed to by Buffer into binary to be placed at Address
+ * Return a pointer to the character AFTER the last byte read from Buffer */
static PCHAR
-GspHex2Mem(PCHAR Buffer,
- PCHAR Address,
- ULONG Count,
- BOOLEAN MayFault)
+GspHex2Mem(PCHAR Buffer, PCHAR Address, ULONG Count, BOOLEAN MayFault)
{
- Count = GspWriteMem(Address, Count, MayFault, GspHex2MemGetContent, Buffer);
-
- return Buffer + 2 * Count;
+ Count = GspWriteMem(Address, Count, MayFault, GspHex2MemGetContent, Buffer);
+ return Buffer + 2 * Count;
}
-static void
-GspWriteMemSafe(PCHAR Address,
- CHAR Ch)
-{
- KdpSafeWriteMemory((ULONG_PTR)Address, 1, Ch);
-}
-
-
-/* This function takes the 386 exception vector and attempts to
- translate this number into a unix compatible signal value */
-ULONG
-GspComputeSignal(NTSTATUS ExceptionCode)
-{
- ULONG SigVal;
-
- switch (ExceptionCode)
- {
- case STATUS_INTEGER_DIVIDE_BY_ZERO:
- SigVal = 8; /* divide by zero */
- break;
- case STATUS_SINGLE_STEP:
- case STATUS_BREAKPOINT:
- SigVal = 5; /* breakpoint */
- break;
- case STATUS_INTEGER_OVERFLOW:
- case STATUS_ARRAY_BOUNDS_EXCEEDED:
- SigVal = 16; /* bound instruction */
- break;
- case STATUS_ILLEGAL_INSTRUCTION:
- SigVal = 4; /* Invalid opcode */
- break;
- case STATUS_STACK_OVERFLOW:
- case STATUS_DATATYPE_MISALIGNMENT:
- case STATUS_ACCESS_VIOLATION:
- SigVal = 11; /* access violation */
- break;
- default:
- SigVal = 7; /* "software generated" */
- }
- return SigVal;
-}
-
-
/**********************************************/
/* WHILE WE FIND NICE HEX CHARS, BUILD A LONG */
/* RETURN NUMBER OF CHARS PROCESSED */
/**********************************************/
LONG
-GspHex2Long(PCHAR *Address,
- PLONG Value)
+GspHex2Long(PCHAR *Address, PLONG Value)
{
- LONG NumChars = 0;
- LONG Hex;
+ LONG NumChars = 0;
+ LONG Hex;
- *Value = 0;
+ *Value = 0;
- while (**Address)
+ while (**Address)
{
- Hex = HexValue(**Address);
- if (Hex >= 0)
+ Hex = HexValue(**Address);
+ if (Hex >= 0)
{
- *Value = (*Value << 4) | Hex;
- NumChars++;
+ *Value = (*Value << 4) | Hex;
+ NumChars++;
}
- else
+ else
{
- break;
+ break;
}
- (*Address)++;
+ (*Address)++;
}
- return NumChars;
+ return NumChars;
}
-
VOID
-GspLong2Hex(PCHAR *Address,
- LONG Value)
+GspLong2Hex(PCHAR *Address, LONG Value)
{
- LONG Save;
+ LONG Save;
- Save = (((Value >> 0) & 0xff) << 24) |
- (((Value >> 8) & 0xff) << 16) |
- (((Value >> 16) & 0xff) << 8) |
- (((Value >> 24) & 0xff) << 0);
- *Address = GspMem2Hex((PCHAR) &Save, *Address, 4, FALSE);
+ Save = (((Value >> 0) & 0xff) << 24) | (((Value >> 8) & 0xff) << 16) |
+ (((Value >> 16) & 0xff) << 8) | (((Value >> 24) & 0xff) << 0);
+
+ *Address = GspMem2Hex((PCHAR)&Save, *Address, 4, FALSE);
}
-
/*
* When coming from kernel mode, Esp is not stored in the trap frame.
* Instead, it was pointing to the location of the TrapFrame Esp member
@@ -544,436 +408,428 @@ GspLong2Hex(PCHAR *Address,
static LONG
GspGetEspFromTrapFrame(PKTRAP_FRAME TrapFrame)
{
- return KeGetPreviousMode() == KernelMode
- ? (LONG) &TrapFrame->HardwareEsp : (LONG)TrapFrame->HardwareEsp;
+ return KeGetPreviousMode() == KernelMode ?
+ (LONG)&TrapFrame->HardwareEsp : (LONG)TrapFrame->HardwareEsp;
}
-
static VOID
-GspGetRegisters(PCHAR Address,
- PKTRAP_FRAME TrapFrame)
+GspGetRegisters(PCHAR Address, PKTRAP_FRAME TrapFrame)
{
- ULONG_PTR Value;
- PULONG p;
- ULONG i;
- PETHREAD Thread;
- ULONG_PTR *KernelStack;
+ ULONG_PTR Value;
+ PULONG p;
+ ULONG i;
+ PETHREAD Thread;
+ ULONG_PTR *KernelStack;
- if (NULL == GspDbgThread)
+ if (NULL == GspDbgThread)
{
- Thread = PsGetCurrentThread();
+ Thread = PsGetCurrentThread();
}
- else
+ else
{
- TrapFrame = GspDbgThread->Tcb.TrapFrame;
- Thread = GspDbgThread;
+ TrapFrame = GspDbgThread->Tcb.TrapFrame;
+ Thread = GspDbgThread;
}
- if (Waiting == Thread->Tcb.State)
+ if (Waiting == Thread->Tcb.State)
{
- KernelStack = Thread->Tcb.KernelStack;
- for (i = 0; i < sizeof(GspRegisters) / sizeof(GspRegisters[0]); i++)
+ KernelStack = Thread->Tcb.KernelStack;
+ for (i = 0; i < sizeof(GspRegisters) / sizeof(GspRegisters[0]); i++)
{
- switch(i)
+ switch (i)
+ {
+ case EBP:
+ Value = KernelStack[3];
+ break;
+ case EDI:
+ Value = KernelStack[4];
+ break;
+ case ESI:
+ Value = KernelStack[5];
+ break;
+ case EBX:
+ Value = KernelStack[6];
+ break;
+ case PC:
+ Value = KernelStack[7];
+ break;
+ case ESP:
+ Value = (ULONG_PTR)(KernelStack + 8);
+ break;
+ case CS:
+ Value = KGDT_R0_CODE;
+ break;
+ case DS:
+ Value = KGDT_R0_DATA;
+ break;
+ default:
+ Value = 0;
+ break;
+ }
+
+ Address = GspMem2Hex((PCHAR)&Value, Address, GspRegisters[i].Size, FALSE);
+ }
+ }
+ else
+ {
+ for (i = 0; i < sizeof(GspRegisters) / sizeof(GspRegisters[0]); i++)
+ {
+ if (TrapFrame)
+ {
+ if (ESP == i)
+ {
+ Value = GspGetEspFromTrapFrame(TrapFrame);
+ }
+ else
+ {
+ p = (PULONG)((ULONG_PTR)TrapFrame + GspRegisters[i].OffsetInTF);
+ Value = *p;
+ }
+ }
+ else if (i == PC)
+ {
+ /*
+ * This thread has not been sheduled yet so assume it
+ * is still in PsBeginThreadWithContextInternal().
+ */
+ Value = (ULONG)KiThreadStartup;
+ }
+ else
{
- case EBP:
- Value = KernelStack[3];
- break;
- case EDI:
- Value = KernelStack[4];
- break;
- case ESI:
- Value = KernelStack[5];
- break;
- case EBX:
- Value = KernelStack[6];
- break;
- case PC:
- Value = KernelStack[7];
- break;
- case ESP:
- Value = (ULONG_PTR) (KernelStack + 8);
- break;
- case CS:
- Value = KGDT_R0_CODE;
- break;
- case DS:
- Value = KGDT_R0_DATA;
- break;
- default:
Value = 0;
- break;
}
- Address = GspMem2Hex((PCHAR) &Value, Address, GspRegisters[i].Size,
- FALSE);
- }
- }
- else
- {
- for (i = 0; i < sizeof(GspRegisters) / sizeof(GspRegisters[0]); i++)
- {
- if (TrapFrame)
- {
- if (ESP == i)
- {
- Value = GspGetEspFromTrapFrame(TrapFrame);
- }
- else
- {
- p = (PULONG)((ULONG_PTR) TrapFrame +
- GspRegisters[i].OffsetInTF);
- Value = *p;
- }
- }
- else if (i == PC)
- {
- /*
- * This thread has not been sheduled yet so assume it
- * is still in PsBeginThreadWithContextInternal().
- */
- Value = (ULONG)KiThreadStartup;
- }
- else
- {
- Value = 0;
- }
- Address = GspMem2Hex((PCHAR) &Value, Address,
- GspRegisters[i].Size, FALSE);
+
+ Address = GspMem2Hex((PCHAR)&Value, Address, GspRegisters[i].Size, FALSE);
}
}
}
-
VOID
-GspSetRegistersInTrapFrame(PCHAR Address,
- PCONTEXT Context,
- PKTRAP_FRAME TrapFrame)
+GspSetRegistersInTrapFrame(PCHAR Address, PCONTEXT Context, PKTRAP_FRAME TrapFrame)
{
- ULONG Value;
- PCHAR Buffer;
- PULONG p;
- ULONG i;
+ ULONG Value;
+ PCHAR Buffer;
+ PULONG p;
+ ULONG i;
- if (!TrapFrame)
- {
- return;
- }
+ if (!TrapFrame)
+ return;
- Buffer = Address;
- for (i = 0; i < NUMREGS; i++)
+ Buffer = Address;
+ for (i = 0; i < NUMREGS; i++)
{
- if (GspRegisters[i].SetInContext)
+ if (GspRegisters[i].SetInContext)
{
- p = (PULONG) ((ULONG_PTR) Context + GspRegisters[i].OffsetInContext);
+ p = (PULONG)((ULONG_PTR)Context + GspRegisters[i].OffsetInContext);
}
- else
+ else
{
- p = (PULONG) ((ULONG_PTR) TrapFrame + GspRegisters[i].OffsetInTF);
+ p = (PULONG)((ULONG_PTR)TrapFrame + GspRegisters[i].OffsetInTF);
}
- Value = 0;
- Buffer = GspHex2Mem(Buffer, (PCHAR) &Value, GspRegisters[i].Size, FALSE);
- *p = Value;
+
+ Value = 0;
+ Buffer = GspHex2Mem(Buffer, (PCHAR)&Value, GspRegisters[i].Size, FALSE);
+ *p = Value;
}
}
-
VOID
-GspSetSingleRegisterInTrapFrame(PCHAR Address,
- LONG Number,
- PCONTEXT Context,
- PKTRAP_FRAME TrapFrame)
+GspSetSingleRegisterInTrapFrame(PCHAR Address, LONG Number, PCONTEXT Context, PKTRAP_FRAME TrapFrame)
{
- ULONG Value;
- PULONG p;
+ ULONG Value;
+ PULONG p;
- if (!TrapFrame)
+ if (!TrapFrame)
+ return;
+
+ if (GspRegisters[Number].SetInContext)
{
- return;
+ p = (PULONG)((ULONG_PTR)Context + GspRegisters[Number].OffsetInContext);
+ }
+ else
+ {
+ p = (PULONG)((ULONG_PTR)TrapFrame + GspRegisters[Number].OffsetInTF);
}
- if (GspRegisters[Number].SetInContext)
- {
- p = (PULONG) ((ULONG_PTR) Context + GspRegisters[Number].OffsetInContext);
- }
- else
- {
- p = (PULONG) ((ULONG_PTR) TrapFrame + GspRegisters[Number].OffsetInTF);
- }
- Value = 0;
- GspHex2Mem(Address, (PCHAR) &Value, GspRegisters[Number].Size, FALSE);
- *p = Value;
+ Value = 0;
+ GspHex2Mem(Address, (PCHAR)&Value, GspRegisters[Number].Size, FALSE);
+ *p = Value;
}
-
BOOLEAN
-GspFindThread(PCHAR Data,
- PETHREAD *Thread)
+GspFindThread(PCHAR Data, PETHREAD *Thread)
{
- PETHREAD ThreadInfo = NULL;
+ PETHREAD ThreadInfo = NULL;
- if (strcmp (Data, "-1") == 0)
+ if (strcmp(Data, "-1") == 0)
{
- /* All threads */
- ThreadInfo = NULL;
+ /* All threads */
+ ThreadInfo = NULL;
}
- else
+ else
{
- ULONG uThreadId;
- HANDLE ThreadId;
- PCHAR ptr = &Data[0];
+ ULONG uThreadId;
+ HANDLE ThreadId;
+ PCHAR ptr = &Data[0];
- GspHex2Long(&ptr, (PLONG) &uThreadId);
- ThreadId = (HANDLE)uThreadId;
+ GspHex2Long(&ptr, (PLONG)&uThreadId);
+ ThreadId = (HANDLE)uThreadId;
- if (!NT_SUCCESS(PsLookupThreadByThreadId(ThreadId, &ThreadInfo)))
+ if (!NT_SUCCESS(PsLookupThreadByThreadId(ThreadId, &ThreadInfo)))
{
- *Thread = NULL;
- return FALSE;
+ *Thread = NULL;
+ return FALSE;
}
}
- *Thread = ThreadInfo;
- return TRUE;
-}
+ *Thread = ThreadInfo;
+ return TRUE;
+}
VOID
GspSetThread(PCHAR Request)
{
- PETHREAD ThreadInfo;
- PCHAR ptr = &Request[1];
+ PETHREAD ThreadInfo;
+ PCHAR ptr = &Request[1];
- switch (Request[0])
- {
- case 'c': /* Run thread */
- if (GspFindThread(ptr, &ThreadInfo))
- {
- GspOutBuffer[0] = 'O';
- GspOutBuffer[1] = 'K';
+ switch (Request[0])
+ {
+ case 'c': /* Run thread */
+ if (GspFindThread(ptr, &ThreadInfo))
+ {
+ GspOutBuffer[0] = 'O';
+ GspOutBuffer[1] = 'K';
- if (NULL != GspRunThread)
- {
- ObDereferenceObject(GspRunThread);
- }
- GspRunThread = ThreadInfo;
- if (NULL != GspRunThread)
- {
- ObReferenceObject(GspRunThread);
- }
- }
- else
- {
- GspOutBuffer[0] = 'E';
- }
- break;
- case 'g': /* Debug thread */
- if (GspFindThread(ptr, &ThreadInfo))
- {
- GspOutBuffer[0] = 'O';
- GspOutBuffer[1] = 'K';
+ if (NULL != GspRunThread)
+ ObDereferenceObject(GspRunThread);
- if (NULL != GspDbgThread)
- {
- ObDereferenceObject(GspDbgThread);
- }
+ GspRunThread = ThreadInfo;
- if (ThreadInfo == PsGetCurrentThread())
- {
- GspDbgThread = NULL;
- ObDereferenceObject(ThreadInfo);
+ if (NULL != GspRunThread)
+ ObReferenceObject(GspRunThread);
}
- else
+ else
{
- GspDbgThread = ThreadInfo;
+ GspOutBuffer[0] = 'E';
}
- }
- else
- {
- GspOutBuffer[0] = 'E';
- }
- break;
- default:
- break;
- }
+ break;
+
+ case 'g': /* Debug thread */
+ if (GspFindThread(ptr, &ThreadInfo))
+ {
+ GspOutBuffer[0] = 'O';
+ GspOutBuffer[1] = 'K';
+
+ if (NULL != GspDbgThread)
+ ObDereferenceObject(GspDbgThread);
+
+ if (ThreadInfo == PsGetCurrentThread())
+ {
+ GspDbgThread = NULL;
+ ObDereferenceObject(ThreadInfo);
+ }
+ else
+ {
+ GspDbgThread = ThreadInfo;
+ }
+ }
+ else
+ {
+ GspOutBuffer[0] = 'E';
+ }
+ break;
+
+ default:
+ break;
+ }
}
-
VOID
GspQuery(PCHAR Request)
{
- ULONG Value;
+ ULONG Value;
- if (strncmp(Request, "C", 1) == 0)
+ if (strncmp(Request, "C", 1) == 0)
{
- PCHAR ptr = &GspOutBuffer[2];
+ PCHAR ptr = &GspOutBuffer[2];
- /* Get current thread id */
- GspOutBuffer[0] = 'Q';
- GspOutBuffer[1] = 'C';
- if (NULL != GspDbgThread)
- {
- Value = (ULONG) GspDbgThread->Cid.UniqueThread;
- }
- else
- {
- Value = (ULONG) PsGetCurrentThread()->Cid.UniqueThread;
- }
- GspLong2Hex(&ptr, Value);
+ /* Get current thread id */
+ GspOutBuffer[0] = 'Q';
+ GspOutBuffer[1] = 'C';
+
+ if (NULL != GspDbgThread)
+ Value = (ULONG)GspDbgThread->Cid.UniqueThread;
+ else
+ Value = (ULONG)PsGetCurrentThread()->Cid.UniqueThread;
+
+ GspLong2Hex(&ptr, Value);
}
- else if (strncmp(Request, "fThreadInfo", 11) == 0)
+ else if (strncmp(Request, "fThreadInfo", 11) == 0)
{
- PEPROCESS Process;
- PLIST_ENTRY AThread, AProcess;
- PCHAR ptr = &GspOutBuffer[1];
+ PEPROCESS Process;
+ PLIST_ENTRY AThread, AProcess;
+ PCHAR ptr = &GspOutBuffer[1];
- /* Get first thread id */
- GspEnumThread = NULL;
- AProcess = PsActiveProcessHead.Flink;
- while(AProcess != &PsActiveProcessHead)
+ /* Get first thread id */
+ GspEnumThread = NULL;
+ AProcess = PsActiveProcessHead.Flink;
+ while (AProcess != &PsActiveProcessHead)
{
- Process = CONTAINING_RECORD(AProcess, EPROCESS, ActiveProcessLinks);
- AThread = Process->ThreadListHead.Flink;
- if (AThread != &Process->ThreadListHead)
+ Process = CONTAINING_RECORD(AProcess, EPROCESS, ActiveProcessLinks);
+ AThread = Process->ThreadListHead.Flink;
+ if (AThread != &Process->ThreadListHead)
{
- GspEnumThread = CONTAINING_RECORD(Process->ThreadListHead.Flink,
- ETHREAD, ThreadListEntry);
- break;
+ GspEnumThread = CONTAINING_RECORD(Process->ThreadListHead.Flink,
+ ETHREAD, ThreadListEntry);
+ break;
}
- AProcess = AProcess->Flink;
+ AProcess = AProcess->Flink;
}
- if(GspEnumThread != NULL)
+ if (GspEnumThread != NULL)
{
- GspOutBuffer[0] = 'm';
- Value = (ULONG) GspEnumThread->Cid.UniqueThread;
- GspLong2Hex(&ptr, Value);
+ GspOutBuffer[0] = 'm';
+ Value = (ULONG)GspEnumThread->Cid.UniqueThread;
+ GspLong2Hex(&ptr, Value);
}
- else
+ else
{
- /* FIXME - what to do here? This case should never happen though, there
- should always be at least one thread on the system... */
- /* GspOutBuffer[0] = 'l'; */
+ /* FIXME - what to do here? This case should never happen though, there
+ should always be at least one thread on the system... */
+ /* GspOutBuffer[0] = 'l'; */
}
}
- else if (strncmp(Request, "sThreadInfo", 11) == 0)
+ else if (strncmp(Request, "sThreadInfo", 11) == 0)
{
- PEPROCESS Process;
- PLIST_ENTRY AThread, AProcess;
- PCHAR ptr = &GspOutBuffer[1];
+ PEPROCESS Process;
+ PLIST_ENTRY AThread, AProcess;
+ PCHAR ptr = &GspOutBuffer[1];
- /* Get next thread id */
- if (GspEnumThread != NULL)
+ /* Get next thread id */
+ if (GspEnumThread != NULL)
{
- /* find the next thread */
- Process = GspEnumThread->ThreadsProcess;
- if(GspEnumThread->ThreadListEntry.Flink != &Process->ThreadListHead)
+ /* find the next thread */
+ Process = GspEnumThread->ThreadsProcess;
+ if (GspEnumThread->ThreadListEntry.Flink != &Process->ThreadListHead)
{
- GspEnumThread = CONTAINING_RECORD(GspEnumThread->ThreadListEntry.Flink,
- ETHREAD, ThreadListEntry);
+ GspEnumThread = CONTAINING_RECORD(GspEnumThread->ThreadListEntry.Flink,
+ ETHREAD, ThreadListEntry);
}
- else
+ else
{
- PETHREAD Thread = NULL;
- AProcess = Process->ActiveProcessLinks.Flink;
- while(AProcess != &PsActiveProcessHead)
+ PETHREAD Thread = NULL;
+ AProcess = Process->ActiveProcessLinks.Flink;
+ while (AProcess != &PsActiveProcessHead)
{
- Process = CONTAINING_RECORD(AProcess, EPROCESS, ActiveProcessLinks);
- AThread = Process->ThreadListHead.Flink;
- if (AThread != &Process->ThreadListHead)
+ Process = CONTAINING_RECORD(AProcess, EPROCESS, ActiveProcessLinks);
+ AThread = Process->ThreadListHead.Flink;
+ if (AThread != &Process->ThreadListHead)
{
- Thread = CONTAINING_RECORD(Process->ThreadListHead.Flink,
- ETHREAD, ThreadListEntry);
- break;
+ Thread = CONTAINING_RECORD(Process->ThreadListHead.Flink,
+ ETHREAD, ThreadListEntry);
+ break;
}
- AProcess = AProcess->Flink;
+ AProcess = AProcess->Flink;
}
- GspEnumThread = Thread;
+ GspEnumThread = Thread;
}
- if (GspEnumThread != NULL)
+ if (GspEnumThread != NULL)
{
- /* return the ID */
- GspOutBuffer[0] = 'm';
- Value = (ULONG) GspEnumThread->Cid.UniqueThread;
- GspLong2Hex(&ptr, Value);
+ /* return the ID */
+ GspOutBuffer[0] = 'm';
+ Value = (ULONG)GspEnumThread->Cid.UniqueThread;
+ GspLong2Hex(&ptr, Value);
}
- else
+ else
{
- GspOutBuffer[0] = 'l';
+ GspOutBuffer[0] = 'l';
}
}
- else
+ else
{
- GspOutBuffer[0] = 'l';
+ GspOutBuffer[0] = 'l';
}
}
- else if (strncmp(Request, "ThreadExtraInfo", 15) == 0)
+ else if (strncmp(Request, "ThreadExtraInfo", 15) == 0)
{
- PETHREAD ThreadInfo;
+ PETHREAD ThreadInfo;
- /* Get thread information */
- if (GspFindThread(Request + 16, &ThreadInfo))
+ /* Get thread information */
+ if (GspFindThread(Request + 16, &ThreadInfo))
{
- char Buffer[64];
- PEPROCESS Proc;
+ char Buffer[64];
+ PEPROCESS Proc;
- Proc = (PEPROCESS) ThreadInfo->ThreadsProcess;
+ Proc = (PEPROCESS)ThreadInfo->ThreadsProcess;
- Buffer[0] = '\0';
- if (NULL != Proc )
- {
- sprintf(Buffer, "%s [%d:0x%x], ", Proc->ImageFileName,
- (int) Proc->UniqueProcessId,
- (int) ThreadInfo->Cid.UniqueThread);
- }
- strcpy(Buffer + strlen(Buffer),
- GspThreadStates[ThreadInfo->Tcb.State]);
+ Buffer[0] = '\0';
- ObDereferenceObject(ThreadInfo);
+ if (NULL != Proc)
+ sprintf(Buffer, "%s [%d:0x%x], ",
+ Proc->ImageFileName,
+ (int)Proc->UniqueProcessId,
+ (int)ThreadInfo->Cid.UniqueThread);
- GspMem2Hex(Buffer, &GspOutBuffer[0], strlen(Buffer), FALSE);
+ strcpy(Buffer + strlen(Buffer), GspThreadStates[ThreadInfo->Tcb.State]);
+
+ ObDereferenceObject(ThreadInfo);
+
+ GspMem2Hex(Buffer, &GspOutBuffer[0], strlen(Buffer), FALSE);
}
}
+ else if (strncmp(Request, "Supported", 9) == 0)
+ {
+ /* tell maximum incoming packet size */
+ sprintf(GspOutBuffer, "PacketSize=%u", sizeof(GspInBuffer) - 1);
+ }
+ else if (strncmp(Request, "Rcmd,", 5) == 0)
+ {
+ ;
+ }
}
VOID
GspQueryThreadStatus(PCHAR Request)
{
- PETHREAD ThreadInfo;
- PCHAR ptr = &Request[0];
+ PETHREAD ThreadInfo;
+ PCHAR ptr = &Request[0];
- if (GspFindThread(ptr, &ThreadInfo))
+ if (GspFindThread(ptr, &ThreadInfo))
{
- ObDereferenceObject(ThreadInfo);
+ ObDereferenceObject(ThreadInfo);
- GspOutBuffer[0] = 'O';
- GspOutBuffer[1] = 'K';
- GspOutBuffer[2] = '\0';
+ GspOutBuffer[0] = 'O';
+ GspOutBuffer[1] = 'K';
+ GspOutBuffer[2] = '\0';
}
- else
+ else
{
- GspOutBuffer[0] = 'E';
- GspOutBuffer[1] = '\0';
+ GspOutBuffer[0] = 'E';
+ GspOutBuffer[1] = '\0';
}
}
-#define DR7_L0 0x00000001 /* Local breakpoint 0 enable */
-#define DR7_G0 0x00000002 /* Global breakpoint 0 enable */
-#define DR7_L1 0x00000004 /* Local breakpoint 1 enable */
-#define DR7_G1 0x00000008 /* Global breakpoint 1 enable */
-#define DR7_L2 0x00000010 /* Local breakpoint 2 enable */
-#define DR7_G2 0x00000020 /* Global breakpoint 2 enable */
-#define DR7_L3 0x00000040 /* Local breakpoint 3 enable */
-#define DR7_G3 0x00000080 /* Global breakpoint 3 enable */
-#define DR7_LE 0x00000100 /* Local exact breakpoint enable (old) */
-#define DR7_GE 0x00000200 /* Global exact breakpoint enable (old) */
-#define DR7_GD 0x00002000 /* General detect enable */
-#define DR7_TYPE0_MASK 0x00030000 /* Breakpoint 0 condition */
-#define DR7_LEN0_MASK 0x000c0000 /* Breakpoint 0 length */
-#define DR7_TYPE1_MASK 0x00300000 /* Breakpoint 1 condition */
-#define DR7_LEN1_MASK 0x00c00000 /* Breakpoint 1 length */
-#define DR7_TYPE2_MASK 0x03000000 /* Breakpoint 2 condition */
-#define DR7_LEN2_MASK 0x0c000000 /* Breakpoint 2 length */
-#define DR7_TYPE3_MASK 0x30000000 /* Breakpoint 3 condition */
-#define DR7_LEN3_MASK 0xc0000000 /* Breakpoint 3 length */
+#define DR6_BS 0x00004000 /* Single step */
+
+#define DR7_L0 0x00000001 /* Local breakpoint 0 enable */
+#define DR7_G0 0x00000002 /* Global breakpoint 0 enable */
+#define DR7_L1 0x00000004 /* Local breakpoint 1 enable */
+#define DR7_G1 0x00000008 /* Global breakpoint 1 enable */
+#define DR7_L2 0x00000010 /* Local breakpoint 2 enable */
+#define DR7_G2 0x00000020 /* Global breakpoint 2 enable */
+#define DR7_L3 0x00000040 /* Local breakpoint 3 enable */
+#define DR7_G3 0x00000080 /* Global breakpoint 3 enable */
+#define DR7_LE 0x00000100 /* Local exact breakpoint enable (old) */
+#define DR7_GE 0x00000200 /* Global exact breakpoint enable (old) */
+#define DR7_GD 0x00002000 /* General detect enable */
+#define DR7_TYPE0_MASK 0x00030000 /* Breakpoint 0 condition */
+#define DR7_LEN0_MASK 0x000c0000 /* Breakpoint 0 length */
+#define DR7_TYPE1_MASK 0x00300000 /* Breakpoint 1 condition */
+#define DR7_LEN1_MASK 0x00c00000 /* Breakpoint 1 length */
+#define DR7_TYPE2_MASK 0x03000000 /* Breakpoint 2 condition */
+#define DR7_LEN2_MASK 0x0c000000 /* Breakpoint 2 length */
+#define DR7_TYPE3_MASK 0x30000000 /* Breakpoint 3 condition */
+#define DR7_LEN3_MASK 0xc0000000 /* Breakpoint 3 length */
#define DR7_GLOBAL_ENABLE(Bp) (2 << (2 * (Bp)))
#define DR7_TYPE(Bp, Type) ((Type) << (16 + 4 * (Bp)))
#define DR7_LEN(Bp, Len) ((Len) << (18 + 4 * (Bp)))
@@ -992,9 +848,9 @@ GspQueryThreadStatus(PCHAR Request)
typedef struct _GSPHWBREAKPOINT
{
- ULONG Type;
- ULONG_PTR Address;
- ULONG Length;
+ ULONG Type;
+ ULONG_PTR Address;
+ ULONG Length;
} GSPHWBREAKPOINT;
#define MAX_HW_BREAKPOINTS 4
@@ -1003,305 +859,346 @@ static GSPHWBREAKPOINT GspHwBreakpoints[MAX_HW_BREAKPOINTS];
typedef struct _GSPSWBREAKPOINT
{
- ULONG_PTR Address;
- CHAR PrevContent;
- BOOLEAN Active;
+ ULONG_PTR Address;
+ CHAR PrevContent;
+ BOOLEAN Active;
} GSPSWBREAKPOINT;
#define MAX_SW_BREAKPOINTS 64
static unsigned GspSwBreakpointCount = 0;
static GSPSWBREAKPOINT GspSwBreakpoints[MAX_SW_BREAKPOINTS];
-static CHAR GspSwBreakpointsInstructions[MAX_SW_BREAKPOINTS];
static void
GspSetHwBreakpoint(ULONG Type, ULONG_PTR Address, ULONG Length)
{
- DPRINT("GspSetHwBreakpoint(%lu, 0x%p, %lu)\n", Type, Address, Length);
+ DPRINT("GspSetHwBreakpoint(%lu, 0x%p, %lu)\n", Type, Address, Length);
- if (GDB_ZTYPE_READ_WATCHPOINT == Type)
+ if (GDB_ZTYPE_READ_WATCHPOINT == Type)
{
- DPRINT1("Read watchpoint not supported\n");
- strcpy(GspOutBuffer, "E22");
+ DPRINT1("Read watchpoint not supported\n");
+ strcpy(GspOutBuffer, "E22");
}
- else if (GDB_ZTYPE_HARDWARE_BREAKPOINT == Type && 1 != Length)
+ else if (GDB_ZTYPE_HARDWARE_BREAKPOINT == Type && 1 != Length)
{
- DPRINT1("Invalid length %lu for hardware breakpoint\n", Length);
- strcpy(GspOutBuffer, "E22");
+ DPRINT1("Invalid length %lu for hardware breakpoint\n", Length);
+ strcpy(GspOutBuffer, "E22");
}
- else if (1 != Length && 2 != Length && 4 != Length)
+ else if (1 != Length && 2 != Length && 4 != Length)
{
- DPRINT1("Invalid length %lu for GDB Z type %lu\n", Length, Type);
- strcpy(GspOutBuffer, "E22");
+ DPRINT1("Invalid length %lu for GDB Z type %lu\n", Length, Type);
+ strcpy(GspOutBuffer, "E22");
}
- else if (0 != (Address & (Length - 1)))
+ else if (0 != (Address & (Length - 1)))
{
- DPRINT1("Invalid alignment for address 0x%p and length %d\n",
- Address, Length);
- strcpy(GspOutBuffer, "E22");
+ DPRINT1("Invalid alignment for address 0x%p and length %d\n", Address, Length);
+ strcpy(GspOutBuffer, "E22");
}
- else if (MAX_HW_BREAKPOINTS == GspHwBreakpointCount)
+ else if (MAX_HW_BREAKPOINTS == GspHwBreakpointCount)
{
- DPRINT1("Trying to set too many hardware breakpoints\n");
- strcpy(GspOutBuffer, "E22");
+ DPRINT1("Trying to set too many hardware breakpoints\n");
+ strcpy(GspOutBuffer, "E22");
}
- else
+ else
{
- DPRINT("Stored at index %u\n", GspHwBreakpointCount);
- GspHwBreakpoints[GspHwBreakpointCount].Type = Type;
- GspHwBreakpoints[GspHwBreakpointCount].Address = Address;
- GspHwBreakpoints[GspHwBreakpointCount].Length = Length;
- GspHwBreakpointCount++;
- strcpy(GspOutBuffer, "OK");
+ DPRINT("Stored at index %u\n", GspHwBreakpointCount);
+ GspHwBreakpoints[GspHwBreakpointCount].Type = Type;
+ GspHwBreakpoints[GspHwBreakpointCount].Address = Address;
+ GspHwBreakpoints[GspHwBreakpointCount].Length = Length;
+ GspHwBreakpointCount++;
+ strcpy(GspOutBuffer, "OK");
}
}
static void
GspRemoveHwBreakpoint(ULONG Type, ULONG_PTR Address, ULONG Length)
{
- unsigned Index;
+ unsigned Index;
- DPRINT("GspRemoveHwBreakpoint(%lu, 0x%p, %lu)\n", Type, Address, Length);
- for (Index = 0; Index < GspHwBreakpointCount; Index++)
+ DPRINT("GspRemoveHwBreakpoint(%lu, 0x%p, %lu)\n", Type, Address, Length);
+ for (Index = 0; Index < GspHwBreakpointCount; Index++)
{
- if (GspHwBreakpoints[Index].Type == Type &&
- GspHwBreakpoints[Index].Address == Address &&
- GspHwBreakpoints[Index].Length == Length)
+ if (GspHwBreakpoints[Index].Type == Type &&
+ GspHwBreakpoints[Index].Address == Address &&
+ GspHwBreakpoints[Index].Length == Length)
{
- DPRINT("Found match at index %u\n", Index);
- if (Index + 1 < GspHwBreakpointCount)
- {
- memmove(GspHwBreakpoints + Index,
- GspHwBreakpoints + (Index + 1),
- (GspHwBreakpointCount - Index - 1) *
- sizeof(GSPHWBREAKPOINT));
- }
- GspHwBreakpointCount--;
- strcpy(GspOutBuffer, "OK");
- return;
+ DPRINT("Found match at index %u\n", Index);
+ if (Index + 1 < GspHwBreakpointCount)
+ memmove(GspHwBreakpoints + Index,
+ GspHwBreakpoints + (Index + 1),
+ (GspHwBreakpointCount - Index - 1) * sizeof(GSPHWBREAKPOINT));
+
+ GspHwBreakpointCount--;
+ strcpy(GspOutBuffer, "OK");
+ return;
}
}
- DPRINT1("Not found\n");
- strcpy(GspOutBuffer, "E22");
+ DPRINT1("Not found\n");
+ strcpy(GspOutBuffer, "E22");
+}
+
+static BOOLEAN
+GspFindSwBreakpoint(ULONG_PTR Address, PULONG PIndex)
+{
+ ULONG Index;
+
+ for (Index = 0; Index < GspSwBreakpointCount; Index++)
+ if (GspSwBreakpoints[Index].Address == Address)
+ {
+ if (PIndex)
+ *PIndex = Index;
+ return TRUE;
+ }
+
+ return FALSE;
}
static void
GspSetSwBreakpoint(ULONG_PTR Address)
{
- DPRINT("GspSetSwBreakpoint(0x%p)\n", Address);
+ DPRINT("GspSetSwBreakpoint(0x%p)\n", Address);
- if (MAX_SW_BREAKPOINTS == GspSwBreakpointCount)
+ if (MAX_SW_BREAKPOINTS == GspSwBreakpointCount)
{
- DPRINT1("Trying to set too many software breakpoints\n");
- strcpy(GspOutBuffer, "E22");
+ DPRINT1("Trying to set too many software breakpoints\n");
+ strcpy(GspOutBuffer, "E22");
+ return;
}
- else
+
+ if (GspFindSwBreakpoint(Address, NULL))
{
- unsigned Index;
-
- for (Index = 0; Index < GspSwBreakpointCount; Index++)
- {
- if (GspSwBreakpoints[Index].Address == Address)
- {
- strcpy(GspOutBuffer, "E22");
- return;
- }
- }
-
- DPRINT("Stored at index %u\n", GspSwBreakpointCount);
- GspSwBreakpoints[GspSwBreakpointCount].Address = Address;
- GspSwBreakpoints[GspSwBreakpointCount].Active = FALSE;
- GspSwBreakpointsInstructions[GspSwBreakpointCount] =
- GspReadMemSafe((PCHAR )Address);
- GspWriteMemSafe((PCHAR )Address, 0xCC);
- GspSwBreakpointCount++;
- strcpy(GspOutBuffer, "OK");
+ strcpy(GspOutBuffer, "E22");
+ return;
}
+
+ DPRINT("Stored at index %u\n", GspSwBreakpointCount);
+ GspSwBreakpoints[GspSwBreakpointCount].Address = Address;
+ GspSwBreakpoints[GspSwBreakpointCount].Active = FALSE;
+ GspSwBreakpointCount++;
+ strcpy(GspOutBuffer, "OK");
}
static void
GspRemoveSwBreakpoint(ULONG_PTR Address)
{
- unsigned Index;
+ ULONG Index;
- DPRINT("GspRemoveSwBreakpoint(0x%p)\n", Address);
- for (Index = 0; Index < GspSwBreakpointCount; Index++)
+ DPRINT("GspRemoveSwBreakpoint(0x%p)\n", Address);
+
+ if (GspFindSwBreakpoint(Address, &Index))
{
- if (GspSwBreakpoints[Index].Address == Address)
- {
- DPRINT("Found match at index %u\n", Index);
- ASSERT(! GspSwBreakpoints[Index].Active);
+ DPRINT("Found match at index %u\n", Index);
+ ASSERT(!GspSwBreakpoints[Index].Active);
- GspWriteMemSafe((PCHAR )Address,
- GspSwBreakpointsInstructions[Index]);
+ if (Index + 1 < GspSwBreakpointCount)
+ memmove(GspSwBreakpoints + Index,
+ GspSwBreakpoints + (Index + 1),
+ (GspSwBreakpointCount - Index - 1) * sizeof(GSPSWBREAKPOINT));
- if (Index + 1 < GspSwBreakpointCount)
- {
- memmove(GspSwBreakpoints + Index,
- GspSwBreakpoints + (Index + 1),
- (GspSwBreakpointCount - Index - 1) *
- sizeof(GSPSWBREAKPOINT));
- memmove(GspSwBreakpointsInstructions + Index,
- GspSwBreakpointsInstructions + (Index + 1),
- (GspSwBreakpointCount - Index - 1) * sizeof(CHAR));
- }
- GspSwBreakpointCount--;
- strcpy(GspOutBuffer, "OK");
- return;
- }
+ GspSwBreakpointCount--;
+ strcpy(GspOutBuffer, "OK");
+ return;
}
- DPRINT1("Not found\n");
- strcpy(GspOutBuffer, "E22");
+ DPRINT1("Not found\n");
+ strcpy(GspOutBuffer, "E22");
}
static void
-GspLoadHwBreakpoint(PKTRAP_FRAME TrapFrame,
- unsigned BpIndex,
- ULONG_PTR Address,
- ULONG Length,
- ULONG Type)
+GspLoadHwBreakpoint(PKTRAP_FRAME TrapFrame, unsigned BpIndex,
+ ULONG_PTR Address, ULONG Length, ULONG Type)
{
- DPRINT("GspLoadHwBreakpoint(0x%p, %d, 0x%p, %d)\n", TrapFrame, BpIndex,
- Address, Type);
+ DPRINT("GspLoadHwBreakpoint(0x%p, %d, 0x%p, %d)\n",
+ TrapFrame, BpIndex, Address, Type);
- /* Set the DR7_Gx bit to globally enable the breakpoint */
- TrapFrame->Dr7 |= DR7_GLOBAL_ENABLE(BpIndex) |
- DR7_LEN(BpIndex, Length) |
- DR7_TYPE(BpIndex, Type);
+ /* Set the DR7_Gx bit to globally enable the breakpoint */
+ TrapFrame->Dr7 |= DR7_GLOBAL_ENABLE(BpIndex) |
+ DR7_LEN(BpIndex, Length) |
+ DR7_TYPE(BpIndex, Type);
- switch (BpIndex)
+ switch (BpIndex)
{
- case 0:
- DPRINT("Setting DR0 to 0x%p\n", Address);
- TrapFrame->Dr0 = Address;
- break;
+ case 0:
+ DPRINT("Setting DR0 to 0x%p\n", Address);
+ TrapFrame->Dr0 = Address;
+ break;
- case 1:
- DPRINT("Setting DR1 to 0x%p\n", Address);
- TrapFrame->Dr1 = Address;
- break;
+ case 1:
+ DPRINT("Setting DR1 to 0x%p\n", Address);
+ TrapFrame->Dr1 = Address;
+ break;
- case 2:
- DPRINT("Setting DR2 to 0x%p\n", Address);
- TrapFrame->Dr2 = Address;
- break;
+ case 2:
+ DPRINT("Setting DR2 to 0x%p\n", Address);
+ TrapFrame->Dr2 = Address;
+ break;
- case 3:
- DPRINT("Setting DR3 to 0x%p\n", Address);
- TrapFrame->Dr3 = Address;
- break;
+ case 3:
+ DPRINT("Setting DR3 to 0x%p\n", Address);
+ TrapFrame->Dr3 = Address;
+ break;
}
}
+static void
+GspLoadSwBreakpoint(ULONG Index)
+{
+ GspMemoryError = FALSE;
+
+ GspSwBreakpoints[Index].PrevContent = GspReadMemSafe((PCHAR)GspSwBreakpoints[Index].Address);
+
+ if (!GspMemoryError)
+ GspWriteMemSafe((PCHAR)GspSwBreakpoints[Index].Address, I386_OPCODE_INT3);
+
+ GspSwBreakpoints[Index].Active = !GspMemoryError;
+
+ if (GspMemoryError)
+ DPRINT1("Failed to set software breakpoint at 0x%p\n", GspSwBreakpoints[Index].Address);
+ else
+ DPRINT("Successfully set software breakpoint at 0x%p\n", GspSwBreakpoints[Index].Address);
+}
+
static void
GspLoadBreakpoints(PKTRAP_FRAME TrapFrame)
{
- unsigned Index;
- ULONG i386Type;
+ unsigned Index;
+ ULONG i386Type;
- DPRINT("GspLoadBreakpoints\n");
- DPRINT("DR7 on entry: 0x%08x\n", TrapFrame->Dr7);
- /* Remove all breakpoints */
- TrapFrame->Dr7 &= ~(DR7_L0 | DR7_L1 | DR7_L2 | DR7_L3 |
- DR7_G0 | DR7_G1 | DR7_G2 | DR7_G3 |
- DR7_TYPE0_MASK | DR7_LEN0_MASK |
- DR7_TYPE1_MASK | DR7_LEN1_MASK |
- DR7_TYPE2_MASK | DR7_LEN2_MASK |
- DR7_TYPE3_MASK | DR7_LEN3_MASK);
+ DPRINT("GspLoadBreakpoints\n");
+ DPRINT("DR7 on entry: 0x%08x\n", TrapFrame->Dr7);
- for (Index = 0; Index < GspHwBreakpointCount; Index++)
+ /* Remove all breakpoints */
+ TrapFrame->Dr7 &= ~(DR7_L0 | DR7_L1 | DR7_L2 | DR7_L3 |
+ DR7_G0 | DR7_G1 | DR7_G2 | DR7_G3 |
+ DR7_TYPE0_MASK | DR7_LEN0_MASK |
+ DR7_TYPE1_MASK | DR7_LEN1_MASK |
+ DR7_TYPE2_MASK | DR7_LEN2_MASK |
+ DR7_TYPE3_MASK | DR7_LEN3_MASK);
+
+ for (Index = 0; Index < GspHwBreakpointCount; Index++)
{
- switch(GspHwBreakpoints[Index].Type)
+ switch (GspHwBreakpoints[Index].Type)
{
- case GDB_ZTYPE_HARDWARE_BREAKPOINT:
- i386Type = I386_BP_TYPE_EXECUTE;
- break;
- case GDB_ZTYPE_WRITE_WATCHPOINT:
- i386Type = I386_BP_TYPE_DATA_WRITE;
- break;
- case GDB_ZTYPE_ACCESS_WATCHPOINT:
- i386Type = I386_BP_TYPE_DATA_READWRITE;
- break;
- default:
- ASSERT(FALSE);
- i386Type = I386_BP_TYPE_EXECUTE;
- break;
+ case GDB_ZTYPE_HARDWARE_BREAKPOINT:
+ i386Type = I386_BP_TYPE_EXECUTE;
+ break;
+ case GDB_ZTYPE_WRITE_WATCHPOINT:
+ i386Type = I386_BP_TYPE_DATA_WRITE;
+ break;
+ case GDB_ZTYPE_ACCESS_WATCHPOINT:
+ i386Type = I386_BP_TYPE_DATA_READWRITE;
+ break;
+ default:
+ ASSERT(FALSE);
+ i386Type = I386_BP_TYPE_EXECUTE;
+ break;
}
- GspLoadHwBreakpoint(TrapFrame, Index, GspHwBreakpoints[Index].Address,
- GspHwBreakpoints[Index].Length - 1, i386Type);
+ GspLoadHwBreakpoint(TrapFrame, Index, GspHwBreakpoints[Index].Address,
+ GspHwBreakpoints[Index].Length - 1, i386Type);
}
- for (Index = 0; Index < GspSwBreakpointCount; Index++)
+ for (Index = 0; Index < GspSwBreakpointCount; Index++)
{
- if (GspHwBreakpointCount + Index < MAX_HW_BREAKPOINTS)
- {
- DPRINT("Implementing software interrupt using hardware register\n");
- GspLoadHwBreakpoint(TrapFrame, GspHwBreakpointCount + Index,
- GspSwBreakpoints[Index].Address, 0,
- I386_BP_TYPE_EXECUTE);
- GspSwBreakpoints[Index].Active = FALSE;
- }
- else
- {
- DPRINT("Using real software breakpoint\n");
- GspMemoryError = FALSE;
- GspSwBreakpoints[Index].PrevContent = GspReadMemSafe((PCHAR) GspSwBreakpoints[Index].Address);
- if (! GspMemoryError)
- {
- GspWriteMemSafe((PCHAR) GspSwBreakpoints[Index].Address, I386_OPCODE_INT3);
- }
- GspSwBreakpoints[Index].Active = ! GspMemoryError;
- if (GspMemoryError)
- {
- DPRINT1("Failed to set software breakpoint at 0x%p\n",
- GspSwBreakpoints[Index].Address);
- }
- else
- {
- DPRINT("Successfully set software breakpoint at 0x%p\n",
- GspSwBreakpoints[Index].Address);
- DPRINT1("Successfully set software breakpoint at 0x%p\n", GspSwBreakpoints[Index].Address);
- }
- }
+ DPRINT("Using real software breakpoint\n");
+ GspLoadSwBreakpoint(Index);
}
- DPRINT("Final DR7 value 0x%08x\n", TrapFrame->Dr7);
+ DPRINT("Final DR7 value 0x%08x\n", TrapFrame->Dr7);
}
static void
-GspUnloadBreakpoints(PKTRAP_FRAME TrapFrame)
+GspUnloadBreakpoints(void)
{
- unsigned Index;
+ unsigned Index;
- DPRINT("GspUnloadHwBreakpoints\n");
+ DPRINT("GspUnloadBreakpoints\n");
- for (Index = 0; Index < GspSwBreakpointCount; Index++)
+ /* Disable hardware debugging while we are inside the stub */
+ Ke386SetDr7(0);
+
+ for (Index = 0; Index < GspSwBreakpointCount; Index++)
{
- if (GspSwBreakpoints[Index].Active)
+ if (GspSwBreakpoints[Index].Active)
{
- GspMemoryError = FALSE;
- GspWriteMemSafe((PCHAR) GspSwBreakpoints[Index].Address,
- GspSwBreakpoints[Index].PrevContent);
- GspSwBreakpoints[Index].Active = FALSE;
- if (GspMemoryError)
+ GspMemoryError = FALSE;
+ GspWriteMemSafe((PCHAR)GspSwBreakpoints[Index].Address,
+ GspSwBreakpoints[Index].PrevContent);
+ GspSwBreakpoints[Index].Active = FALSE;
+ if (GspMemoryError)
{
- DPRINT1("Failed to remove software breakpoint from 0x%p\n",
- GspSwBreakpoints[Index].Address);
+ DPRINT1("Failed to remove software breakpoint from 0x%p\n",
+ GspSwBreakpoints[Index].Address);
}
- else
+ else
{
- DPRINT("Successfully removed software breakpoint from 0x%p\n",
- GspSwBreakpoints[Index].Address);
+ DPRINT("Successfully removed software breakpoint from 0x%p\n",
+ GspSwBreakpoints[Index].Address);
}
}
}
}
-static BOOLEAN gdb_attached_yet = FALSE;
+static void
+GspStopReply(NTSTATUS ExceptionCode, PKTRAP_FRAME TrapFrame)
+{
+ PCHAR ptr = GspOutBuffer;
+ ULONG SigVal;
+ LONG Esp;
+
+ switch (ExceptionCode)
+ {
+ case STATUS_INTEGER_DIVIDE_BY_ZERO:
+ SigVal = 8; /* divide by zero */
+ break;
+ case STATUS_SINGLE_STEP:
+ case STATUS_BREAKPOINT:
+ SigVal = 5; /* breakpoint */
+ break;
+ case STATUS_INTEGER_OVERFLOW:
+ case STATUS_ARRAY_BOUNDS_EXCEEDED:
+ SigVal = 16; /* bound instruction */
+ break;
+ case STATUS_ILLEGAL_INSTRUCTION:
+ SigVal = 4; /* Invalid opcode */
+ break;
+ case STATUS_STACK_OVERFLOW:
+ case STATUS_DATATYPE_MISALIGNMENT:
+ case STATUS_ACCESS_VIOLATION:
+ SigVal = 11; /* access violation */
+ break;
+ default:
+ SigVal = 7; /* "software generated" */
+ }
+
+ ptr = GspOutBuffer;
+
+ *ptr++ = 'T'; /* notify gdb with signo, PC, FP and SP */
+ *ptr++ = HexChars[(SigVal >> 4) & 0xf];
+ *ptr++ = HexChars[SigVal & 0xf];
+
+ *ptr++ = HexChars[ESP];
+ *ptr++ = ':';
+
+ Esp = GspGetEspFromTrapFrame(TrapFrame); /* SP */
+ ptr = GspMem2Hex((PCHAR)&Esp, ptr, 4, 0);
+ *ptr++ = ';';
+
+ *ptr++ = HexChars[EBP];
+ *ptr++ = ':';
+ ptr = GspMem2Hex((PCHAR)&TrapFrame->Ebp, ptr, 4, 0); /* FP */
+ *ptr++ = ';';
+
+ *ptr++ = HexChars[PC];
+ *ptr++ = ':';
+ ptr = GspMem2Hex((PCHAR)&TrapFrame->Eip, ptr, 4, 0); /* PC */
+ *ptr++ = ';';
+
+ *ptr = '\0';
+}
+
/*
- * This function does all command procesing for interfacing to gdb.
+ * This function does all command procesing for interfacing to GDB.
*/
KD_CONTINUE_TYPE
NTAPI
@@ -1309,421 +1206,342 @@ KdpGdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord,
PCONTEXT Context,
PKTRAP_FRAME TrapFrame)
{
- BOOLEAN Stepping;
- LONG Address;
- LONG Length;
- LONG SigVal = 0;
- LONG NewPC;
- PCHAR ptr;
+ static BOOLEAN GdbAttached = FALSE;
+ BOOLEAN Stepping = FALSE;
+ NTSTATUS ExceptionCode;
+ LONG Address;
+ LONG Length;
+ PCHAR ptr;
- /* FIXME: Stop on other CPUs too */
+ /* FIXME: Stop on other CPUs too */
- if (STATUS_ACCESS_VIOLATION == (NTSTATUS) ExceptionRecord->ExceptionCode &&
- NULL != GspAccessLocation &&
- (ULONG_PTR) GspAccessLocation ==
- (ULONG_PTR) ExceptionRecord->ExceptionInformation[1])
+ DPRINT("Thread %p entering stub\n", PsGetCurrentThread());
+ ExceptionCode = (NTSTATUS)ExceptionRecord->ExceptionCode;
+
+ /* Can only debug 1 thread at a time... */
+ ExAcquireFastMutex(&GspLock);
+ DPRINT("Thread %p acquired mutex\n", PsGetCurrentThread());
+
+ GspUnloadBreakpoints();
+
+ /* Make sure we're debugging the current thread. */
+ if (NULL != GspDbgThread)
{
- GspAccessLocation = NULL;
- GspMemoryError = TRUE;
- Context->Eip += 3;
+ DPRINT1("Internal error: entering stub with non-NULL GspDbgThread\n");
+ ObDereferenceObject(GspDbgThread);
+ GspDbgThread = NULL;
}
- else
+
+ if (GdbAttached)
{
- DPRINT("Thread %p entering stub\n", PsGetCurrentThread());
- /* Can only debug 1 thread at a time... */
- ExAcquireFastMutex(&GspLock);
- DPRINT("Thread %p acquired mutex\n", PsGetCurrentThread());
+ GspStopReply(ExceptionCode, TrapFrame);
+ GspPutPacket(GspOutBuffer);
+ // DbgPrint(">>> (%s) >>>\n", GspOutBuffer);
+ }
+ else
+ {
+ GdbAttached = TRUE;
+ }
- /* Disable hardware debugging while we are inside the stub */
- Ke386SetDr7(0);
- GspUnloadBreakpoints(TrapFrame);
+ while (TRUE)
+ {
+ /* Zero the buffer now so we don't have to worry about the terminating zero character */
+ memset(GspOutBuffer, 0, sizeof(GspOutBuffer));
+ ptr = GspGetPacket();
+ // DbgPrint("<<< (%s) <<<\n", ptr);
- /* Make sure we're debugging the current thread. */
- if (NULL != GspDbgThread)
+ switch (*ptr++)
{
- DPRINT1("Internal error: entering stub with non-NULL GspDbgThread\n");
- ObDereferenceObject(GspDbgThread);
- GspDbgThread = NULL;
- }
-
- /* ugly hack to avoid attempting to send status at the very
- * beginning, right when GDB is trying to query the stub */
- if (gdb_attached_yet)
- {
- LONG Esp;
-
- stop_reply:
- /* reply to host that an exception has occurred */
- SigVal = GspComputeSignal(ExceptionRecord->ExceptionCode);
-
- ptr = GspOutBuffer;
-
- *ptr++ = 'T'; /* notify gdb with signo, PC, FP and SP */
- *ptr++ = HexChars[(SigVal >> 4) & 0xf];
- *ptr++ = HexChars[SigVal & 0xf];
-
- *ptr++ = HexChars[ESP];
- *ptr++ = ':';
-
- Esp = GspGetEspFromTrapFrame(TrapFrame); /* SP */
- ptr = GspMem2Hex((PCHAR) &Esp, ptr, 4, 0);
- *ptr++ = ';';
-
- *ptr++ = HexChars[EBP];
- *ptr++ = ':';
- ptr = GspMem2Hex((PCHAR) &TrapFrame->Ebp, ptr, 4, 0); /* FP */
- *ptr++ = ';';
-
- *ptr++ = HexChars[PC];
- *ptr++ = ':';
- ptr = GspMem2Hex((PCHAR) &TrapFrame->Eip, ptr, 4, 0); /* PC */
- *ptr++ = ';';
-
- *ptr = '\0';
-
- GspPutPacket(&GspOutBuffer[0]);
- /* DPRINT("------- replied status: (%s) -------\n", GspOutBuffer); */
- }
- else
- {
- gdb_attached_yet = 1;
- }
-
- Stepping = FALSE;
-
- while (TRUE)
- {
- /* Zero the buffer now so we don't have to worry about the terminating zero character */
- memset(GspOutBuffer, 0, sizeof(GspInBuffer));
- ptr = GspGetPacket();
- /* DPRINT("------- Get (%s) command -------\n", ptr); */
-
- switch(*ptr++)
- {
case '?':
- /* a little hack to send more complete status information */
- goto stop_reply;
- GspOutBuffer[0] = 'S';
- GspOutBuffer[1] = HexChars[SigVal >> 4];
- GspOutBuffer[2] = HexChars[SigVal % 16];
- GspOutBuffer[3] = 0;
- break;
+ /* a little hack to send more complete status information */
+ GspStopReply(ExceptionCode, TrapFrame);
+ break;
+
case 'd':
- GspRemoteDebug = !GspRemoteDebug; /* toggle debug flag */
- break;
+ GspRemoteDebug = !GspRemoteDebug; /* toggle debug flag */
+ break;
+
case 'g': /* return the value of the CPU Registers */
- GspGetRegisters(GspOutBuffer, TrapFrame);
- break;
+ GspGetRegisters(GspOutBuffer, TrapFrame);
+ break;
+
case 'G': /* set the value of the CPU Registers - return OK */
- if (NULL != GspDbgThread)
- {
- GspSetRegistersInTrapFrame(ptr, Context, GspDbgThread->Tcb.TrapFrame);
- }
- else
- {
- GspSetRegistersInTrapFrame(ptr, Context, TrapFrame);
- }
- strcpy(GspOutBuffer, "OK");
- break;
+ if (NULL != GspDbgThread)
+ GspSetRegistersInTrapFrame(ptr, Context, GspDbgThread->Tcb.TrapFrame);
+ else
+ GspSetRegistersInTrapFrame(ptr, Context, TrapFrame);
+
+ strcpy(GspOutBuffer, "OK");
+ break;
+
case 'P': /* set the value of a single CPU register - return OK */
- {
+ {
LONG Register;
if ((GspHex2Long(&ptr, &Register)) && (*ptr++ == '='))
- {
+ {
if ((Register >= 0) && (Register < NUMREGS))
- {
+ {
if (GspDbgThread)
- {
- GspSetSingleRegisterInTrapFrame(ptr, Register,
- Context,
+ {
+ GspSetSingleRegisterInTrapFrame(ptr, Register, Context,
GspDbgThread->Tcb.TrapFrame);
- }
+ }
else
- {
- GspSetSingleRegisterInTrapFrame(ptr, Register,
- Context, TrapFrame);
- }
+ {
+ GspSetSingleRegisterInTrapFrame(ptr, Register, Context, TrapFrame);
+ }
strcpy(GspOutBuffer, "OK");
break;
- }
- }
+ }
+ }
strcpy(GspOutBuffer, "E01");
break;
- }
+ }
/* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
case 'm':
- /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */
- if (GspHex2Long(&ptr, &Address) &&
- *(ptr++) == ',' &&
- GspHex2Long(&ptr, &Length))
+ {
+ /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */
+ if (GspHex2Long(&ptr, &Address) && *(ptr++) == ',' && GspHex2Long(&ptr, &Length))
{
- PEPROCESS DbgProcess = NULL;
+ PEPROCESS DbgProcess = NULL;
- ptr = NULL;
- if (NULL != GspDbgThread &&
- PsGetCurrentProcess() != GspDbgThread->ThreadsProcess)
+ ptr = NULL;
+ if (NULL != GspDbgThread &&
+ PsGetCurrentProcess() != GspDbgThread->ThreadsProcess)
{
- DbgProcess = GspDbgThread->ThreadsProcess;
- KeAttachProcess(&DbgProcess->Pcb);
+ DbgProcess = GspDbgThread->ThreadsProcess;
+ KeAttachProcess(&DbgProcess->Pcb);
}
- GspMemoryError = FALSE;
- GspMem2Hex((PCHAR) Address, GspOutBuffer, Length, 1);
- if (NULL != DbgProcess)
+
+ GspMemoryError = FALSE;
+ GspMem2Hex((PCHAR)Address, GspOutBuffer, Length, 1);
+
+ if (NULL != DbgProcess)
+ KeDetachProcess();
+
+ if (GspMemoryError)
{
- KeDetachProcess();
- }
- if (GspMemoryError)
- {
- strcpy(GspOutBuffer, "E03");
- DPRINT("Fault during memory read\n");
+ strcpy(GspOutBuffer, "E03");
+ DPRINT1("Fault during memory read\n");
}
}
- if (NULL != ptr)
- {
- strcpy(GspOutBuffer, "E01");
- }
- break;
+ if (NULL != ptr)
+ strcpy(GspOutBuffer, "E01");
+
+ break;
+ }
/* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
case 'M':
- /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */
- if (GspHex2Long(&ptr, &Address))
+ {
+ /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */
+ if (GspHex2Long(&ptr, &Address))
{
- if (*(ptr++) == ',' &&
- GspHex2Long(&ptr, &Length) &&
- *(ptr++) == ':')
+ if (*(ptr++) == ',' && GspHex2Long(&ptr, &Length) && *(ptr++) == ':')
{
- PEPROCESS DbgProcess = NULL;
+ PEPROCESS DbgProcess = NULL;
- if (NULL != GspDbgThread &&
- PsGetCurrentProcess() != GspDbgThread->ThreadsProcess)
+ if (NULL != GspDbgThread &&
+ PsGetCurrentProcess() != GspDbgThread->ThreadsProcess)
{
- DbgProcess = GspDbgThread->ThreadsProcess;
- KeAttachProcess(&DbgProcess->Pcb);
+ DbgProcess = GspDbgThread->ThreadsProcess;
+ KeAttachProcess(&DbgProcess->Pcb);
}
- GspMemoryError = FALSE;
- GspHex2Mem(ptr, (PCHAR) Address, Length, TRUE);
- if (NULL != DbgProcess)
+ GspMemoryError = FALSE;
+ GspHex2Mem(ptr, (PCHAR)Address, Length, TRUE);
+ if (NULL != DbgProcess)
+ KeDetachProcess();
+
+ if (GspMemoryError)
{
- KeDetachProcess();
+ strcpy(GspOutBuffer, "E03");
+ DPRINT1("Fault during memory write\n");
}
- if (GspMemoryError)
+ else
{
- strcpy(GspOutBuffer, "E03");
- DPRINT("Fault during memory write\n");
+ strcpy(GspOutBuffer, "OK");
}
- else
- {
- strcpy(GspOutBuffer, "OK");
- }
- ptr = NULL;
+ ptr = NULL;
}
}
- if (NULL != ptr)
- {
- strcpy(GspOutBuffer, "E02");
- }
- break;
+ if (NULL != ptr)
+ strcpy(GspOutBuffer, "E02");
- /* cAA..AA Continue at address AA..AA(optional) */
- /* sAA..AA Step one instruction from AA..AA(optional) */
+ break;
+ }
+
+ /* cAA..AA Continue at address AA..AA */
+ /* sAA..AA Step one instruction from AA..AA */
case 's':
- Stepping = TRUE;
+ Stepping = TRUE;
case 'c':
- {
+ {
ULONG BreakpointNumber;
- ULONG dr6_;
+ ULONG Dr6;
- /* try to read optional parameter, pc unchanged if no parm */
- if (GspHex2Long (&ptr, &Address))
- {
+ /* try to read optional parameter, pc changed if param */
+ if (GspHex2Long(&ptr, &Address))
+ {
Context->Eip = Address;
- }
-
- NewPC = Context->Eip;
+ }
+ else if (ExceptionCode == STATUS_BREAKPOINT)
+ {
+ if (GspReadMemSafe((PCHAR)Context->Eip) == (CHAR)I386_OPCODE_INT3)
+ Context->Eip++;
+ }
/* clear the trace bit */
- Context->EFlags &= 0xfffffeff;
+ Context->EFlags &= ~EFLAGS_TF;
/* set the trace bit if we're Stepping */
if (Stepping)
- {
- Context->EFlags |= 0x100;
- }
+ Context->EFlags |= EFLAGS_TF;
-#if defined(__GNUC__)
- asm volatile ("movl %%db6, %0\n" : "=r" (dr6_) : );
-#elif defined(_MSC_VER)
- __asm mov eax, dr6 __asm mov dr6_, eax;
-#else
-#error Unknown compiler for inline assembler
-#endif
- if (!(dr6_ & 0x4000))
- {
- for (BreakpointNumber = 0; BreakpointNumber < 4; ++BreakpointNumber)
- {
- if (dr6_ & (1 << BreakpointNumber))
- {
- if (GspHwBreakpoints[BreakpointNumber].Type == 0)
- {
+ Dr6 = Ke386GetDr6();
+ if (!(Dr6 & DR6_BS))
+ {
+ for (BreakpointNumber = 0;
+ BreakpointNumber < MAX_HW_BREAKPOINTS;
+ BreakpointNumber++)
+ {
+ if (Dr6 & (1 << BreakpointNumber))
+ {
+ if (GspHwBreakpoints[BreakpointNumber].Type == I386_BP_TYPE_EXECUTE)
+ {
/* Set restore flag */
- Context->EFlags |= 0x10000;
+ Context->EFlags |= EFLAGS_RF;
break;
- }
- }
- }
- }
+ }
+ }
+ }
+ }
+
GspLoadBreakpoints(TrapFrame);
-#if defined(__GNUC__)
- asm volatile ("movl %0, %%db6\n" : : "r" (0));
-#elif defined(_MSC_VER)
- __asm mov eax, 0 __asm mov dr6, eax;
-#else
-#error Unknown compiler for inline assembler
-#endif
+ Ke386SetDr6(0);
if (NULL != GspDbgThread)
- {
+ {
ObDereferenceObject(GspDbgThread);
GspDbgThread = NULL;
- }
+ }
DPRINT("Thread %p releasing mutex\n", PsGetCurrentThread());
ExReleaseFastMutex(&GspLock);
DPRINT("Thread %p leaving stub\n", PsGetCurrentThread());
- return kdContinue;
- break;
- }
- case 'k': /* kill the program */
- strcpy(GspOutBuffer, "OK");
- break;
- /* kill the program */
+ if (ExceptionCode == STATUS_BREAKPOINT ||
+ ExceptionCode == STATUS_SINGLE_STEP)
+ return kdContinue;
- case 'H': /* Set thread */
- GspSetThread(ptr);
- break;
-
- case 'q': /* Query */
- GspQuery(ptr);
- break;
-
- case 'T': /* Query thread status */
- GspQueryThreadStatus(ptr);
- break;
-
- case 'Z':
- {
- LONG Type;
- LONG Address;
- LONG Length;
-
- GspHex2Long(&ptr, &Type);
- ptr++;
- GspHex2Long(&ptr, &Address);
- ptr++;
- GspHex2Long(&ptr, &Length);
- if (0 == Type)
- {
- GspSetSwBreakpoint((ULONG_PTR) Address);
- }
- else
- {
- GspSetHwBreakpoint(Type, (ULONG_PTR) Address, Length);
- }
- break;
- }
-
- case 'z':
- {
- LONG Type;
- LONG Address;
- LONG Length;
-
- GspHex2Long(&ptr, &Type);
- ptr++;
- GspHex2Long(&ptr, &Address);
- ptr++;
- GspHex2Long(&ptr, &Length);
- if (0 == Type)
- {
- GspRemoveSwBreakpoint((ULONG_PTR) Address);
- }
- else
- {
- GspRemoveHwBreakpoint(Type, (ULONG_PTR) Address, Length);
- }
- break;
- }
-
- default:
- break;
+ return kdHandleException;
}
- /* reply to the request */
- GspPutPacket(GspOutBuffer);
- /* DPRINT("------- reply command (%s) -------\n", GspOutBuffer); */
+ case 'k': /* kill the program */
+ strcpy(GspOutBuffer, "OK");
+ break;
+
+ case 'H': /* Set thread */
+ GspSetThread(ptr);
+ break;
+
+ case 'q': /* Query */
+ GspQuery(ptr);
+ break;
+
+ case 'T': /* Query thread status */
+ GspQueryThreadStatus(ptr);
+ break;
+
+ case 'Z':
+ {
+ LONG Type;
+ LONG Address;
+ LONG Length;
+
+ GspHex2Long(&ptr, &Type);
+ ptr++;
+ GspHex2Long(&ptr, &Address);
+ ptr++;
+ GspHex2Long(&ptr, &Length);
+
+ if (0 == Type)
+ GspSetSwBreakpoint((ULONG_PTR)Address);
+ else
+ GspSetHwBreakpoint(Type, (ULONG_PTR)Address, Length);
+
+ break;
+ }
+
+ case 'z':
+ {
+ LONG Type;
+ LONG Address;
+ LONG Length;
+
+ GspHex2Long(&ptr, &Type);
+ ptr++;
+ GspHex2Long(&ptr, &Address);
+ ptr++;
+ GspHex2Long(&ptr, &Length);
+
+ if (0 == Type)
+ GspRemoveSwBreakpoint((ULONG_PTR)Address);
+ else
+ GspRemoveHwBreakpoint(Type, (ULONG_PTR)Address, Length);
+
+ break;
+ }
+
+ default:
+ break;
}
- /* not reached */
- ASSERT(0);
+ /* reply to the request */
+ GspPutPacket(GspOutBuffer);
+ // DbgPrint(">>> (%s) >>>\n", GspOutBuffer);
}
-
- if (NULL != GspDbgThread)
- {
- ObDereferenceObject(GspDbgThread);
- GspDbgThread = NULL;
- }
-
- return kdContinue;
}
-
BOOLEAN
NTAPI
-GspBreakIn(PKINTERRUPT Interrupt,
- PVOID ServiceContext)
+GspBreakIn(PKINTERRUPT Interrupt, PVOID ServiceContext)
{
- PKTRAP_FRAME TrapFrame;
- BOOLEAN DoBreakIn;
- CONTEXT Context;
- KIRQL OldIrql;
- UCHAR Value;
+ PKTRAP_FRAME TrapFrame;
+ BOOLEAN DoBreakIn;
+ CONTEXT Context;
+ KIRQL OldIrql;
+ UCHAR Value;
- DPRINT("Break In\n");
+ DPRINT("Break In\n");
- DoBreakIn = FALSE;
- while (KdPortGetByteEx(&GdbPortInfo, &Value))
+ DoBreakIn = FALSE;
+ while (KdPortGetByteEx(&GdbPortInfo, &Value))
{
- if (Value == 0x03)
- {
- DoBreakIn = TRUE;
- }
+ if (Value == 0x03)
+ DoBreakIn = TRUE;
}
- if (!DoBreakIn)
- {
- return TRUE;
- }
+ if (!DoBreakIn)
+ return TRUE;
- KeRaiseIrql(HIGH_LEVEL, &OldIrql);
+ KeRaiseIrql(HIGH_LEVEL, &OldIrql);
- TrapFrame = PsGetCurrentThread()->Tcb.TrapFrame;
+ TrapFrame = PsGetCurrentThread()->Tcb.TrapFrame;
- KeTrapFrameToContext(TrapFrame, NULL, &Context);
+ KeTrapFrameToContext(TrapFrame, NULL, &Context);
- KdpGdbEnterDebuggerException(NULL, &Context, TrapFrame);
+ KdpGdbEnterDebuggerException(NULL, &Context, TrapFrame);
- KeContextToTrapFrame(&Context, NULL, TrapFrame, Context.ContextFlags, KernelMode);
+ KeContextToTrapFrame(&Context, NULL, TrapFrame, Context.ContextFlags, KernelMode);
- KeLowerIrql(OldIrql);
+ KeLowerIrql(OldIrql);
- return TRUE;
+ return TRUE;
}
VOID
@@ -1735,42 +1553,37 @@ KdpGdbDebugPrint(PCH Message, ULONG Length)
/* Initialize the GDB stub */
VOID
NTAPI
-KdpGdbStubInit(PKD_DISPATCH_TABLE WrapperTable,
- ULONG BootPhase)
+KdpGdbStubInit(PKD_DISPATCH_TABLE WrapperTable, ULONG BootPhase)
{
- if (!KdDebuggerEnabled || !KdpDebugMode.Gdb)
+ if (!KdDebuggerEnabled || !KdpDebugMode.Gdb)
+ return;
+
+ if (BootPhase == 0)
{
- return;
+ ExInitializeFastMutex(&GspLock);
+
+ /* Write out the functions that we support for now */
+ WrapperTable->KdpInitRoutine = KdpGdbStubInit;
+ WrapperTable->KdpPrintRoutine = KdpGdbDebugPrint;
+ WrapperTable->KdpExceptionRoutine = KdpGdbEnterDebuggerException;
+
+ /* Initialize the Port */
+ KdPortInitializeEx(&GdbPortInfo, 0, 0);
}
-
- if (BootPhase == 0)
+ else if (BootPhase == 1)
{
- ExInitializeFastMutex(&GspLock);
+ GspInitialized = TRUE;
- /* Write out the functions that we support for now */
- WrapperTable->KdpInitRoutine = KdpGdbStubInit;
- WrapperTable->KdpPrintRoutine = KdpGdbDebugPrint;
- WrapperTable->KdpExceptionRoutine = KdpGdbEnterDebuggerException;
+ GspRunThread = NULL;
+ GspDbgThread = NULL;
+ GspEnumThread = NULL;
- /* Initialize the Port */
- KdPortInitializeEx(&GdbPortInfo, 0, 0);
-
- KdpPort = GdbPortInfo.ComPort;
+ HalDisplayString("Waiting for GDB to attach\n");
+ DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
}
- else if (BootPhase == 1)
+ else if (BootPhase == 2)
{
- GspInitialized = TRUE;
-
- GspRunThread = NULL;
- GspDbgThread = NULL;
- GspEnumThread = NULL;
-
- HalDisplayString("Waiting for GDB to attach\n");
- DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
- }
- else if (BootPhase == 2)
- {
- HalDisplayString("\n GDB debugging enabled\n\n");
+ HalDisplayString("\n GDB debugging enabled\n\n");
}
}
diff --git a/reactos/ntoskrnl/kd/wrappers/kdbg.c b/reactos/ntoskrnl/kd/wrappers/kdbg.c
index 342120752a1..23655ac600b 100644
--- a/reactos/ntoskrnl/kd/wrappers/kdbg.c
+++ b/reactos/ntoskrnl/kd/wrappers/kdbg.c
@@ -1,7 +1,7 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
- * FILE: ntoskrnl/kd/wrappers/bochs.c
+ * FILE: ntoskrnl/kd/wrappers/kdbg.c
* PURPOSE: KDBG Wrapper for Kd
*
* PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org)
diff --git a/reactos/ntoskrnl/kdbg/kdb.c b/reactos/ntoskrnl/kdbg/kdb.c
index 8f4152da560..3c1fd71f3fe 100644
--- a/reactos/ntoskrnl/kdbg/kdb.c
+++ b/reactos/ntoskrnl/kdbg/kdb.c
@@ -1177,7 +1177,7 @@ KdbpAttachToProcess(
/*!\brief Calls the main loop ...
*/
static VOID
-KdbpCallMainLoop()
+KdbpCallMainLoop(VOID)
{
KdbpCliMainLoop(KdbEnteredOnSingleStep);
}
diff --git a/reactos/ntoskrnl/kdbg/kdb_keyboard.c b/reactos/ntoskrnl/kdbg/kdb_keyboard.c
index e2af88fbdfc..9abf9f310d2 100644
--- a/reactos/ntoskrnl/kdbg/kdb_keyboard.c
+++ b/reactos/ntoskrnl/kdbg/kdb_keyboard.c
@@ -14,7 +14,6 @@
#define NDEBUG
#include
-#if 1
#define KBD_STATUS_REG 0x64
#define KBD_CNTL_REG 0x64
@@ -137,258 +136,4 @@ KdbpTryGetCharKeyboard(PULONG ScanCode, ULONG Retry)
return -1;
}
-#endif
-
-#if 0
-
-/* GLOBALS *******************************************************************/
-
-/*
- * Keyboard I/O ports.
- */
-#define K_RDWR 0x60 /* keyboard data & cmds (read/write) */
-#define K_STATUS 0x64 /* keybd status (read-only) */
-#define K_CMD 0x64 /* keybd ctlr command (write-only) */
-
-/*
- * Bit definitions for K_STATUS port.
- */
-#define K_OBUF_FUL 0x01 /* output (from keybd) buffer full */
-#define K_IBUF_FUL 0x02 /* input (to keybd) buffer full */
-#define K_SYSFLAG 0x04 /* "System Flag" */
-#define K_CMD_DATA 0x08 /* 1 = input buf has cmd, 0 = data */
-#define K_KBD_INHIBIT 0x10 /* 0 if keyboard inhibited */
-#define K_AUX_OBUF_FUL 0x20 /* 1 = obuf holds aux device data */
-#define K_TIMEOUT 0x40 /* timout error flag */
-#define K_PARITY_ERROR 0x80 /* parity error flag */
-
-/*
- * Keyboard controller commands (sent to K_CMD port).
- */
-#define KC_CMD_READ 0x20 /* read controller command byte */
-#define KC_CMD_WRITE 0x60 /* write controller command byte */
-#define KC_CMD_DIS_AUX 0xa7 /* disable auxiliary device */
-#define KC_CMD_ENB_AUX 0xa8 /* enable auxiliary device */
-#define KC_CMD_TEST_AUX 0xa9 /* test auxiliary device interface */
-#define KC_CMD_SELFTEST 0xaa /* keyboard controller self-test */
-#define KC_CMD_TEST 0xab /* test keyboard interface */
-#define KC_CMD_DUMP 0xac /* diagnostic dump */
-#define KC_CMD_DISABLE 0xad /* disable keyboard */
-#define KC_CMD_ENABLE 0xae /* enable keyboard */
-#define KC_CMD_RDKBD 0xc4 /* read keyboard ID */
-#define KC_CMD_WIN 0xd0 /* read output port */
-#define KC_CMD_WOUT 0xd1 /* write output port */
-#define KC_CMD_ECHO 0xee /* used for diagnostic testing */
-#define KC_CMD_PULSE 0xff /* pulse bits 3-0 based on low nybble */
-
-/*
- * Keyboard commands (send to K_RDWR).
- */
-#define K_CMD_LEDS 0xed /* set status LEDs (caps lock, etc.) */
-#define K_CMD_TYPEMATIC 0xf3 /* set key repeat and delay */
-
-/*
- * Bit definitions for controller command byte (sent following
- * KC_CMD_WRITE command).
- *
- * Bits 0x02 and 0x80 unused, always set to 0.
- */
-#define K_CB_ENBLIRQ 0x01 /* enable data-ready intrpt */
-#define K_CB_SETSYSF 0x04 /* Set System Flag */
-#define K_CB_INHBOVR 0x08 /* Inhibit Override */
-#define K_CB_DISBLE 0x10 /* disable keyboard */
-#define K_CB_IGNPARITY 0x20 /* ignore parity from keyboard */
-#define K_CB_SCAN 0x40 /* standard scan conversion */
-
-/*
- * Bit definitions for "Indicator Status Byte" (sent after a
- * K_CMD_LEDS command). If the bit is on, the LED is on. Undefined
- * bit positions must be 0.
- */
-#define K_LED_SCRLLK 0x1 /* scroll lock */
-#define K_LED_NUMLK 0x2 /* num lock */
-#define K_LED_CAPSLK 0x4 /* caps lock */
-
-/*
- * Bit definitions for "Miscellaneous port B" (K_PORTB).
- */
-/* read/write */
-#define K_ENABLETMR2 0x01 /* enable output from timer 2 */
-#define K_SPKRDATA 0x02 /* direct input to speaker */
-#define K_ENABLEPRTB 0x04 /* "enable" port B */
-#define K_EIOPRTB 0x08 /* enable NMI on parity error */
-/* read-only */
-#define K_REFRESHB 0x10 /* refresh flag from INLTCONT PAL */
-#define K_OUT2B 0x20 /* timer 2 output */
-#define K_ICKB 0x40 /* I/O channel check (parity error) */
-
-/*
- * Bit definitions for the keyboard controller's output port.
- */
-#define KO_SYSRESET 0x01 /* processor reset */
-#define KO_GATE20 0x02 /* A20 address line enable */
-#define KO_AUX_DATA_OUT 0x04 /* output data to auxiliary device */
-#define KO_AUX_CLOCK 0x08 /* auxiliary device clock */
-#define KO_OBUF_FUL 0x10 /* keyboard output buffer full */
-#define KO_AUX_OBUF_FUL 0x20 /* aux device output buffer full */
-#define KO_CLOCK 0x40 /* keyboard clock */
-#define KO_DATA_OUT 0x80 /* output data to keyboard */
-
-/*
- * Keyboard return codes.
- */
-#define K_RET_RESET_DONE 0xaa /* BAT complete */
-#define K_RET_ECHO 0xee /* echo after echo command */
-#define K_RET_ACK 0xfa /* ack */
-#define K_RET_RESET_FAIL 0xfc /* BAT error */
-#define K_RET_RESEND 0xfe /* resend request */
-
-#define SHIFT -1
-#define CTRL -2
-#define META -3
-
-static char keymap[128][2] = {
- {0}, /* 0 */
- {27, 27}, /* 1 - ESC */
- {'1', '!'}, /* 2 */
- {'2', '@'},
- {'3', '#'},
- {'4', '$'},
- {'5', '%'},
- {'6', '^'},
- {'7', '&'},
- {'8', '*'},
- {'9', '('},
- {'0', ')'},
- {'-', '_'},
- {'=', '+'},
- {8, 8}, /* 14 - Backspace */
- {'\t', '\t'}, /* 15 */
- {'q', 'Q'},
- {'w', 'W'},
- {'e', 'E'},
- {'r', 'R'},
- {'t', 'T'},
- {'y', 'Y'},
- {'u', 'U'},
- {'i', 'I'},
- {'o', 'O'},
- {'p', 'P'},
- {'[', '{'},
- {']', '}'}, /* 27 */
- {'\r', '\r'}, /* 28 - Enter */
- {CTRL, CTRL}, /* 29 - Ctrl */
- {'a', 'A'}, /* 30 */
- {'s', 'S'},
- {'d', 'D'},
- {'f', 'F'},
- {'g', 'G'},
- {'h', 'H'},
- {'j', 'J'},
- {'k', 'K'},
- {'l', 'L'},
- {';', ':'},
- {'\'', '"'}, /* 40 */
- {'`', '~'}, /* 41 */
- {SHIFT, SHIFT}, /* 42 - Left Shift */
- {'\\', '|'}, /* 43 */
- {'z', 'Z'}, /* 44 */
- {'x', 'X'},
- {'c', 'C'},
- {'v', 'V'},
- {'b', 'B'},
- {'n', 'N'},
- {'m', 'M'},
- {',', '<'},
- {'.', '>'},
- {'/', '?'}, /* 53 */
- {SHIFT, SHIFT}, /* 54 - Right Shift */
- {0, 0}, /* 55 - Print Screen */
- {META, META}, /* 56 - Alt */
- {' ', ' '}, /* 57 - Space bar */
- {0, 0}, /* 58 - Caps Lock */
- {0, 0}, /* 59 - F1 */
- {0, 0}, /* 60 - F2 */
- {0, 0}, /* 61 - F3 */
- {0, 0}, /* 62 - F4 */
- {0, 0}, /* 63 - F5 */
- {0, 0}, /* 64 - F6 */
- {0, 0}, /* 65 - F7 */
- {0, 0}, /* 66 - F8 */
- {0, 0}, /* 67 - F9 */
- {0, 0}, /* 68 - F10 */
- {0, 0}, /* 69 - Num Lock */
- {0, 0}, /* 70 - Scroll Lock */
- {'7', '7'}, /* 71 - Numeric keypad 7 */
- {'8', '8'}, /* 72 - Numeric keypad 8 */
- {'9', '9'}, /* 73 - Numeric keypad 9 */
- {'-', '-'}, /* 74 - Numeric keypad '-' */
- {'4', '4'}, /* 75 - Numeric keypad 4 */
- {'5', '5'}, /* 76 - Numeric keypad 5 */
- {'6', '6'}, /* 77 - Numeric keypad 6 */
- {'+', '+'}, /* 78 - Numeric keypad '+' */
- {'1', '1'}, /* 79 - Numeric keypad 1 */
- {'2', '2'}, /* 80 - Numeric keypad 2 */
- {'3', '3'}, /* 81 - Numeric keypad 3 */
- {'0', '0'}, /* 82 - Numeric keypad 0 */
- {'.', '.'}, /* 83 - Numeric keypad '.' */
-};
-
-/* FUNCTIONS *****************************************************************/
-
-/*
- * Quick poll for a pending input character.
- * Returns a character if available, -1 otherwise. This routine can return
- * false negatives in the following cases:
- *
- * - a valid character is in transit from the keyboard when called
- * - a key release is received (from a previous key press)
- * - a SHIFT key press is received (shift state is recorded however)
- * - a key press for a multi-character sequence is received
- *
- * Yes, this is horrible.
- */
-ULONG
-KdbpTryGetCharKeyboard(VOID)
-{
- static unsigned shift_state, ctrl_state, meta_state;
- unsigned scan_code, ch;
-
- /* See if a scan code is ready, returning if none. */
- if ((READ_PORT_UCHAR((PUCHAR)K_STATUS) & K_OBUF_FUL) == 0) {
- return -1;
- }
- scan_code = READ_PORT_UCHAR((PUCHAR)K_RDWR);
-
- /* Handle key releases - only release of SHIFT is important. */
- if (scan_code & 0x80) {
- scan_code &= 0x7f;
- if (keymap[scan_code][0] == SHIFT)
- shift_state = 0;
- else if (keymap[scan_code][0] == CTRL)
- ctrl_state = 0;
- else if (keymap[scan_code][0] == META)
- meta_state = 0;
- ch = -1;
- } else {
- /* Translate the character through the keymap. */
- ch = keymap[scan_code][shift_state] | meta_state;
- if (ch == SHIFT) {
- shift_state = 1;
- ch = -1;
- } else if (ch == CTRL) {
- ctrl_state = 1;
- ch = -1;
- } else if (ch == META) {
- meta_state = 0200;
- ch = -1;
- } else if (ch == 0)
- ch = -1;
- else if (ctrl_state)
- ch = (keymap[scan_code][1] - '@') | meta_state;
- }
-
- return ch;
-}
-
-#endif
+/* EOF */
diff --git a/reactos/ntoskrnl/ke/arm/kiinit.c b/reactos/ntoskrnl/ke/arm/kiinit.c
index 48560398eb9..71aa7d2f932 100644
--- a/reactos/ntoskrnl/ke/arm/kiinit.c
+++ b/reactos/ntoskrnl/ke/arm/kiinit.c
@@ -42,7 +42,7 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
IN CCHAR Number,
IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{
- LARGE_INTEGER PageDirectory;
+ ULONG PageDirectory[2];
PKPCR Pcr;
ULONG i;
@@ -200,11 +200,10 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
// Initialize the Idle Process and the Process Listhead
//
InitializeListHead(&KiProcessListHead);
- PageDirectory.QuadPart = 0;
KeInitializeProcess(InitProcess,
0,
0xFFFFFFFF,
- &PageDirectory,
+ PageDirectory,
FALSE);
InitProcess->QuantumReset = MAXCHAR;
}
diff --git a/reactos/ntoskrnl/ke/arm/trapc.c b/reactos/ntoskrnl/ke/arm/trapc.c
index 52a4b1743c4..51b12f816e4 100644
--- a/reactos/ntoskrnl/ke/arm/trapc.c
+++ b/reactos/ntoskrnl/ke/arm/trapc.c
@@ -100,7 +100,7 @@ KiSwapProcess(IN PKPROCESS NewProcess,
//
// Update the page directory base
//
- TtbRegister.AsUlong = (ULONG)NewProcess->DirectoryTableBase.LowPart;
+ TtbRegister.AsUlong = NewProcess->DirectoryTableBase[0];
ASSERT(TtbRegister.Reserved == 0);
KeArmTranslationTableRegisterSet(TtbRegister);
@@ -148,8 +148,8 @@ KiSwapContextInternal(IN PKTHREAD OldThread,
//
// Check if address space switch is needed
//
- if (OldProcess->DirectoryTableBase.LowPart !=
- NewProcess->DirectoryTableBase.LowPart)
+ if (OldProcess->DirectoryTableBase[0] !=
+ NewProcess->DirectoryTableBase[0])
{
//
// FIXME-USER: Support address space switch
diff --git a/reactos/ntoskrnl/ke/bug.c b/reactos/ntoskrnl/ke/bug.c
index 85f5141224b..500dff67f4c 100644
--- a/reactos/ntoskrnl/ke/bug.c
+++ b/reactos/ntoskrnl/ke/bug.c
@@ -547,9 +547,9 @@ KiDoBugCheckCallbacks(VOID)
}
}
+DECLSPEC_NORETURN
VOID
NTAPI
-__declspec(noreturn)
KiBugCheckDebugBreak(IN ULONG StatusCode)
{
/* If KDBG isn't connected, freeze the CPU, otherwise, break */
@@ -752,7 +752,6 @@ KiDisplayBlueScreen(IN ULONG MessageId,
VOID
NTAPI
-__declspec(noreturn)
KeBugCheckWithTf(IN ULONG BugCheckCode,
IN ULONG_PTR BugCheckParameter1,
IN ULONG_PTR BugCheckParameter2,
@@ -1164,13 +1163,7 @@ KeBugCheckWithTf(IN ULONG BugCheckCode,
/* FIXME: Support Triage Dump */
- /* Write the crash dump */
- MmDumpToPagingFile(KiBugCheckData[4],
- KiBugCheckData[0],
- KiBugCheckData[1],
- KiBugCheckData[2],
- KiBugCheckData[3],
- TrapFrame);
+ /* FIXME: Write the crash dump */
}
else
{
diff --git a/reactos/ntoskrnl/ke/freeldr.c b/reactos/ntoskrnl/ke/freeldr.c
index f1e716f6250..d13574323e9 100644
--- a/reactos/ntoskrnl/ke/freeldr.c
+++ b/reactos/ntoskrnl/ke/freeldr.c
@@ -312,7 +312,7 @@ KiRosConfigureArcDescriptor(IN ULONG PageBegin,
}
/* Check if the block matches us, and we haven't tried combining yet */
- if ((BlockType == MemoryType) && !(Combined))
+ if (((TYPE_OF_MEMORY)BlockType == MemoryType) && !(Combined))
{
/* Check if it starts where we end */
if (BlockBegin == PageEnd)
diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c
index a346b8a9214..4424a3d6416 100644
--- a/reactos/ntoskrnl/ke/i386/exp.c
+++ b/reactos/ntoskrnl/ke/i386/exp.c
@@ -1029,7 +1029,7 @@ DispatchToUser:
}
/* Try second chance */
- if (DbgkForwardException(ExceptionRecord, TRUE, FALSE))
+ if (DbgkForwardException(ExceptionRecord, TRUE, TRUE))
{
/* Handled, get out */
goto Exit;
diff --git a/reactos/ntoskrnl/ke/procobj.c b/reactos/ntoskrnl/ke/procobj.c
index a37a41492ca..f187ec1dd71 100644
--- a/reactos/ntoskrnl/ke/procobj.c
+++ b/reactos/ntoskrnl/ke/procobj.c
@@ -96,6 +96,9 @@ KiAttachProcess(IN PKTHREAD Thread,
/* Release lock */
KiReleaseApcLockFromDpcLevel(ApcLock);
+
+ /* Make sure that we are in the right page directory (ReactOS Mm Hack) */
+ MiSyncForProcessAttach(Thread, (PEPROCESS)Process);
/* Swap Processes */
KiSwapProcess(Process, SavedApcState->Process);
@@ -535,7 +538,7 @@ KeDetachProcess(VOID)
KiReleaseApcLockFromDpcLevel(&ApcLock);
/* Swap Processes */
- KiSwapProcess(Thread->ApcState.Process, Thread->ApcState.Process);
+ KiSwapProcess(Thread->ApcState.Process, Process);
/* Exit the dispatcher */
KiExitDispatcher(ApcLock.OldIrql);
@@ -573,9 +576,6 @@ KeStackAttachProcess(IN PKPROCESS Process,
ASSERT_PROCESS(Process);
ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
- /* Make sure that we are in the right page directory (ReactOS Mm Hack) */
- MiSyncForProcessAttach(Thread, (PEPROCESS)Process);
-
/* Crash system if DPC is being executed! */
if (KeIsExecutingDpc())
{
@@ -705,7 +705,7 @@ KeUnstackDetachProcess(IN PRKAPC_STATE ApcState)
KiReleaseApcLockFromDpcLevel(&ApcLock);
/* Swap Processes */
- KiSwapProcess(Thread->ApcState.Process, Thread->ApcState.Process);
+ KiSwapProcess(Thread->ApcState.Process, Process);
/* Exit the dispatcher */
KiExitDispatcher(ApcLock.OldIrql);
diff --git a/reactos/ntoskrnl/ke/spinlock.c b/reactos/ntoskrnl/ke/spinlock.c
index 4798eae5316..a1ed59be8c7 100644
--- a/reactos/ntoskrnl/ke/spinlock.c
+++ b/reactos/ntoskrnl/ke/spinlock.c
@@ -87,12 +87,44 @@ KeReleaseQueuedSpinLockFromDpcLevel(IN PKSPIN_LOCK_QUEUE LockHandle)
/* PUBLIC FUNCTIONS **********************************************************/
#ifdef _X86_
+/*
+ * @implemented
+ */
+KIRQL
+NTAPI
+KeAcquireInterruptSpinLock(IN PKINTERRUPT Interrupt)
+{
+ KIRQL OldIrql;
+
+ /* Raise IRQL */
+ KeRaiseIrql(Interrupt->SynchronizeIrql, &OldIrql);
+
+ /* Acquire spinlock on MP */
+ KeAcquireSpinLockAtDpcLevel(Interrupt->ActualLock);
+ return OldIrql;
+}
+
/*
* @implemented
*/
VOID
NTAPI
-KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
+KeReleaseInterruptSpinLock(IN PKINTERRUPT Interrupt,
+ IN KIRQL OldIrql)
+{
+ /* Release lock on MP */
+ KeReleaseSpinLockFromDpcLevel(Interrupt->ActualLock);
+
+ /* Lower IRQL */
+ KeLowerIrql(OldIrql);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+_KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
{
/* Clear it */
*SpinLock = 0;
@@ -230,38 +262,6 @@ KeReleaseInStackQueuedSpinLockFromDpcLevel(IN PKLOCK_QUEUE_HANDLE LockHandle)
#endif
}
-/*
- * @implemented
- */
-KIRQL
-NTAPI
-KeAcquireInterruptSpinLock(IN PKINTERRUPT Interrupt)
-{
- KIRQL OldIrql;
-
- /* Raise IRQL */
- KeRaiseIrql(Interrupt->SynchronizeIrql, &OldIrql);
-
- /* Acquire spinlock on MP */
- KefAcquireSpinLockAtDpcLevel(Interrupt->ActualLock);
- return OldIrql;
-}
-
-/*
- * @implemented
- */
-VOID
-NTAPI
-KeReleaseInterruptSpinLock(IN PKINTERRUPT Interrupt,
- IN KIRQL OldIrql)
-{
- /* Release lock on MP */
- KefReleaseSpinLockFromDpcLevel(Interrupt->ActualLock);
-
- /* Lower IRQL */
- KeLowerIrql(OldIrql);
-}
-
/*
* @unimplemented
*/
diff --git a/reactos/ntoskrnl/ke/wait.c b/reactos/ntoskrnl/ke/wait.c
index 883d7c789a3..9d987d85575 100644
--- a/reactos/ntoskrnl/ke/wait.c
+++ b/reactos/ntoskrnl/ke/wait.c
@@ -117,6 +117,9 @@ KiAcquireFastMutex(IN PFAST_MUTEX FastMutex)
NULL);
}
+/* KiAcquireGuardedMutex depends on these bits being right */
+C_ASSERT((GM_LOCK_WAITER_WOKEN * 2) == GM_LOCK_WAITER_INC);
+
VOID
FASTCALL
KiAcquireGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
@@ -181,9 +184,6 @@ KiAcquireGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
/* Ok, the wait is done, so set the new bits */
BitsToRemove = GM_LOCK_BIT | GM_LOCK_WAITER_WOKEN;
BitsToAdd = GM_LOCK_WAITER_WOKEN;
-
- /* We depend on these bits being just right */
- C_ASSERT((GM_LOCK_WAITER_WOKEN * 2) == GM_LOCK_WAITER_INC);
}
}
diff --git a/reactos/ntoskrnl/mm/ARM3/arm/init.c b/reactos/ntoskrnl/mm/ARM3/arm/init.c
new file mode 100644
index 00000000000..7f2e21594c4
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/arm/init.c
@@ -0,0 +1,46 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/init.c
+ * PURPOSE: ARM Memory Manager Initialization
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#line 15 "ARM³::INIT"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../../ARM3/miarm.h"
+
+/* GLOBALS ********************************************************************/
+
+ULONG MmMaximumNonPagedPoolPercent;
+ULONG MmSizeOfNonPagedPoolInBytes;
+ULONG MmMaximumNonPagedPoolInBytes;
+PVOID MmNonPagedSystemStart;
+PVOID MmNonPagedPoolStart;
+PVOID MmNonPagedPoolExpansionStart;
+PVOID MmNonPagedPoolEnd = (PVOID)0xFFBE0000;
+ULONG MmNumberOfSystemPtes;
+PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+NTSTATUS
+NTAPI
+MmArmInitSystem(IN ULONG Phase,
+ IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+ //
+ // Always return success for now
+ //
+ DPRINT1("NEVER TELL ME THE ODDS!\n");
+ while (TRUE);
+ return STATUS_SUCCESS;
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/mm/ARM3/contmem.c b/reactos/ntoskrnl/mm/ARM3/contmem.c
new file mode 100644
index 00000000000..bc1a18eb3da
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/contmem.c
@@ -0,0 +1,440 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/contmem.c
+ * PURPOSE: ARM Memory Manager Contiguous Memory Allocator
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#line 15 "ARM³::CONTMEM"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+PVOID
+NTAPI
+MiCheckForContiguousMemory(IN PVOID BaseAddress,
+ IN PFN_NUMBER BaseAddressPages,
+ IN PFN_NUMBER SizeInPages,
+ IN PFN_NUMBER LowestPfn,
+ IN PFN_NUMBER HighestPfn,
+ IN PFN_NUMBER BoundaryPfn,
+ IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute)
+{
+ PMMPTE StartPte, EndPte;
+ PFN_NUMBER PreviousPage = 0, Page, HighPage, BoundaryMask, Pages = 0;
+
+ //
+ // Okay, first of all check if the PFNs match our restrictions
+ //
+ if (LowestPfn > HighestPfn) return NULL;
+ if (LowestPfn + SizeInPages <= LowestPfn) return NULL;
+ if (LowestPfn + SizeInPages - 1 > HighestPfn) return NULL;
+ if (BaseAddressPages < SizeInPages) return NULL;
+
+ //
+ // This is the last page we need to get to and the boundary requested
+ //
+ HighPage = HighestPfn + 1 - SizeInPages;
+ BoundaryMask = ~(BoundaryPfn - 1);
+
+ //
+ // And here's the PTEs for this allocation. Let's go scan them.
+ //
+ StartPte = MiAddressToPte(BaseAddress);
+ EndPte = StartPte + BaseAddressPages;
+ while (StartPte < EndPte)
+ {
+ //
+ // Get this PTE's page number
+ //
+ ASSERT (StartPte->u.Hard.Valid == 1);
+ Page = PFN_FROM_PTE(StartPte);
+
+ //
+ // Is this the beginning of our adventure?
+ //
+ if (!Pages)
+ {
+ //
+ // Check if this PFN is within our range
+ //
+ if ((Page >= LowestPfn) && (Page <= HighPage))
+ {
+ //
+ // It is! Do you care about boundary (alignment)?
+ //
+ if (!(BoundaryPfn) ||
+ (!((Page ^ (Page + SizeInPages - 1)) & BoundaryMask)))
+ {
+ //
+ // You don't care, or you do care but we deliver
+ //
+ Pages++;
+ }
+ }
+
+ //
+ // Have we found all the pages we need by now?
+ // Incidently, this means you only wanted one page
+ //
+ if (Pages == SizeInPages)
+ {
+ //
+ // Mission complete
+ //
+ return MiPteToAddress(StartPte);
+ }
+ }
+ else
+ {
+ //
+ // Have we found a page that doesn't seem to be contiguous?
+ //
+ if (Page != (PreviousPage + 1))
+ {
+ //
+ // Ah crap, we have to start over
+ //
+ Pages = 0;
+ continue;
+ }
+
+ //
+ // Otherwise, we're still in the game. Do we have all our pages?
+ //
+ if (++Pages == SizeInPages)
+ {
+ //
+ // We do! This entire range was contiguous, so we'll return it!
+ //
+ return MiPteToAddress(StartPte - Pages + 1);
+ }
+ }
+
+ //
+ // Try with the next PTE, remember this PFN
+ //
+ PreviousPage = Page;
+ StartPte++;
+ continue;
+ }
+
+ //
+ // All good returns are within the loop...
+ //
+ return NULL;
+}
+
+PVOID
+NTAPI
+MiFindContiguousMemory(IN PFN_NUMBER LowestPfn,
+ IN PFN_NUMBER HighestPfn,
+ IN PFN_NUMBER BoundaryPfn,
+ IN PFN_NUMBER SizeInPages,
+ IN MEMORY_CACHING_TYPE CacheType)
+{
+ PFN_NUMBER Page;
+ PHYSICAL_ADDRESS PhysicalAddress;
+ PAGED_CODE ();
+ ASSERT(SizeInPages != 0);
+
+ //
+ // Our last hope is to scan the free page list for contiguous pages
+ //
+ Page = MiFindContiguousPages(LowestPfn,
+ HighestPfn,
+ BoundaryPfn,
+ SizeInPages,
+ CacheType);
+ if (!Page) return NULL;
+
+ //
+ // We'll just piggyback on the I/O memory mapper
+ //
+ PhysicalAddress.QuadPart = Page << PAGE_SHIFT;
+ return MmMapIoSpace(PhysicalAddress, SizeInPages << PAGE_SHIFT, CacheType);
+}
+
+PVOID
+NTAPI
+MiAllocateContiguousMemory(IN SIZE_T NumberOfBytes,
+ IN PFN_NUMBER LowestAcceptablePfn,
+ IN PFN_NUMBER HighestAcceptablePfn,
+ IN PFN_NUMBER BoundaryPfn,
+ IN MEMORY_CACHING_TYPE CacheType)
+{
+ PVOID BaseAddress;
+ PFN_NUMBER SizeInPages;
+ MI_PFN_CACHE_ATTRIBUTE CacheAttribute;
+ ASSERT(NumberOfBytes != 0);
+
+ //
+ // Compute size requested
+ //
+ SizeInPages = BYTES_TO_PAGES(NumberOfBytes);
+
+ //
+ // Convert the cache attribute and check for cached requests
+ //
+ CacheAttribute = MiPlatformCacheAttributes[FALSE][CacheType];
+ if (CacheAttribute == MiCached)
+ {
+ //
+ // Because initial nonpaged pool is supposed to be contiguous, go ahead
+ // and try making a nonpaged pool allocation first.
+ //
+ BaseAddress = ExAllocatePoolWithTag(NonPagedPoolCacheAligned,
+ NumberOfBytes,
+ 'mCmM');
+ if (BaseAddress)
+ {
+ //
+ // Now make sure it's actually contiguous (if it came from expansion
+ // it might not be).
+ //
+ if (MiCheckForContiguousMemory(BaseAddress,
+ SizeInPages,
+ SizeInPages,
+ LowestAcceptablePfn,
+ HighestAcceptablePfn,
+ BoundaryPfn,
+ CacheAttribute))
+ {
+ //
+ // Sweet, we're in business!
+ //
+ return BaseAddress;
+ }
+
+ //
+ // No such luck
+ //
+ ExFreePool(BaseAddress);
+ }
+ }
+
+ //
+ // According to MSDN, the system won't try anything else if you're higher
+ // than APC level.
+ //
+ if (KeGetCurrentIrql() > APC_LEVEL) return NULL;
+
+ //
+ // Otherwise, we'll go try to find some
+ //
+ return MiFindContiguousMemory(LowestAcceptablePfn,
+ HighestAcceptablePfn,
+ BoundaryPfn,
+ SizeInPages,
+ CacheType);
+}
+
+VOID
+NTAPI
+MiFreeContiguousMemory(IN PVOID BaseAddress)
+{
+ KIRQL OldIrql;
+ PFN_NUMBER PageFrameIndex, LastPage, PageCount;
+ PMMPFN Pfn1, StartPfn;
+ PAGED_CODE();
+
+ //
+ // First, check if the memory came from initial nonpaged pool, or expansion
+ //
+ if (((BaseAddress >= MmNonPagedPoolStart) &&
+ (BaseAddress < (PVOID)((ULONG_PTR)MmNonPagedPoolStart +
+ MmSizeOfNonPagedPoolInBytes))) ||
+ ((BaseAddress >= MmNonPagedPoolExpansionStart) &&
+ (BaseAddress < MmNonPagedPoolEnd)))
+ {
+ //
+ // It did, so just use the pool to free this
+ //
+ ExFreePool(BaseAddress);
+ return;
+ }
+
+ //
+ // Otherwise, get the PTE and page number for the allocation
+ //
+ PageFrameIndex = PFN_FROM_PTE(MiAddressToPte(BaseAddress));
+
+ //
+ // Now get the PFN entry for this, and make sure it's the correct one
+ //
+ Pfn1 = MiGetPfnEntry(PageFrameIndex);
+ if (Pfn1->u3.e1.StartOfAllocation == 0)
+ {
+ //
+ // This probably means you did a free on an address that was in between
+ //
+ KeBugCheckEx (BAD_POOL_CALLER,
+ 0x60,
+ (ULONG_PTR)BaseAddress,
+ 0,
+ 0);
+ }
+
+ //
+ // Now this PFN isn't the start of any allocation anymore, it's going out
+ //
+ StartPfn = Pfn1;
+ Pfn1->u3.e1.StartOfAllocation = 0;
+
+ //
+ // Look the PFNs
+ //
+ do
+ {
+ //
+ // Until we find the one that marks the end of the allocation
+ //
+ } while (Pfn1++->u3.e1.EndOfAllocation == 0);
+
+ //
+ // Found it, unmark it
+ //
+ Pfn1--;
+ Pfn1->u3.e1.EndOfAllocation = 0;
+
+ //
+ // Now compute how many pages this represents
+ //
+ PageCount = (ULONG)(Pfn1 - StartPfn + 1);
+
+ //
+ // So we can know how much to unmap (recall we piggyback on I/O mappings)
+ //
+ MmUnmapIoSpace(BaseAddress, PageCount << PAGE_SHIFT);
+
+ //
+ // Lock the PFN database
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+
+ //
+ // Loop all the pages
+ //
+ LastPage = PageFrameIndex + PageCount;
+ do
+ {
+ //
+ // Free each one, and move on
+ //
+ MmReleasePageMemoryConsumer(MC_NPPOOL, PageFrameIndex);
+ } while (++PageFrameIndex < LastPage);
+
+ //
+ // Release the PFN lock
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+}
+
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+/*
+ * @implemented
+ */
+PVOID
+NTAPI
+MmAllocateContiguousMemorySpecifyCache(IN SIZE_T NumberOfBytes,
+ IN PHYSICAL_ADDRESS LowestAcceptableAddress OPTIONAL,
+ IN PHYSICAL_ADDRESS HighestAcceptableAddress,
+ IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
+ IN MEMORY_CACHING_TYPE CacheType OPTIONAL)
+{
+ PFN_NUMBER LowestPfn, HighestPfn, BoundaryPfn;
+ ASSERT (NumberOfBytes != 0);
+
+ //
+ // Convert the lowest address into a PFN
+ //
+ LowestPfn = (PFN_NUMBER)(LowestAcceptableAddress.QuadPart >> PAGE_SHIFT);
+ if (BYTE_OFFSET(LowestAcceptableAddress.LowPart)) LowestPfn++;
+
+ //
+ // Convert and validate the boundary address into a PFN
+ //
+ if (BYTE_OFFSET(BoundaryAddressMultiple.LowPart)) return NULL;
+ BoundaryPfn = (PFN_NUMBER)(BoundaryAddressMultiple.QuadPart >> PAGE_SHIFT);
+
+ //
+ // Convert the highest address into a PFN
+ //
+ HighestPfn = (PFN_NUMBER)(HighestAcceptableAddress.QuadPart >> PAGE_SHIFT);
+ if (HighestPfn > MmHighestPhysicalPage) HighestPfn = MmHighestPhysicalPage;
+
+ //
+ // Validate the PFN bounds
+ //
+ if (LowestPfn > HighestPfn) return NULL;
+
+ //
+ // Let the contiguous memory allocator handle it
+ //
+ return MiAllocateContiguousMemory(NumberOfBytes,
+ LowestPfn,
+ HighestPfn,
+ BoundaryPfn,
+ CacheType);
+}
+
+/*
+ * @implemented
+ */
+PVOID
+NTAPI
+MmAllocateContiguousMemory(IN ULONG NumberOfBytes,
+ IN PHYSICAL_ADDRESS HighestAcceptableAddress)
+{
+ PFN_NUMBER HighestPfn;
+
+ //
+ // Convert and normalize the highest address into a PFN
+ //
+ HighestPfn = (PFN_NUMBER)(HighestAcceptableAddress.QuadPart >> PAGE_SHIFT);
+ if (HighestPfn > MmHighestPhysicalPage) HighestPfn = MmHighestPhysicalPage;
+
+ //
+ // Let the contiguous memory allocator handle it
+ //
+ return MiAllocateContiguousMemory(NumberOfBytes, 0, HighestPfn, 0, MmCached);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+MmFreeContiguousMemory(IN PVOID BaseAddress)
+{
+ //
+ // Let the contiguous memory allocator handle it
+ //
+ MiFreeContiguousMemory(BaseAddress);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+MmFreeContiguousMemorySpecifyCache(IN PVOID BaseAddress,
+ IN ULONG NumberOfBytes,
+ IN MEMORY_CACHING_TYPE CacheType)
+{
+ //
+ // Just call the non-cached version (there's no cache issues for freeing)
+ //
+ MiFreeContiguousMemory(BaseAddress);
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/mm/ARM3/drvmgmt.c b/reactos/ntoskrnl/mm/ARM3/drvmgmt.c
new file mode 100644
index 00000000000..ab8e9a40dde
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/drvmgmt.c
@@ -0,0 +1,325 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/drvmgmt.c
+ * PURPOSE: ARM Memory Manager Driver Management
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#line 15 "ARM³::DRVMGMT"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* GLOBALS *******************************************************************/
+
+MM_DRIVER_VERIFIER_DATA MmVerifierData;
+LIST_ENTRY MiVerifierDriverAddedThunkListHead;
+KMUTANT MmSystemLoadLock;
+ULONG MiActiveVerifierThunks;
+extern LIST_ENTRY PsLoadedModuleList;
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+PLDR_DATA_TABLE_ENTRY
+NTAPI
+MiLookupDataTableEntry(IN PVOID Address)
+{
+ PLDR_DATA_TABLE_ENTRY LdrEntry, FoundEntry = NULL;
+ PLIST_ENTRY NextEntry;
+ PAGED_CODE();
+
+ //
+ // Loop entries
+ //
+ NextEntry = PsLoadedModuleList.Flink;
+ do
+ {
+ //
+ // Get the loader entry
+ //
+ LdrEntry = CONTAINING_RECORD(NextEntry,
+ LDR_DATA_TABLE_ENTRY,
+ InLoadOrderLinks);
+
+ //
+ // Check if the address matches
+ //
+ if ((Address >= LdrEntry->DllBase) &&
+ (Address < (PVOID)((ULONG_PTR)LdrEntry->DllBase +
+ LdrEntry->SizeOfImage)))
+ {
+ //
+ // Found a match
+ //
+ FoundEntry = LdrEntry;
+ break;
+ }
+
+ //
+ // Move on
+ //
+ NextEntry = NextEntry->Flink;
+ } while(NextEntry != &PsLoadedModuleList);
+
+ //
+ // Return the entry
+ //
+ return FoundEntry;
+}
+
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+MmUnlockPageableImageSection(IN PVOID ImageSectionHandle)
+{
+ UNIMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+MmLockPageableSectionByHandle(IN PVOID ImageSectionHandle)
+{
+ UNIMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+PVOID
+NTAPI
+MmLockPageableDataSection(IN PVOID AddressWithinSection)
+{
+ //
+ // We should just find the section and call MmLockPageableSectionByHandle
+ //
+ UNIMPLEMENTED;
+ return AddressWithinSection;
+}
+
+/*
+ * @unimplemented
+ */
+PVOID
+NTAPI
+MmPageEntireDriver(IN PVOID AddressWithinSection)
+{
+ //
+ // We should find the driver loader entry and return its base address
+ //
+ PLDR_DATA_TABLE_ENTRY pLdrDataTabEntry = MiLookupDataTableEntry(AddressWithinSection);
+ if (pLdrDataTabEntry) return pLdrDataTabEntry->DllBase;
+ return NULL;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+MmResetDriverPaging(IN PVOID AddressWithinSection)
+{
+ UNIMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+ULONG
+NTAPI
+MmTrimAllSystemPageableMemory(IN ULONG PurgeTransitionList)
+{
+ UNIMPLEMENTED;
+ return 0;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+MmAddVerifierThunks(IN PVOID ThunkBuffer,
+ IN ULONG ThunkBufferSize)
+{
+ PDRIVER_VERIFIER_THUNK_PAIRS ThunkTable;
+ ULONG ThunkCount;
+ PDRIVER_SPECIFIED_VERIFIER_THUNKS DriverThunks;
+ PLDR_DATA_TABLE_ENTRY LdrEntry;
+ PVOID ModuleBase, ModuleEnd;
+ ULONG i;
+ NTSTATUS Status = STATUS_SUCCESS;
+ PAGED_CODE();
+
+ //
+ // Make sure the driver verifier is initialized
+ //
+ if (!MiVerifierDriverAddedThunkListHead.Flink) return STATUS_NOT_SUPPORTED;
+
+ //
+ // Get the thunk pairs and count them
+ //
+ ThunkCount = ThunkBufferSize / sizeof(DRIVER_VERIFIER_THUNK_PAIRS);
+ if (!ThunkCount) return STATUS_INVALID_PARAMETER_1;
+
+ //
+ // Now allocate our own thunk table
+ //
+ DriverThunks = ExAllocatePoolWithTag(PagedPool,
+ sizeof(*DriverThunks) +
+ ThunkCount *
+ sizeof(DRIVER_VERIFIER_THUNK_PAIRS),
+ 'tVmM');
+ if (!DriverThunks) return STATUS_INSUFFICIENT_RESOURCES;
+
+ //
+ // Now copy the driver-fed part
+ //
+ ThunkTable = (PDRIVER_VERIFIER_THUNK_PAIRS)(DriverThunks + 1);
+ RtlCopyMemory(ThunkTable,
+ ThunkBuffer,
+ ThunkCount * sizeof(DRIVER_VERIFIER_THUNK_PAIRS));
+
+ //
+ // Acquire the system load lock
+ //
+ KeEnterCriticalRegion();
+ KeWaitForSingleObject(&MmSystemLoadLock,
+ WrVirtualMemory,
+ KernelMode,
+ FALSE,
+ NULL);
+
+ //
+ // Get the loader entry
+ //
+ LdrEntry = MiLookupDataTableEntry(ThunkTable->PristineRoutine);
+ if (!LdrEntry)
+ {
+ //
+ // Fail
+ //
+ Status = STATUS_INVALID_PARAMETER_2;
+ goto Cleanup;
+ }
+
+ //
+ // Get driver base and end
+ //
+ ModuleBase = LdrEntry->DllBase;
+ ModuleEnd = (PVOID)((ULONG_PTR)LdrEntry->DllBase + LdrEntry->SizeOfImage);
+
+ //
+ // Don't allow hooking the kernel or HAL
+ //
+ if (ModuleBase < (PVOID)(KSEG0_BASE + MmBootImageSize))
+ {
+ //
+ // Fail
+ //
+ Status = STATUS_INVALID_PARAMETER_2;
+ goto Cleanup;
+ }
+
+ //
+ // Loop all the thunks
+ //
+ for (i = 0; i < ThunkCount; i++)
+ {
+ //
+ // Make sure it's in the driver
+ //
+ if (((ULONG_PTR)ThunkTable->PristineRoutine < (ULONG_PTR)ModuleBase) ||
+ ((ULONG_PTR)ThunkTable->PristineRoutine >= (ULONG_PTR)ModuleEnd))
+ {
+ //
+ // Nope, fail
+ //
+ Status = STATUS_INVALID_PARAMETER_2;
+ goto Cleanup;
+ }
+ }
+
+ //
+ // Otherwise, add this entry
+ //
+ DriverThunks->DataTableEntry = LdrEntry;
+ DriverThunks->NumberOfThunks = ThunkCount;
+ MiActiveVerifierThunks++;
+ InsertTailList(&MiVerifierDriverAddedThunkListHead,
+ &DriverThunks->ListEntry);
+ DriverThunks = NULL;
+
+Cleanup:
+ //
+ // Release the lock
+ //
+ KeReleaseMutant(&MmSystemLoadLock, 1, FALSE, FALSE);
+ KeLeaveCriticalRegion();
+
+ //
+ // Free the table if we failed and return status
+ //
+ if (DriverThunks) ExFreePool(DriverThunks);
+ return Status;
+}
+
+/*
+ * @implemented
+ */
+LOGICAL
+NTAPI
+MmIsDriverVerifying(IN PDRIVER_OBJECT DriverObject)
+{
+ PLDR_DATA_TABLE_ENTRY LdrEntry;
+
+ //
+ // Get the loader entry
+ //
+ LdrEntry = (PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection;
+ if (!LdrEntry) return FALSE;
+
+ //
+ // Check if we're verifying or not
+ //
+ return (LdrEntry->Flags & LDRP_IMAGE_VERIFYING) ? TRUE: FALSE;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+MmIsVerifierEnabled(OUT PULONG VerifierFlags)
+{
+ //
+ // Check if we've actually added anything to the list
+ //
+ if (MiVerifierDriverAddedThunkListHead.Flink)
+ {
+ //
+ // We have, read the verifier level
+ //
+ *VerifierFlags = MmVerifierData.Level;
+ return STATUS_SUCCESS;
+ }
+
+ //
+ // Otherwise, we're disabled
+ //
+ *VerifierFlags = 0;
+ return STATUS_NOT_SUPPORTED;
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/mm/ARM3/dynamic.c b/reactos/ntoskrnl/mm/ARM3/dynamic.c
new file mode 100644
index 00000000000..3f7cf727e58
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/dynamic.c
@@ -0,0 +1,127 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/dynamic.c
+ * PURPOSE: ARM Memory Manager Dynamic Physical Memory Support
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#line 15 "ARM³::DYNAMIC"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* FUNCTIONS *****************************************************************/
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+MmAddPhysicalMemory (IN PPHYSICAL_ADDRESS StartAddress,
+ IN OUT PLARGE_INTEGER NumberOfBytes)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+MmMarkPhysicalMemoryAsBad(IN PPHYSICAL_ADDRESS StartAddress,
+ IN OUT PLARGE_INTEGER NumberOfBytes)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+MmMarkPhysicalMemoryAsGood(IN PPHYSICAL_ADDRESS StartAddress,
+ IN OUT PLARGE_INTEGER NumberOfBytes)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+MmRemovePhysicalMemory(IN PPHYSICAL_ADDRESS StartAddress,
+ IN OUT PLARGE_INTEGER NumberOfBytes)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @implemented
+ */
+PPHYSICAL_MEMORY_RANGE
+NTAPI
+MmGetPhysicalMemoryRanges(VOID)
+{
+ ULONG Size, i;
+ PPHYSICAL_MEMORY_RANGE Entry, Buffer;
+ KIRQL OldIrql;
+ ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
+
+ //
+ // Calculate how much memory we'll need
+ //
+ Size = sizeof(PHYSICAL_MEMORY_RANGE) * (MmPhysicalMemoryBlock->NumberOfRuns + 1);
+
+ //
+ // Allocate a copy
+ //
+ Entry = Buffer = ExAllocatePoolWithTag(NonPagedPool, Size, 'hPmM');
+ if (!Buffer) return NULL;
+
+ //
+ // Lock the PFN database
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+
+ //
+ // Make sure it hasn't changed before we had acquired the lock
+ //
+ ASSERT(Size == (sizeof(PHYSICAL_MEMORY_RANGE) *
+ (MmPhysicalMemoryBlock->NumberOfRuns + 1)));
+
+ //
+ // Now loop our block
+ //
+ for (i = 0; i < MmPhysicalMemoryBlock->NumberOfRuns; i++)
+ {
+ //
+ // Copy the data, but format it into bytes
+ //
+ Entry->BaseAddress.QuadPart = MmPhysicalMemoryBlock->Run[i].BasePage << PAGE_SHIFT;
+ Entry->NumberOfBytes.QuadPart = MmPhysicalMemoryBlock->Run[i].PageCount << PAGE_SHIFT;
+ Entry++;
+ }
+
+ //
+ // Last entry is empty
+ //
+ Entry->BaseAddress.QuadPart = 0;
+ Entry->NumberOfBytes.QuadPart = 0;
+
+ //
+ // Release the lock and return
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+ return Buffer;
+}
diff --git a/reactos/ntoskrnl/mm/ARM3/expool.c b/reactos/ntoskrnl/mm/ARM3/expool.c
new file mode 100644
index 00000000000..75f4e48d07d
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/expool.c
@@ -0,0 +1,85 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/expool.c
+ * PURPOSE: ARM Memory Manager Executive Pool Manager
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#line 15 "ARM³::EXPOOL"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* GLOBALS ********************************************************************/
+
+POOL_DESCRIPTOR NonPagedPoolDescriptor;
+PPOOL_DESCRIPTOR PoolVector[2];
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+VOID
+NTAPI
+ExInitializePoolDescriptor(IN PPOOL_DESCRIPTOR PoolDescriptor,
+ IN POOL_TYPE PoolType,
+ IN ULONG PoolIndex,
+ IN ULONG Threshold,
+ IN PVOID PoolLock)
+{
+ PLIST_ENTRY NextEntry, LastEntry;
+
+ //
+ // Setup the descriptor based on the caller's request
+ //
+ PoolDescriptor->PoolType = PoolType;
+ PoolDescriptor->PoolIndex = PoolIndex;
+ PoolDescriptor->Threshold = Threshold;
+ PoolDescriptor->LockAddress = PoolLock;
+
+ //
+ // Initialize accounting data
+ //
+ PoolDescriptor->RunningAllocs = 0;
+ PoolDescriptor->RunningDeAllocs = 0;
+ PoolDescriptor->TotalPages = 0;
+ PoolDescriptor->TotalBytes = 0;
+ PoolDescriptor->TotalBigPages = 0;
+
+ //
+ // Nothing pending for now
+ //
+ PoolDescriptor->PendingFrees = NULL;
+ PoolDescriptor->PendingFreeDepth = 0;
+
+ //
+ // Loop all the descriptor's allocation lists and initialize them
+ //
+ NextEntry = PoolDescriptor->ListHeads;
+ LastEntry = NextEntry + POOL_LISTS_PER_PAGE;
+ while (NextEntry < LastEntry) InitializeListHead(NextEntry++);
+}
+
+VOID
+NTAPI
+InitializePool(IN POOL_TYPE PoolType,
+ IN ULONG Threshold)
+{
+ ASSERT(PoolType == NonPagedPool);
+
+ //
+ // Initialize the nonpaged pool descirptor
+ //
+ PoolVector[PoolType] = &NonPagedPoolDescriptor;
+ ExInitializePoolDescriptor(PoolVector[PoolType],
+ PoolType,
+ 0,
+ Threshold,
+ NULL);
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/mm/ARM3/hypermap.c b/reactos/ntoskrnl/mm/ARM3/hypermap.c
new file mode 100644
index 00000000000..29d44893e5d
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/hypermap.c
@@ -0,0 +1,214 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/hypermap.c
+ * PURPOSE: ARM Memory Manager Hyperspace Mapping Functionality
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#line 15 "ARM³::HYPERMAP"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* GLOBALS ********************************************************************/
+
+PMMPTE MmFirstReservedMappingPte, MmLastReservedMappingPte;
+PMMPTE MiFirstReservedZeroingPte;
+MMPTE HyperTemplatePte;
+PEPROCESS HyperProcess;
+KIRQL HyperIrql;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+PVOID
+NTAPI
+MiMapPageInHyperSpace(IN PEPROCESS Process,
+ IN PFN_NUMBER Page,
+ IN PKIRQL OldIrql)
+{
+ MMPTE TempPte;
+ PMMPTE PointerPte;
+ PFN_NUMBER Offset;
+
+ //
+ // Never accept page 0 or non-physical pages
+ //
+ ASSERT(Page != 0);
+ ASSERT(MiGetPfnEntry(Page) != NULL);
+
+ //
+ // Build the PTE
+ //
+ TempPte = HyperTemplatePte;
+ TempPte.u.Hard.PageFrameNumber = Page;
+ MI_MAKE_LOCAL_PAGE(&TempPte); // Hyperspace is local!
+
+ //
+ // Pick the first hyperspace PTE
+ //
+ PointerPte = MmFirstReservedMappingPte;
+
+ //
+ // Acquire the hyperlock
+ //
+ ASSERT(Process == PsGetCurrentProcess());
+ KeAcquireSpinLock(&Process->HyperSpaceLock, OldIrql);
+
+ //
+ // Now get the first free PTE
+ //
+ Offset = PFN_FROM_PTE(PointerPte);
+ if (!Offset)
+ {
+ //
+ // Reset the PTEs
+ //
+ Offset = MI_HYPERSPACE_PTES;
+ KeFlushProcessTb();
+ }
+
+ //
+ // Prepare the next PTE
+ //
+ PointerPte->u.Hard.PageFrameNumber = Offset - 1;
+
+ //
+ // Write the current PTE
+ //
+ PointerPte += Offset;
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+ ASSERT(TempPte.u.Hard.Valid == 1);
+ *PointerPte = TempPte;
+
+ //
+ // Return the address
+ //
+ return MiPteToAddress(PointerPte);
+}
+
+VOID
+NTAPI
+MiUnmapPageInHyperSpace(IN PEPROCESS Process,
+ IN PVOID Address,
+ IN KIRQL OldIrql)
+{
+ ASSERT(Process == PsGetCurrentProcess());
+
+ //
+ // Blow away the mapping
+ //
+ MiAddressToPte(Address)->u.Long = 0;
+
+ //
+ // Release the hyperlock
+ //
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+ KeReleaseSpinLock(&Process->HyperSpaceLock, OldIrql);
+}
+
+PVOID
+NTAPI
+MiMapPagesToZeroInHyperSpace(IN PMMPFN *Pages,
+ IN PFN_NUMBER NumberOfPages)
+{
+ MMPTE TempPte;
+ PMMPTE PointerPte;
+ PFN_NUMBER Offset, PageFrameIndex;
+ PMMPFN Page;
+
+ //
+ // Sanity checks
+ //
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+ ASSERT(NumberOfPages != 0);
+ ASSERT(NumberOfPages <= (MI_ZERO_PTES - 1));
+
+ //
+ // Pick the first zeroing PTE
+ //
+ PointerPte = MiFirstReservedZeroingPte;
+
+ //
+ // Now get the first free PTE
+ //
+ Offset = PFN_FROM_PTE(PointerPte);
+ if (NumberOfPages > Offset)
+ {
+ //
+ // Reset the PTEs
+ //
+ Offset = MI_ZERO_PTES - 1;
+ PointerPte->u.Hard.PageFrameNumber = Offset;
+ KeFlushProcessTb();
+ }
+
+ //
+ // Prepare the next PTE
+ //
+ PointerPte->u.Hard.PageFrameNumber = Offset - NumberOfPages;
+
+ //
+ // Write the current PTE
+ //
+ PointerPte += (Offset + 1);
+ TempPte = HyperTemplatePte;
+ MI_MAKE_LOCAL_PAGE(&TempPte); // Hyperspace is local!
+ do
+ {
+ //
+ // Get the first page entry and its PFN
+ //
+ Page = *Pages++;
+ PageFrameIndex = MiGetPfnEntryIndex(Page);
+
+ //
+ // Write the PFN
+ //
+ TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
+
+ //
+ // Set the correct PTE to write to, and set its new value
+ //
+ PointerPte--;
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+ ASSERT(TempPte.u.Hard.Valid == 1);
+ *PointerPte = TempPte;
+ } while (--NumberOfPages);
+
+ //
+ // Return the address
+ //
+ return MiPteToAddress(PointerPte);
+}
+
+VOID
+NTAPI
+MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress,
+ IN PFN_NUMBER NumberOfPages)
+{
+ PMMPTE PointerPte;
+
+ //
+ // Sanity checks
+ //
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+ ASSERT (NumberOfPages != 0);
+ ASSERT (NumberOfPages <= (MI_ZERO_PTES - 1));
+
+ //
+ // Get the first PTE for the mapped zero VA
+ //
+ PointerPte = MiAddressToPte(VirtualAddress);
+
+ //
+ // Blow away the mapped zero PTEs
+ //
+ RtlZeroMemory(PointerPte, NumberOfPages * sizeof(MMPTE));
+}
+
diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c
new file mode 100644
index 00000000000..e053754ff7a
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c
@@ -0,0 +1,1462 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/i386/init.c
+ * PURPOSE: ARM Memory Manager Initialization for x86
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#line 15 "ARM³::INIT"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../../ARM3/miarm.h"
+
+/* GLOBALS ********************************************************************/
+
+//
+// These are all registry-configurable, but by default, the memory manager will
+// figure out the most appropriate values.
+//
+ULONG MmMaximumNonPagedPoolPercent;
+ULONG MmSizeOfNonPagedPoolInBytes;
+ULONG MmMaximumNonPagedPoolInBytes;
+
+//
+// These numbers describe the discrete equation components of the nonpaged
+// pool sizing algorithm.
+//
+// They are described on http://support.microsoft.com/default.aspx/kb/126402/ja
+// along with the algorithm that uses them, which is implemented later below.
+//
+ULONG MmMinimumNonPagedPoolSize = 256 * 1024;
+ULONG MmMinAdditionNonPagedPoolPerMb = 32 * 1024;
+ULONG MmDefaultMaximumNonPagedPool = 1024 * 1024;
+ULONG MmMaxAdditionNonPagedPoolPerMb = 400 * 1024;
+
+//
+// The memory layout (and especially variable names) of the NT kernel mode
+// components can be a bit hard to twig, especially when it comes to the non
+// paged area.
+//
+// There are really two components to the non-paged pool:
+//
+// - The initial nonpaged pool, sized dynamically up to a maximum.
+// - The expansion nonpaged pool, sized dynamically up to a maximum.
+//
+// The initial nonpaged pool is physically continuous for performance, and
+// immediately follows the PFN database, typically sharing the same PDE. It is
+// a very small resource (32MB on a 1GB system), and capped at 128MB.
+//
+// Right now we call this the "ARM³ Nonpaged Pool" and it begins somewhere after
+// the PFN database (which starts at 0xB0000000).
+//
+// The expansion nonpaged pool, on the other hand, can grow much bigger (400MB
+// for a 1GB system). On ARM³ however, it is currently capped at 128MB.
+//
+// The address where the initial nonpaged pool starts is aptly named
+// MmNonPagedPoolStart, and it describes a range of MmSizeOfNonPagedPoolInBytes
+// bytes.
+//
+// Expansion nonpaged pool starts at an address described by the variable called
+// MmNonPagedPoolExpansionStart, and it goes on for MmMaximumNonPagedPoolInBytes
+// minus MmSizeOfNonPagedPoolInBytes bytes, always reaching MmNonPagedPoolEnd
+// (because of the way it's calculated) at 0xFFBE0000.
+//
+// Initial nonpaged pool is allocated and mapped early-on during boot, but what
+// about the expansion nonpaged pool? It is instead composed of special pages
+// which belong to what are called System PTEs. These PTEs are the matter of a
+// later discussion, but they are also considered part of the "nonpaged" OS, due
+// to the fact that they are never paged out -- once an address is described by
+// a System PTE, it is always valid, until the System PTE is torn down.
+//
+// System PTEs are actually composed of two "spaces", the system space proper,
+// and the nonpaged pool expansion space. The latter, as we've already seen,
+// begins at MmNonPagedPoolExpansionStart. Based on the number of System PTEs
+// that the system will support, the remaining address space below this address
+// is used to hold the system space PTEs. This address, in turn, is held in the
+// variable named MmNonPagedSystemStart, which itself is never allowed to go
+// below 0xEB000000 (thus creating an upper bound on the number of System PTEs).
+//
+// This means that 330MB are reserved for total nonpaged system VA, on top of
+// whatever the initial nonpaged pool allocation is.
+//
+// The following URLs, valid as of April 23rd, 2008, support this evidence:
+//
+// http://www.cs.miami.edu/~burt/journal/NT/memory.html
+// http://www.ditii.com/2007/09/28/windows-memory-management-x86-virtual-address-space/
+//
+PVOID MmNonPagedSystemStart;
+PVOID MmNonPagedPoolStart;
+PVOID MmNonPagedPoolExpansionStart;
+PVOID MmNonPagedPoolEnd = MI_NONPAGED_POOL_END;
+
+//
+// Old ReactOS Mm nonpaged pool
+//
+extern PVOID MiNonPagedPoolStart;
+extern ULONG MiNonPagedPoolLength;
+
+//
+// This is where paged pool starts by default
+//
+PVOID MmPagedPoolStart = MI_PAGED_POOL_START;
+PVOID MmPagedPoolEnd;
+
+//
+// And this is its default size
+//
+ULONG MmSizeOfPagedPoolInBytes = MI_MIN_INIT_PAGED_POOLSIZE;
+PFN_NUMBER MmSizeOfPagedPoolInPages = MI_MIN_INIT_PAGED_POOLSIZE / PAGE_SIZE;
+
+//
+// Session space starts at 0xBFFFFFFF and grows downwards
+// By default, it includes an 8MB image area where we map win32k and video card
+// drivers, followed by a 4MB area containing the session's working set. This is
+// then followed by a 20MB mapped view area and finally by the session's paged
+// pool, by default 16MB.
+//
+// On a normal system, this results in session space occupying the region from
+// 0xBD000000 to 0xC0000000
+//
+// See miarm.h for the defines that determine the sizing of this region. On an
+// NT system, some of these can be configured through the registry, but we don't
+// support that yet.
+//
+PVOID MiSessionSpaceEnd; // 0xC0000000
+PVOID MiSessionImageEnd; // 0xC0000000
+PVOID MiSessionImageStart; // 0xBF800000
+PVOID MiSessionViewStart; // 0xBE000000
+PVOID MiSessionPoolEnd; // 0xBE000000
+PVOID MiSessionPoolStart; // 0xBD000000
+PVOID MmSessionBase; // 0xBD000000
+ULONG MmSessionSize;
+ULONG MmSessionViewSize;
+ULONG MmSessionPoolSize;
+ULONG MmSessionImageSize;
+
+//
+// The system view space, on the other hand, is where sections that are memory
+// mapped into "system space" end up.
+//
+// By default, it is a 16MB region.
+//
+PVOID MiSystemViewStart;
+ULONG MmSystemViewSize;
+
+//
+// A copy of the system page directory (the page directory associated with the
+// System process) is kept (double-mapped) by the manager in order to lazily
+// map paged pool PDEs into external processes when they fault on a paged pool
+// address.
+//
+PFN_NUMBER MmSystemPageDirectory;
+PMMPTE MmSystemPagePtes;
+
+//
+// Windows NT seems to choose between 7000, 11000 and 50000
+// On systems with more than 32MB, this number is then doubled, and further
+// aligned up to a PDE boundary (4MB).
+//
+ULONG MmNumberOfSystemPtes;
+
+//
+// This is how many pages the PFN database will take up
+// In Windows, this includes the Quark Color Table, but not in ARM³
+//
+ULONG MxPfnAllocation;
+
+//
+// Unlike the old ReactOS Memory Manager, ARM³ (and Windows) does not keep track
+// of pages that are not actually valid physical memory, such as ACPI reserved
+// regions, BIOS address ranges, or holes in physical memory address space which
+// could indicate device-mapped I/O memory.
+//
+// In fact, the lack of a PFN entry for a page usually indicates that this is
+// I/O space instead.
+//
+// A bitmap, called the PFN bitmap, keeps track of all page frames by assigning
+// a bit to each. If the bit is set, then the page is valid physical RAM.
+//
+RTL_BITMAP MiPfnBitMap;
+
+//
+// This structure describes the different pieces of RAM-backed address space
+//
+PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;
+
+//
+// Before we have a PFN database, memory comes straight from our physical memory
+// blocks, which is nice because it's guaranteed contiguous and also because once
+// we take a page from here, the system doesn't see it anymore.
+// However, once the fun is over, those pages must be re-integrated back into
+// PFN society life, and that requires us keeping a copy of the original layout
+// so that we can parse it later.
+//
+PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor;
+MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor;
+
+//
+// This is where we keep track of the most basic physical layout markers
+//
+ULONG MmNumberOfPhysicalPages, MmHighestPhysicalPage, MmLowestPhysicalPage = -1;
+
+//
+// The total number of pages mapped by the boot loader, which include the kernel
+// HAL, boot drivers, registry, NLS files and other loader data structures is
+// kept track of here. This depends on "LoaderPagesSpanned" being correct when
+// coming from the loader.
+//
+// This number is later aligned up to a PDE boundary.
+//
+ULONG MmBootImageSize;
+
+//
+// These three variables keep track of the core separation of address space that
+// exists between kernel mode and user mode.
+//
+ULONG MmUserProbeAddress;
+PVOID MmHighestUserAddress;
+PVOID MmSystemRangeStart;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+//
+// In Bavaria, this is probably a hate crime
+//
+VOID
+FASTCALL
+MiSyncARM3WithROS(IN PVOID AddressStart,
+ IN PVOID AddressEnd)
+{
+ //
+ // Puerile piece of junk-grade carbonized horseshit puss sold to the lowest bidder
+ //
+ ULONG Pde = ADDR_TO_PDE_OFFSET(AddressStart);
+ while (Pde <= ADDR_TO_PDE_OFFSET(AddressEnd))
+ {
+ //
+ // This both odious and heinous
+ //
+ extern ULONG MmGlobalKernelPageDirectory[1024];
+ MmGlobalKernelPageDirectory[Pde] = ((PULONG)PDE_BASE)[Pde];
+ Pde++;
+ }
+}
+
+PFN_NUMBER
+NTAPI
+MxGetNextPage(IN PFN_NUMBER PageCount)
+{
+ PFN_NUMBER Pfn;
+
+ //
+ // Make sure we have enough pages
+ //
+ if (PageCount > MxFreeDescriptor->PageCount)
+ {
+ //
+ // Crash the system
+ //
+ KeBugCheckEx(INSTALL_MORE_MEMORY,
+ MmNumberOfPhysicalPages,
+ MxFreeDescriptor->PageCount,
+ MxOldFreeDescriptor.PageCount,
+ PageCount);
+ }
+
+ //
+ // Use our lowest usable free pages
+ //
+ Pfn = MxFreeDescriptor->BasePage;
+ MxFreeDescriptor->BasePage += PageCount;
+ MxFreeDescriptor->PageCount -= PageCount;
+ return Pfn;
+}
+
+PPHYSICAL_MEMORY_DESCRIPTOR
+NTAPI
+MmInitializeMemoryLimits(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
+ IN PBOOLEAN IncludeType)
+{
+ PLIST_ENTRY NextEntry;
+ ULONG Run = 0, InitialRuns = 0;
+ PFN_NUMBER NextPage = -1, PageCount = 0;
+ PPHYSICAL_MEMORY_DESCRIPTOR Buffer, NewBuffer;
+ PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
+
+ //
+ // Scan the memory descriptors
+ //
+ NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
+ while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+ {
+ //
+ // For each one, increase the memory allocation estimate
+ //
+ InitialRuns++;
+ NextEntry = NextEntry->Flink;
+ }
+
+ //
+ // Allocate the maximum we'll ever need
+ //
+ Buffer = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(PHYSICAL_MEMORY_DESCRIPTOR) +
+ sizeof(PHYSICAL_MEMORY_RUN) *
+ (InitialRuns - 1),
+ 'lMmM');
+ if (!Buffer) return NULL;
+
+ //
+ // For now that's how many runs we have
+ //
+ Buffer->NumberOfRuns = InitialRuns;
+
+ //
+ // Now loop through the descriptors again
+ //
+ NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
+ while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+ {
+ //
+ // Grab each one, and check if it's one we should include
+ //
+ MdBlock = CONTAINING_RECORD(NextEntry,
+ MEMORY_ALLOCATION_DESCRIPTOR,
+ ListEntry);
+ if ((MdBlock->MemoryType < LoaderMaximum) &&
+ (IncludeType[MdBlock->MemoryType]))
+ {
+ //
+ // Add this to our running total
+ //
+ PageCount += MdBlock->PageCount;
+
+ //
+ // Check if the next page is described by the next descriptor
+ //
+ if (MdBlock->BasePage == NextPage)
+ {
+ //
+ // Combine it into the same physical run
+ //
+ ASSERT(MdBlock->PageCount != 0);
+ Buffer->Run[Run - 1].PageCount += MdBlock->PageCount;
+ NextPage += MdBlock->PageCount;
+ }
+ else
+ {
+ //
+ // Otherwise just duplicate the descriptor's contents
+ //
+ Buffer->Run[Run].BasePage = MdBlock->BasePage;
+ Buffer->Run[Run].PageCount = MdBlock->PageCount;
+ NextPage = Buffer->Run[Run].BasePage + Buffer->Run[Run].PageCount;
+
+ //
+ // And in this case, increase the number of runs
+ //
+ Run++;
+ }
+ }
+
+ //
+ // Try the next descriptor
+ //
+ NextEntry = MdBlock->ListEntry.Flink;
+ }
+
+ //
+ // We should not have been able to go past our initial estimate
+ //
+ ASSERT(Run <= Buffer->NumberOfRuns);
+
+ //
+ // Our guess was probably exaggerated...
+ //
+ if (InitialRuns > Run)
+ {
+ //
+ // Allocate a more accurately sized buffer
+ //
+ NewBuffer = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(PHYSICAL_MEMORY_DESCRIPTOR) +
+ sizeof(PHYSICAL_MEMORY_RUN) *
+ (Run - 1),
+ 'lMmM');
+ if (NewBuffer)
+ {
+ //
+ // Copy the old buffer into the new, then free it
+ //
+ RtlCopyMemory(NewBuffer->Run,
+ Buffer->Run,
+ sizeof(PHYSICAL_MEMORY_RUN) * Run);
+ ExFreePool(Buffer);
+
+ //
+ // Now use the new buffer
+ //
+ Buffer = NewBuffer;
+ }
+ }
+
+ //
+ // Write the final numbers, and return it
+ //
+ Buffer->NumberOfRuns = Run;
+ Buffer->NumberOfPages = PageCount;
+ return Buffer;
+}
+
+VOID
+NTAPI
+MiBuildPagedPool(VOID)
+{
+ PMMPTE PointerPte, PointerPde;
+ MMPTE TempPte = HyperTemplatePte;
+ PFN_NUMBER PageFrameIndex;
+ KIRQL OldIrql;
+ ULONG Size, BitMapSize;
+
+ //
+ // Get the page frame number for the system page directory
+ //
+ PointerPte = MiAddressToPte(PDE_BASE);
+ MmSystemPageDirectory = PFN_FROM_PTE(PointerPte);
+
+ //
+ // Allocate a system PTE which will hold a copy of the page directory
+ //
+ PointerPte = MiReserveSystemPtes(1, SystemPteSpace);
+ ASSERT(PointerPte);
+ MmSystemPagePtes = MiPteToAddress(PointerPte);
+
+ //
+ // Make this system PTE point to the system page directory.
+ // It is now essentially double-mapped. This will be used later for lazy
+ // evaluation of PDEs accross process switches, similarly to how the Global
+ // page directory array in the old ReactOS Mm is used (but in a less hacky
+ // way).
+ //
+ TempPte = HyperTemplatePte;
+ TempPte.u.Hard.PageFrameNumber = MmSystemPageDirectory;
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+ ASSERT(TempPte.u.Hard.Valid == 1);
+ *PointerPte = TempPte;
+
+ //
+ // Let's get back to paged pool work: size it up.
+ // By default, it should be twice as big as nonpaged pool.
+ //
+ MmSizeOfPagedPoolInBytes = 2 * MmMaximumNonPagedPoolInBytes;
+ if (MmSizeOfPagedPoolInBytes > ((ULONG_PTR)MmNonPagedSystemStart -
+ (ULONG_PTR)MmPagedPoolStart))
+ {
+ //
+ // On the other hand, we have limited VA space, so make sure that the VA
+ // for paged pool doesn't overflow into nonpaged pool VA. Otherwise, set
+ // whatever maximum is possible.
+ //
+ MmSizeOfPagedPoolInBytes = (ULONG_PTR)MmNonPagedSystemStart -
+ (ULONG_PTR)MmPagedPoolStart;
+ }
+
+ //
+ // Get the size in pages and make sure paged pool is at least 32MB.
+ //
+ Size = MmSizeOfPagedPoolInBytes;
+ if (Size < MI_MIN_INIT_PAGED_POOLSIZE) Size = MI_MIN_INIT_PAGED_POOLSIZE;
+ Size = BYTES_TO_PAGES(Size);
+
+ //
+ // Now check how many PTEs will be required for these many pages.
+ //
+ Size = (Size + (1024 - 1)) / 1024;
+
+ //
+ // Recompute the page-aligned size of the paged pool, in bytes and pages.
+ //
+ MmSizeOfPagedPoolInBytes = Size * PAGE_SIZE * 1024;
+ MmSizeOfPagedPoolInPages = MmSizeOfPagedPoolInBytes >> PAGE_SHIFT;
+
+ //
+ // Let's be really sure this doesn't overflow into nonpaged system VA
+ //
+ ASSERT((MmSizeOfPagedPoolInBytes + (ULONG_PTR)MmPagedPoolStart) <=
+ (ULONG_PTR)MmNonPagedSystemStart);
+
+ //
+ // This is where paged pool ends
+ //
+ MmPagedPoolEnd = (PVOID)(((ULONG_PTR)MmPagedPoolStart +
+ MmSizeOfPagedPoolInBytes) - 1);
+
+ //
+ // So now get the PDE for paged pool and zero it out
+ //
+ PointerPde = MiAddressToPde(MmPagedPoolStart);
+ RtlZeroMemory(PointerPde,
+ (1 + MiAddressToPde(MmPagedPoolEnd) - PointerPde) * sizeof(MMPTE));
+
+ //
+ // Next, get the first and last PTE
+ //
+ PointerPte = MiAddressToPte(MmPagedPoolStart);
+ MmPagedPoolInfo.FirstPteForPagedPool = PointerPte;
+ MmPagedPoolInfo.LastPteForPagedPool = MiAddressToPte(MmPagedPoolEnd);
+
+ //
+ // Lock the PFN database
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+
+ //
+ // Allocate a page and map the first paged pool PDE
+ //
+ PageFrameIndex = MmAllocPage(MC_NPPOOL, 0);
+ TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
+ ASSERT(PointerPde->u.Hard.Valid == 0);
+ ASSERT(TempPte.u.Hard.Valid == 1);
+ *PointerPde = TempPte;
+
+ //
+ // Release the PFN database lock
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+
+ //
+ // We only have one PDE mapped for now... at fault time, additional PDEs
+ // will be allocated to handle paged pool growth. This is where they'll have
+ // to start.
+ //
+ MmPagedPoolInfo.NextPdeForPagedPoolExpansion = PointerPde + 1;
+
+ //
+ // We keep track of each page via a bit, so check how big the bitmap will
+ // have to be (make sure to align our page count such that it fits nicely
+ // into a 4-byte aligned bitmap.
+ //
+ // We'll also allocate the bitmap header itself part of the same buffer.
+ //
+ Size = Size * 1024;
+ ASSERT(Size == MmSizeOfPagedPoolInPages);
+ BitMapSize = sizeof(RTL_BITMAP) + (((Size + 31) / 32) * sizeof(ULONG));
+
+ //
+ // Allocate the allocation bitmap, which tells us which regions have not yet
+ // been mapped into memory
+ //
+ MmPagedPoolInfo.PagedPoolAllocationMap = ExAllocatePoolWithTag(NonPagedPool,
+ BitMapSize,
+ ' mM');
+ ASSERT(MmPagedPoolInfo.PagedPoolAllocationMap);
+
+ //
+ // Initialize it such that at first, only the first page's worth of PTEs is
+ // marked as allocated (incidentially, the first PDE we allocated earlier).
+ //
+ RtlInitializeBitMap(MmPagedPoolInfo.PagedPoolAllocationMap,
+ (PULONG)(MmPagedPoolInfo.PagedPoolAllocationMap + 1),
+ BitMapSize);
+ RtlSetAllBits(MmPagedPoolInfo.PagedPoolAllocationMap);
+ RtlClearBits(MmPagedPoolInfo.PagedPoolAllocationMap, 0, 1024);
+
+ //
+ // We have a second bitmap, which keeps track of where allocations end.
+ // Given the allocation bitmap and a base address, we can therefore figure
+ // out which page is the last page of that allocation, and thus how big the
+ // entire allocation is.
+ //
+ MmPagedPoolInfo.EndOfPagedPoolBitmap = ExAllocatePoolWithTag(NonPagedPool,
+ BitMapSize,
+ ' mM');
+ ASSERT(MmPagedPoolInfo.EndOfPagedPoolBitmap);
+ RtlInitializeBitMap(MmPagedPoolInfo.EndOfPagedPoolBitmap,
+ (PULONG)(MmPagedPoolInfo.EndOfPagedPoolBitmap + 1),
+ BitMapSize);
+
+ //
+ // Since no allocations have been made yet, there are no bits set as the end
+ //
+ RtlClearAllBits(MmPagedPoolInfo.EndOfPagedPoolBitmap);
+
+ //
+ // Initialize paged pool.
+ //
+ //InitializePool(PagedPool, 0);
+}
+
+NTSTATUS
+NTAPI
+MmArmInitSystem(IN ULONG Phase,
+ IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+ PLIST_ENTRY NextEntry;
+ PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
+ ULONG FreePages = 0;
+ PMEMORY_AREA MArea;
+ PHYSICAL_ADDRESS BoundaryAddressMultiple;
+ PFN_NUMBER PageFrameIndex;
+ PMMPTE StartPde, EndPde, PointerPte, LastPte;
+ MMPTE TempPde = HyperTemplatePte, TempPte = HyperTemplatePte;
+ PVOID NonPagedPoolExpansionVa, BaseAddress;
+ NTSTATUS Status;
+ ULONG OldCount;
+ BOOLEAN IncludeType[LoaderMaximum];
+ ULONG i;
+ PVOID Bitmap;
+ PPHYSICAL_MEMORY_RUN Run;
+ PFN_NUMBER FreePage, FreePageCount, PagesLeft, BasePage, PageCount;
+ BoundaryAddressMultiple.QuadPart = 0;
+
+ if (Phase == 0)
+ {
+ //
+ // Define the basic user vs. kernel address space separation
+ //
+ MmSystemRangeStart = (PVOID)KSEG0_BASE;
+ MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000;
+ MmHighestUserAddress = (PVOID)(MmUserProbeAddress - 1);
+
+ //
+ // Get the size of the boot loader's image allocations and then round
+ // that region up to a PDE size, so that any PDEs we might create for
+ // whatever follows are separate from the PDEs that boot loader might've
+ // already created (and later, we can blow all that away if we want to).
+ //
+ MmBootImageSize = KeLoaderBlock->Extension->LoaderPagesSpanned;
+ MmBootImageSize *= PAGE_SIZE;
+ MmBootImageSize = (MmBootImageSize + (4 * 1024 * 1024) - 1) & ~((4 * 1024 * 1024) - 1);
+ ASSERT((MmBootImageSize % (4 * 1024 * 1024)) == 0);
+
+ //
+ // Set the size of session view, pool, and image
+ //
+ MmSessionSize = MI_SESSION_SIZE;
+ MmSessionViewSize = MI_SESSION_VIEW_SIZE;
+ MmSessionPoolSize = MI_SESSION_POOL_SIZE;
+ MmSessionImageSize = MI_SESSION_IMAGE_SIZE;
+
+ //
+ // Set the size of system view
+ //
+ MmSystemViewSize = MI_SYSTEM_VIEW_SIZE;
+
+ //
+ // This is where it all ends
+ //
+ MiSessionImageEnd = (PVOID)PTE_BASE;
+
+ //
+ // This is where we will load Win32k.sys and the video driver
+ //
+ MiSessionImageStart = (PVOID)((ULONG_PTR)MiSessionImageEnd -
+ MmSessionImageSize);
+
+ //
+ // So the view starts right below the session working set (itself below
+ // the image area)
+ //
+ MiSessionViewStart = (PVOID)((ULONG_PTR)MiSessionImageEnd -
+ MmSessionImageSize -
+ MI_SESSION_WORKING_SET_SIZE -
+ MmSessionViewSize);
+
+ //
+ // Session pool follows
+ //
+ MiSessionPoolEnd = MiSessionViewStart;
+ MiSessionPoolStart = (PVOID)((ULONG_PTR)MiSessionPoolEnd -
+ MmSessionPoolSize);
+
+ //
+ // And it all begins here
+ //
+ MmSessionBase = MiSessionPoolStart;
+
+ //
+ // Sanity check that our math is correct
+ //
+ ASSERT((ULONG_PTR)MmSessionBase + MmSessionSize == PTE_BASE);
+
+ //
+ // Session space ends wherever image session space ends
+ //
+ MiSessionSpaceEnd = MiSessionImageEnd;
+
+ //
+ // System view space ends at session space, so now that we know where
+ // this is, we can compute the base address of system view space itself.
+ //
+ MiSystemViewStart = (PVOID)((ULONG_PTR)MmSessionBase -
+ MmSystemViewSize);
+
+ //
+ // Set CR3 for the system process
+ //
+ PointerPte = MiAddressToPde(PTE_BASE);
+ PageFrameIndex = PFN_FROM_PTE(PointerPte) << PAGE_SHIFT;
+ PsGetCurrentProcess()->Pcb.DirectoryTableBase[0] = PageFrameIndex;
+
+ //
+ // Blow away user-mode
+ //
+ StartPde = MiAddressToPde(0);
+ EndPde = MiAddressToPde(KSEG0_BASE);
+ RtlZeroMemory(StartPde, (EndPde - StartPde) * sizeof(MMPTE));
+
+ //
+ // Loop the memory descriptors
+ //
+ NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
+ while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+ {
+ //
+ // Get the memory block
+ //
+ MdBlock = CONTAINING_RECORD(NextEntry,
+ MEMORY_ALLOCATION_DESCRIPTOR,
+ ListEntry);
+
+ //
+ // Skip invisible memory
+ //
+ if ((MdBlock->MemoryType != LoaderFirmwarePermanent) &&
+ (MdBlock->MemoryType != LoaderSpecialMemory) &&
+ (MdBlock->MemoryType != LoaderHALCachedMemory) &&
+ (MdBlock->MemoryType != LoaderBBTMemory))
+ {
+ //
+ // Check if BURNMEM was used
+ //
+ if (MdBlock->MemoryType != LoaderBad)
+ {
+ //
+ // Count this in the total of pages
+ //
+ MmNumberOfPhysicalPages += MdBlock->PageCount;
+ }
+
+ //
+ // Check if this is the new lowest page
+ //
+ if (MdBlock->BasePage < MmLowestPhysicalPage)
+ {
+ //
+ // Update the lowest page
+ //
+ MmLowestPhysicalPage = MdBlock->BasePage;
+ }
+
+ //
+ // Check if this is the new highest page
+ //
+ PageFrameIndex = MdBlock->BasePage + MdBlock->PageCount;
+ if (PageFrameIndex > MmHighestPhysicalPage)
+ {
+ //
+ // Update the highest page
+ //
+ MmHighestPhysicalPage = PageFrameIndex - 1;
+ }
+
+ //
+ // Check if this is free memory
+ //
+ if ((MdBlock->MemoryType == LoaderFree) ||
+ (MdBlock->MemoryType == LoaderLoadedProgram) ||
+ (MdBlock->MemoryType == LoaderFirmwareTemporary) ||
+ (MdBlock->MemoryType == LoaderOsloaderStack))
+ {
+ //
+ // Check if this is the largest memory descriptor
+ //
+ if (MdBlock->PageCount > FreePages)
+ {
+ //
+ // For now, it is
+ //
+ FreePages = MdBlock->PageCount;
+ MxFreeDescriptor = MdBlock;
+ }
+ }
+ }
+
+ //
+ // Keep going
+ //
+ NextEntry = MdBlock->ListEntry.Flink;
+ }
+
+ //
+ // Save original values of the free descriptor, since it'll be
+ // altered by early allocations
+ //
+ MxOldFreeDescriptor = *MxFreeDescriptor;
+
+ //
+ // Check if this is a machine with less than 19MB of RAM
+ //
+ if (MmNumberOfPhysicalPages < MI_MIN_PAGES_FOR_SYSPTE_TUNING)
+ {
+ //
+ // Use the very minimum of system PTEs
+ //
+ MmNumberOfSystemPtes = 7000;
+ }
+ else
+ {
+ //
+ // Use the default, but check if we have more than 32MB of RAM
+ //
+ MmNumberOfSystemPtes = 11000;
+ if (MmNumberOfPhysicalPages > MI_MIN_PAGES_FOR_SYSPTE_BOOST)
+ {
+ //
+ // Double the amount of system PTEs
+ //
+ MmNumberOfSystemPtes <<= 1;
+ }
+ }
+
+ DPRINT("System PTE count has been tuned to %d (%d bytes)\n",
+ MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE);
+
+ //
+ // Check if this is a machine with less than 256MB of RAM, and no overide
+ //
+ if ((MmNumberOfPhysicalPages <= MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING) &&
+ !(MmSizeOfNonPagedPoolInBytes))
+ {
+ //
+ // Force the non paged pool to be 2MB so we can reduce RAM usage
+ //
+ MmSizeOfNonPagedPoolInBytes = 2 * 1024 * 1024;
+ }
+
+ //
+ // Check if the user gave a ridicuously large nonpaged pool RAM size
+ //
+ if ((MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT) >
+ (MmNumberOfPhysicalPages * 7 / 8))
+ {
+ //
+ // More than 7/8ths of RAM was dedicated to nonpaged pool, ignore!
+ //
+ MmSizeOfNonPagedPoolInBytes = 0;
+ }
+
+ //
+ // Check if no registry setting was set, or if the setting was too low
+ //
+ if (MmSizeOfNonPagedPoolInBytes < MmMinimumNonPagedPoolSize)
+ {
+ //
+ // Start with the minimum (256 KB) and add 32 KB for each MB above 4
+ //
+ MmSizeOfNonPagedPoolInBytes = MmMinimumNonPagedPoolSize;
+ MmSizeOfNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) /
+ 256 * MmMinAdditionNonPagedPoolPerMb;
+ }
+
+ //
+ // Check if the registy setting or our dynamic calculation was too high
+ //
+ if (MmSizeOfNonPagedPoolInBytes > MI_MAX_INIT_NONPAGED_POOL_SIZE)
+ {
+ //
+ // Set it to the maximum
+ //
+ MmSizeOfNonPagedPoolInBytes = MI_MAX_INIT_NONPAGED_POOL_SIZE;
+ }
+
+ //
+ // Check if a percentage cap was set through the registry
+ //
+ if (MmMaximumNonPagedPoolPercent)
+ {
+ //
+ // Don't feel like supporting this right now
+ //
+ UNIMPLEMENTED;
+ }
+
+ //
+ // Page-align the nonpaged pool size
+ //
+ MmSizeOfNonPagedPoolInBytes &= ~(PAGE_SIZE - 1);
+
+ //
+ // Now, check if there was a registry size for the maximum size
+ //
+ if (!MmMaximumNonPagedPoolInBytes)
+ {
+ //
+ // Start with the default (1MB) and add 400 KB for each MB above 4
+ //
+ MmMaximumNonPagedPoolInBytes = MmDefaultMaximumNonPagedPool;
+ MmMaximumNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) /
+ 256 * MmMaxAdditionNonPagedPoolPerMb;
+ }
+
+ //
+ // Don't let the maximum go too high
+ //
+ if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE)
+ {
+ //
+ // Set it to the upper limit
+ //
+ MmMaximumNonPagedPoolInBytes = MI_MAX_NONPAGED_POOL_SIZE;
+ }
+
+ //
+ // Calculate the number of bytes, and then convert to pages
+ //
+ MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN);
+ MxPfnAllocation >>= PAGE_SHIFT;
+
+ //
+ // We have to add one to the count here, because in the process of
+ // shifting down to the page size, we actually ended up getting the
+ // lower aligned size (so say, 0x5FFFF bytes is now 0x5F pages).
+ // Later on, we'll shift this number back into bytes, which would cause
+ // us to end up with only 0x5F000 bytes -- when we actually want to have
+ // 0x60000 bytes.
+ //
+ MxPfnAllocation++;
+
+ //
+ // Now calculate the nonpaged pool expansion VA region
+ //
+ MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmNonPagedPoolEnd -
+ MmMaximumNonPagedPoolInBytes +
+ MmSizeOfNonPagedPoolInBytes);
+ MmNonPagedPoolStart = (PVOID)PAGE_ALIGN(MmNonPagedPoolStart);
+ NonPagedPoolExpansionVa = MmNonPagedPoolStart;
+ DPRINT("NP Pool has been tuned to: %d bytes and %d bytes\n",
+ MmSizeOfNonPagedPoolInBytes, MmMaximumNonPagedPoolInBytes);
+
+ //
+ // Now calculate the nonpaged system VA region, which includes the
+ // nonpaged pool expansion (above) and the system PTEs. Note that it is
+ // then aligned to a PDE boundary (4MB).
+ //
+ MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedPoolStart -
+ (MmNumberOfSystemPtes + 1) * PAGE_SIZE);
+ MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedSystemStart &
+ ~((4 * 1024 * 1024) - 1));
+
+ //
+ // Don't let it go below the minimum
+ //
+ if (MmNonPagedSystemStart < (PVOID)0xEB000000)
+ {
+ //
+ // This is a hard-coded limit in the Windows NT address space
+ //
+ MmNonPagedSystemStart = (PVOID)0xEB000000;
+
+ //
+ // Reduce the amount of system PTEs to reach this point
+ //
+ MmNumberOfSystemPtes = ((ULONG_PTR)MmNonPagedPoolStart -
+ (ULONG_PTR)MmNonPagedSystemStart) >>
+ PAGE_SHIFT;
+ MmNumberOfSystemPtes--;
+ ASSERT(MmNumberOfSystemPtes > 1000);
+ }
+
+ //
+ // Normally, the PFN database should start after the loader images.
+ // This is already the case in ReactOS, but for now we want to co-exist
+ // with the old memory manager, so we'll create a "Shadow PFN Database"
+ // instead, and arbitrarly start it at 0xB0000000.
+ //
+ MmPfnDatabase = (PVOID)0xB0000000;
+ ASSERT(((ULONG_PTR)MmPfnDatabase & ((4 * 1024 * 1024) - 1)) == 0);
+
+ //
+ // Non paged pool comes after the PFN database
+ //
+ MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase +
+ (MxPfnAllocation << PAGE_SHIFT));
+
+ //
+ // Now we actually need to get these many physical pages. Nonpaged pool
+ // is actually also physically contiguous (but not the expansion)
+ //
+ PageFrameIndex = MxGetNextPage(MxPfnAllocation +
+ (MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT));
+ ASSERT(PageFrameIndex != 0);
+ DPRINT("PFN DB PA PFN begins at: %lx\n", PageFrameIndex);
+ DPRINT("NP PA PFN begins at: %lx\n", PageFrameIndex + MxPfnAllocation);
+
+ //
+ // Now we need some pages to create the page tables for the NP system VA
+ // which includes system PTEs and expansion NP
+ //
+ StartPde = MiAddressToPde(MmNonPagedSystemStart);
+ EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1));
+ while (StartPde <= EndPde)
+ {
+ //
+ // Sanity check
+ //
+ ASSERT(StartPde->u.Hard.Valid == 0);
+
+ //
+ // Get a page
+ //
+ TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1);
+ ASSERT(TempPde.u.Hard.Valid == 1);
+ *StartPde = TempPde;
+
+ //
+ // Zero out the page table
+ //
+ PointerPte = MiPteToAddress(StartPde);
+ RtlZeroMemory(PointerPte, PAGE_SIZE);
+
+ //
+ // Next
+ //
+ StartPde++;
+ }
+
+ //
+ // Now we need pages for the page tables which will map initial NP
+ //
+ StartPde = MiAddressToPde(MmPfnDatabase);
+ EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolStart +
+ MmSizeOfNonPagedPoolInBytes - 1));
+ while (StartPde <= EndPde)
+ {
+ //
+ // Sanity check
+ //
+ ASSERT(StartPde->u.Hard.Valid == 0);
+
+ //
+ // Get a page
+ //
+ TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1);
+ ASSERT(TempPde.u.Hard.Valid == 1);
+ *StartPde = TempPde;
+
+ //
+ // Zero out the page table
+ //
+ PointerPte = MiPteToAddress(StartPde);
+ RtlZeroMemory(PointerPte, PAGE_SIZE);
+
+ //
+ // Next
+ //
+ StartPde++;
+ }
+
+ //
+ // Now remember where the expansion starts
+ //
+ MmNonPagedPoolExpansionStart = NonPagedPoolExpansionVa;
+
+ //
+ // Last step is to actually map the nonpaged pool
+ //
+ PointerPte = MiAddressToPte(MmNonPagedPoolStart);
+ LastPte = MiAddressToPte((PVOID)((ULONG_PTR)MmNonPagedPoolStart +
+ MmSizeOfNonPagedPoolInBytes - 1));
+ while (PointerPte <= LastPte)
+ {
+ //
+ // Use one of our contigous pages
+ //
+ TempPte.u.Hard.PageFrameNumber = PageFrameIndex++;
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+ ASSERT(TempPte.u.Hard.Valid == 1);
+ *PointerPte++ = TempPte;
+ }
+
+ //
+ // ReactOS requires a memory area to keep the initial NP area off-bounds
+ //
+ BaseAddress = MmNonPagedPoolStart;
+ Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
+ MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC,
+ &BaseAddress,
+ MmSizeOfNonPagedPoolInBytes,
+ PAGE_READWRITE,
+ &MArea,
+ TRUE,
+ 0,
+ BoundaryAddressMultiple);
+ ASSERT(Status == STATUS_SUCCESS);
+
+ //
+ // And we need one more for the system NP
+ //
+ BaseAddress = MmNonPagedSystemStart;
+ Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
+ MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC,
+ &BaseAddress,
+ (ULONG_PTR)MmNonPagedPoolEnd -
+ (ULONG_PTR)MmNonPagedSystemStart,
+ PAGE_READWRITE,
+ &MArea,
+ TRUE,
+ 0,
+ BoundaryAddressMultiple);
+ ASSERT(Status == STATUS_SUCCESS);
+
+ //
+ // Sanity check: make sure we have properly defined the system PTE space
+ //
+ ASSERT(MiAddressToPte(MmNonPagedSystemStart) <
+ MiAddressToPte(MmNonPagedPoolExpansionStart));
+
+ //
+ // Now go ahead and initialize the ARM³ nonpaged pool
+ //
+ MiInitializeArmPool();
+
+ //
+ // Get current page data, since we won't be using MxGetNextPage as it
+ // would corrupt our state
+ //
+ FreePage = MxFreeDescriptor->BasePage;
+ FreePageCount = MxFreeDescriptor->PageCount;
+ PagesLeft = 0;
+
+ //
+ // Loop the memory descriptors
+ //
+ NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink;
+ while (NextEntry != &KeLoaderBlock->MemoryDescriptorListHead)
+ {
+ //
+ // Get the descriptor
+ //
+ MdBlock = CONTAINING_RECORD(NextEntry,
+ MEMORY_ALLOCATION_DESCRIPTOR,
+ ListEntry);
+ if ((MdBlock->MemoryType == LoaderFirmwarePermanent) ||
+ (MdBlock->MemoryType == LoaderBBTMemory) ||
+ (MdBlock->MemoryType == LoaderSpecialMemory))
+ {
+ //
+ // These pages are not part of the PFN database
+ //
+ NextEntry = MdBlock->ListEntry.Flink;
+ continue;
+ }
+
+ //
+ // Next, check if this is our special free descriptor we've found
+ //
+ if (MdBlock == MxFreeDescriptor)
+ {
+ //
+ // Use the real numbers instead
+ //
+ BasePage = MxOldFreeDescriptor.BasePage;
+ PageCount = MxOldFreeDescriptor.PageCount;
+ }
+ else
+ {
+ //
+ // Use the descriptor's numbers
+ //
+ BasePage = MdBlock->BasePage;
+ PageCount = MdBlock->PageCount;
+ }
+
+ //
+ // Get the PTEs for this range
+ //
+ PointerPte = MiAddressToPte(&MmPfnDatabase[BasePage]);
+ LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[BasePage + PageCount]) - 1);
+ DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount);
+
+ //
+ // Loop them
+ //
+ while (PointerPte <= LastPte)
+ {
+ //
+ // We'll only touch PTEs that aren't already valid
+ //
+ if (PointerPte->u.Hard.Valid == 0)
+ {
+ //
+ // Use the next free page
+ //
+ TempPte.u.Hard.PageFrameNumber = FreePage;
+ ASSERT(FreePageCount != 0);
+
+ //
+ // Consume free pages
+ //
+ FreePage++;
+ FreePageCount--;
+ if (!FreePageCount)
+ {
+ //
+ // Out of memory
+ //
+ KeBugCheckEx(INSTALL_MORE_MEMORY,
+ MmNumberOfPhysicalPages,
+ FreePageCount,
+ MxOldFreeDescriptor.PageCount,
+ 1);
+ }
+
+ //
+ // Write out this PTE
+ //
+ PagesLeft++;
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+ ASSERT(TempPte.u.Hard.Valid == 1);
+ *PointerPte = TempPte;
+
+ //
+ // Zero this page
+ //
+ RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE);
+ }
+
+ //
+ // Next!
+ //
+ PointerPte++;
+ }
+
+ //
+ // Do the next address range
+ //
+ NextEntry = MdBlock->ListEntry.Flink;
+ }
+
+ //
+ // Now update the free descriptors to consume the pages we used up during
+ // the PFN allocation loop
+ //
+ MxFreeDescriptor->BasePage = FreePage;
+ MxFreeDescriptor->PageCount = FreePageCount;
+ }
+ else if (Phase == 1) // IN BETWEEN, THE PFN DATABASE IS NOW CREATED
+ {
+ //
+ // Reset the descriptor back so we can create the correct memory blocks
+ //
+ *MxFreeDescriptor = MxOldFreeDescriptor;
+
+ //
+ // Initialize the nonpaged pool
+ //
+ InitializePool(NonPagedPool, 0);
+
+ //
+ // We PDE-aligned the nonpaged system start VA, so haul some extra PTEs!
+ //
+ PointerPte = MiAddressToPte(MmNonPagedSystemStart);
+ OldCount = MmNumberOfSystemPtes;
+ MmNumberOfSystemPtes = MiAddressToPte(MmNonPagedPoolExpansionStart) -
+ PointerPte;
+ MmNumberOfSystemPtes--;
+ DPRINT("Final System PTE count: %d (%d bytes)\n",
+ MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE);
+
+ //
+ // Create the system PTE space
+ //
+ MiInitializeSystemPtes(PointerPte, MmNumberOfSystemPtes, SystemPteSpace);
+
+ //
+ // Get the PDE For hyperspace
+ //
+ StartPde = MiAddressToPde(HYPER_SPACE);
+
+ //
+ // Allocate a page for it and create it
+ //
+ PageFrameIndex = MmAllocPage(MC_SYSTEM, 0);
+ TempPde.u.Hard.PageFrameNumber = PageFrameIndex;
+ TempPde.u.Hard.Global = FALSE; // Hyperspace is local!
+ ASSERT(StartPde->u.Hard.Valid == 0);
+ ASSERT(TempPde.u.Hard.Valid == 1);
+ *StartPde = TempPde;
+
+ //
+ // Zero out the page table now
+ //
+ PointerPte = MiAddressToPte(HYPER_SPACE);
+ RtlZeroMemory(PointerPte, PAGE_SIZE);
+
+ //
+ // Setup the mapping PTEs
+ //
+ MmFirstReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_START);
+ MmLastReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_END);
+ MmFirstReservedMappingPte->u.Hard.PageFrameNumber = MI_HYPERSPACE_PTES;
+
+ //
+ // Reserve system PTEs for zeroing PTEs and clear them
+ //
+ MiFirstReservedZeroingPte = MiReserveSystemPtes(MI_ZERO_PTES,
+ SystemPteSpace);
+ RtlZeroMemory(MiFirstReservedZeroingPte, MI_ZERO_PTES * sizeof(MMPTE));
+
+ //
+ // Set the counter to maximum to boot with
+ //
+ MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1;
+
+ //
+ // Sync us up with ReactOS Mm
+ //
+ MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1));
+ MiSyncARM3WithROS(MmPfnDatabase, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1));
+ MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1));
+ }
+ else // NOW WE HAVE NONPAGED POOL
+ {
+ //
+ // Instantiate memory that we don't consider RAM/usable
+ // We use the same exclusions that Windows does, in order to try to be
+ // compatible with WinLDR-style booting
+ //
+ for (i = 0; i < LoaderMaximum; i++) IncludeType[i] = TRUE;
+ IncludeType[LoaderBad] = FALSE;
+ IncludeType[LoaderFirmwarePermanent] = FALSE;
+ IncludeType[LoaderSpecialMemory] = FALSE;
+ IncludeType[LoaderBBTMemory] = FALSE;
+
+ //
+ // Build the physical memory block
+ //
+ MmPhysicalMemoryBlock = MmInitializeMemoryLimits(LoaderBlock,
+ IncludeType);
+
+ //
+ // Allocate enough buffer for the PFN bitmap
+ // Align it up to a 32-bit boundary
+ //
+ Bitmap = ExAllocatePoolWithTag(NonPagedPool,
+ (((MmHighestPhysicalPage + 1) + 31) / 32) * 4,
+ ' mM');
+ if (!Bitmap)
+ {
+ //
+ // This is critical
+ //
+ KeBugCheckEx(INSTALL_MORE_MEMORY,
+ MmNumberOfPhysicalPages,
+ MmLowestPhysicalPage,
+ MmHighestPhysicalPage,
+ 0x101);
+ }
+
+ //
+ // Initialize it and clear all the bits to begin with
+ //
+ RtlInitializeBitMap(&MiPfnBitMap,
+ Bitmap,
+ MmHighestPhysicalPage + 1);
+ RtlClearAllBits(&MiPfnBitMap);
+
+ //
+ // Loop physical memory runs
+ //
+ for (i = 0; i < MmPhysicalMemoryBlock->NumberOfRuns; i++)
+ {
+ //
+ // Get the run
+ //
+ Run = &MmPhysicalMemoryBlock->Run[i];
+ DPRINT("PHYSICAL RAM [0x%08p to 0x%08p]\n",
+ Run->BasePage << PAGE_SHIFT,
+ (Run->BasePage + Run->PageCount) << PAGE_SHIFT);
+
+ //
+ // Make sure it has pages inside it
+ //
+ if (Run->PageCount)
+ {
+ //
+ // Set the bits in the PFN bitmap
+ //
+ RtlSetBits(&MiPfnBitMap, Run->BasePage, Run->PageCount);
+ }
+ }
+
+ //
+ // Size up paged pool and build the shadow system page directory
+ //
+ MiBuildPagedPool();
+
+ //
+ // Print the memory layout
+ //
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmSystemRangeStart,
+ (ULONG_PTR)MmSystemRangeStart + MmBootImageSize,
+ "Boot Loaded Image");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MiNonPagedPoolStart,
+ (ULONG_PTR)MiNonPagedPoolStart + MiNonPagedPoolLength,
+ "Non Paged Pool");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmPagedPoolBase,
+ (ULONG_PTR)MmPagedPoolBase + MmPagedPoolSize,
+ "Paged Pool");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmPfnDatabase,
+ (ULONG_PTR)MmPfnDatabase + (MxPfnAllocation << PAGE_SHIFT),
+ "PFN Database");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmNonPagedPoolStart,
+ (ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes,
+ "ARM³ Non Paged Pool");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MiSystemViewStart,
+ (ULONG_PTR)MiSystemViewStart + MmSystemViewSize,
+ "System View Space");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmSessionBase,
+ MiSessionSpaceEnd,
+ "Session Space");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ PTE_BASE, PDE_BASE,
+ "Page Tables");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ PDE_BASE, HYPER_SPACE,
+ "Page Directories");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ HYPER_SPACE, HYPER_SPACE + (4 * 1024 * 1024),
+ "Hyperspace");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmPagedPoolStart,
+ (ULONG_PTR)MmPagedPoolStart + MmSizeOfPagedPoolInBytes,
+ "ARM³ Paged Pool");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmNonPagedSystemStart, MmNonPagedPoolExpansionStart,
+ "System PTE Space");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmNonPagedPoolExpansionStart, MmNonPagedPoolEnd,
+ "Non Paged Pool Expansion PTE Space");
+ }
+
+ //
+ // Always return success for now
+ //
+ return STATUS_SUCCESS;
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/mm/ARM3/iosup.c b/reactos/ntoskrnl/mm/ARM3/iosup.c
new file mode 100644
index 00000000000..5d3452b2ad4
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/iosup.c
@@ -0,0 +1,257 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/iosup.c
+ * PURPOSE: ARM Memory Manager I/O Mapping Functionality
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#line 15 "ARM³::IOSUP"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* GLOBALS ********************************************************************/
+
+//
+// Each architecture has its own caching attributes for both I/O and Physical
+// memory mappings.
+//
+// This describes the attributes for the x86 architecture. It eventually needs
+// to go in the appropriate i386 directory.
+//
+MI_PFN_CACHE_ATTRIBUTE MiPlatformCacheAttributes[2][MmMaximumCacheType] =
+{
+ //
+ // RAM
+ //
+ {MiNonCached,MiCached,MiWriteCombined,MiCached,MiNonCached,MiWriteCombined},
+
+ //
+ // Device Memory
+ //
+ {MiNonCached,MiCached,MiWriteCombined,MiCached,MiNonCached,MiWriteCombined},
+};
+
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+/*
+ * @implemented
+ */
+PVOID
+NTAPI
+MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress,
+ IN ULONG NumberOfBytes,
+ IN MEMORY_CACHING_TYPE CacheType)
+{
+
+ PFN_TYPE Pfn, PageCount;
+ PMMPTE PointerPte;
+ PVOID BaseAddress;
+ MMPTE TempPte;
+ PMMPFN Pfn1 = NULL;
+ MI_PFN_CACHE_ATTRIBUTE CacheAttribute;
+ BOOLEAN IsIoMapping;
+
+ //
+ // Normalize and validate the caching attributes
+ //
+ CacheType &= 0xFF;
+ if (CacheType >= MmMaximumCacheType) return NULL;
+
+ //
+ // Calculate page count
+ //
+ PageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(PhysicalAddress.LowPart,
+ NumberOfBytes);
+
+ //
+ // Compute the PFN and check if it's a known I/O mapping
+ // Also translate the cache attribute
+ //
+ Pfn = (PFN_NUMBER)(PhysicalAddress.QuadPart >> PAGE_SHIFT);
+ IsIoMapping = (Pfn > MmHighestPhysicalPage) ? TRUE : FALSE;
+ if (!IsIoMapping) Pfn1 = MiGetPfnEntry(Pfn);
+ CacheAttribute = MiPlatformCacheAttributes[IsIoMapping][CacheType];
+
+ //
+ // Now allocate system PTEs for the mapping, and get the VA
+ //
+ PointerPte = MiReserveSystemPtes(PageCount, SystemPteSpace);
+ if (!PointerPte) return NULL;
+ BaseAddress = MiPteToAddress(PointerPte);
+
+ //
+ // Check if this is uncached
+ //
+ if (CacheAttribute != MiCached)
+ {
+ //
+ // Flush all caches
+ //
+ KeFlushEntireTb(TRUE, TRUE);
+ KeInvalidateAllCaches();
+ }
+
+ //
+ // Now compute the VA offset
+ //
+ BaseAddress = (PVOID)((ULONG_PTR)BaseAddress +
+ BYTE_OFFSET(PhysicalAddress.LowPart));
+
+ //
+ // Get the template and configure caching
+ //
+ TempPte = HyperTemplatePte;
+ switch (CacheAttribute)
+ {
+ case MiNonCached:
+
+ //
+ // Disable the cache
+ //
+ MI_PAGE_DISABLE_CACHE(&TempPte);
+ MI_PAGE_WRITE_THROUGH(&TempPte);
+ break;
+
+ case MiCached:
+
+ //
+ // Leave defaults
+ //
+ break;
+
+ case MiWriteCombined:
+
+ //
+ // We don't support write combining yet
+ //
+ ASSERT(FALSE);
+ break;
+
+ default:
+
+ //
+ // Should never happen
+ //
+ ASSERT(FALSE);
+ break;
+ }
+
+ //
+ // Sanity check and re-flush
+ //
+ Pfn = (PFN_NUMBER)(PhysicalAddress.QuadPart >> PAGE_SHIFT);
+ ASSERT((Pfn1 == MiGetPfnEntry(Pfn)) || (Pfn1 == NULL));
+ KeFlushEntireTb(TRUE, TRUE);
+ KeInvalidateAllCaches();
+
+ //
+ // Do the mapping
+ //
+ do
+ {
+ //
+ // Start out with nothing
+ //
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+
+ //
+ // Write the PFN
+ //
+ TempPte.u.Hard.PageFrameNumber = Pfn++;
+ *PointerPte++ = TempPte;
+ } while (--PageCount);
+
+ //
+ // We're done!
+ //
+ return BaseAddress;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+MmUnmapIoSpace(IN PVOID BaseAddress,
+ IN ULONG NumberOfBytes)
+{
+ PFN_NUMBER PageCount, Pfn;
+ PMMPTE PointerPte;
+
+ //
+ // Sanity check
+ //
+ ASSERT(NumberOfBytes != 0);
+
+ //
+ // Get the page count
+ //
+ PageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(BaseAddress, NumberOfBytes);
+
+ //
+ // Get the PTE and PFN
+ //
+ PointerPte = MiAddressToPte(BaseAddress);
+ Pfn = PFN_FROM_PTE(PointerPte);
+
+ //
+ // Is this an I/O mapping?
+ //
+ if (Pfn > MmHighestPhysicalPage)
+ {
+ //
+ // Destroy the PTE
+ //
+ RtlZeroMemory(PointerPte, PageCount * sizeof(MMPTE));
+
+ //
+ // Blow the TLB
+ //
+ KeFlushEntireTb(TRUE, TRUE);
+ }
+
+ //
+ // Release the PTEs
+ //
+ MiReleaseSystemPtes(PointerPte, PageCount, 0);
+}
+
+/*
+ * @implemented
+ */
+PVOID
+NTAPI
+MmMapVideoDisplay(IN PHYSICAL_ADDRESS PhysicalAddress,
+ IN ULONG NumberOfBytes,
+ IN MEMORY_CACHING_TYPE CacheType)
+{
+ PAGED_CODE();
+
+ //
+ // Call the real function
+ //
+ return MmMapIoSpace(PhysicalAddress, NumberOfBytes, CacheType);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+MmUnmapVideoDisplay(IN PVOID BaseAddress,
+ IN ULONG NumberOfBytes)
+{
+ //
+ // Call the real function
+ //
+ MmUnmapIoSpace(BaseAddress, NumberOfBytes);
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/mm/ARM3/mdlsup.c b/reactos/ntoskrnl/mm/ARM3/mdlsup.c
new file mode 100644
index 00000000000..e0bb4db75bf
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/mdlsup.c
@@ -0,0 +1,1318 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/mdlsup.c
+ * PURPOSE: ARM Memory Manager Memory Descriptor List (MDL) Management
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#line 15 "ARM³::MDLSUP"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+/*
+ * @implemented
+ */
+PMDL
+NTAPI
+MmCreateMdl(IN PMDL Mdl,
+ IN PVOID Base,
+ IN ULONG Length)
+{
+ ULONG Size;
+
+ //
+ // Check if we don't have an MDL built
+ //
+ if (!Mdl)
+ {
+ //
+ // Calculate the size we'll need and allocate the MDL
+ //
+ Size = MmSizeOfMdl(Base, Length);
+ Mdl = ExAllocatePoolWithTag(NonPagedPool, Size, TAG_MDL);
+ if (!Mdl) return NULL;
+ }
+
+ //
+ // Initialize it
+ //
+ MmInitializeMdl(Mdl, Base, Length);
+ return Mdl;
+}
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+MmSizeOfMdl(IN PVOID Base,
+ IN ULONG Length)
+{
+ //
+ // Return the MDL size
+ //
+ return sizeof(MDL) +
+ (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Base, Length) * sizeof(PFN_NUMBER));
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+MmBuildMdlForNonPagedPool(IN PMDL Mdl)
+{
+ PPFN_NUMBER MdlPages, EndPage;
+ PFN_NUMBER Pfn, PageCount;
+ PVOID Base;
+ PMMPTE PointerPte;
+
+ //
+ // Sanity checks
+ //
+ ASSERT(Mdl->ByteCount != 0);
+ ASSERT((Mdl->MdlFlags & (MDL_PAGES_LOCKED |
+ MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL |
+ MDL_PARTIAL)) == 0);
+
+ //
+ // We know the MDL isn't associated to a process now
+ //
+ Mdl->Process = NULL;
+
+ //
+ // Get page and VA information
+ //
+ MdlPages = (PPFN_NUMBER)(Mdl + 1);
+ Base = Mdl->StartVa;
+
+ //
+ // Set the system address and now get the page count
+ //
+ Mdl->MappedSystemVa = (PVOID)((ULONG_PTR)Base + Mdl->ByteOffset);
+ PageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(Mdl->MappedSystemVa,
+ Mdl->ByteCount);
+ ASSERT(PageCount != 0);
+ EndPage = MdlPages + PageCount;
+
+ //
+ // Loop the PTEs
+ //
+ PointerPte = MiAddressToPte(Base);
+ do
+ {
+ //
+ // Write the PFN
+ //
+ Pfn = PFN_FROM_PTE(PointerPte++);
+ *MdlPages++ = Pfn;
+ } while (MdlPages < EndPage);
+
+ //
+ // Set the nonpaged pool flag
+ //
+ Mdl->MdlFlags |= MDL_SOURCE_IS_NONPAGED_POOL;
+
+ //
+ // Check if this is an I/O mapping
+ //
+ if (Pfn > MmHighestPhysicalPage) Mdl->MdlFlags |= MDL_IO_SPACE;
+}
+
+/*
+ * @implemented
+ */
+PMDL
+NTAPI
+MmAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress,
+ IN PHYSICAL_ADDRESS HighAddress,
+ IN PHYSICAL_ADDRESS SkipBytes,
+ IN SIZE_T TotalBytes)
+{
+ //
+ // Call the internal routine
+ //
+ return MiAllocatePagesForMdl(LowAddress,
+ HighAddress,
+ SkipBytes,
+ TotalBytes,
+ MiNotMapped,
+ 0);
+}
+
+/*
+ * @implemented
+ */
+PMDL
+NTAPI
+MmAllocatePagesForMdlEx(IN PHYSICAL_ADDRESS LowAddress,
+ IN PHYSICAL_ADDRESS HighAddress,
+ IN PHYSICAL_ADDRESS SkipBytes,
+ IN SIZE_T TotalBytes,
+ IN MEMORY_CACHING_TYPE CacheType,
+ IN ULONG Flags)
+{
+ MI_PFN_CACHE_ATTRIBUTE CacheAttribute;
+
+ //
+ // Check for invalid cache type
+ //
+ if (CacheType > MmWriteCombined)
+ {
+ //
+ // Normalize to default
+ //
+ CacheAttribute = MiNotMapped;
+ }
+ else
+ {
+ //
+ // Conver to internal caching attribute
+ //
+ CacheAttribute = MiPlatformCacheAttributes[FALSE][CacheType];
+ }
+
+ //
+ // Only these flags are allowed
+ //
+ if (Flags & ~(MM_DONT_ZERO_ALLOCATION | MM_ALLOCATE_FROM_LOCAL_NODE_ONLY))
+ {
+ //
+ // Silently fail
+ //
+ return NULL;
+ }
+
+ //
+ // Call the internal routine
+ //
+ return MiAllocatePagesForMdl(LowAddress,
+ HighAddress,
+ SkipBytes,
+ TotalBytes,
+ CacheAttribute,
+ Flags);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+MmFreePagesFromMdl(IN PMDL Mdl)
+{
+ PVOID Base;
+ PPFN_NUMBER Pages;
+ LONG NumberOfPages;
+ PMMPFN Pfn1;
+ DPRINT("Freeing MDL: %p\n", Mdl);
+
+ //
+ // Sanity checks
+ //
+ ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
+ ASSERT((Mdl->MdlFlags & MDL_IO_SPACE) == 0);
+ ASSERT(((ULONG_PTR)Mdl->StartVa & (PAGE_SIZE - 1)) == 0);
+
+ //
+ // Get address and page information
+ //
+ Base = (PVOID)((ULONG_PTR)Mdl->StartVa + Mdl->ByteOffset);
+ NumberOfPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(Base, Mdl->ByteCount);
+
+ //
+ // Loop all the MDL pages
+ //
+ Pages = (PPFN_NUMBER)(Mdl + 1);
+ do
+ {
+ //
+ // Reached the last page
+ //
+ if (*Pages == -1) break;
+
+ //
+ // Sanity check
+ //
+ ASSERT(*Pages <= MmHighestPhysicalPage);
+
+ //
+ // Get the page entry
+ //
+ Pfn1 = MiGetPfnEntry(*Pages);
+ ASSERT(Pfn1->u3.ReferenceCount == 1);
+
+ //
+ // Clear it
+ //
+ Pfn1->u3.e1.StartOfAllocation = 0;
+ Pfn1->u3.e1.EndOfAllocation = 0;
+
+ //
+ // Dereference it
+ //
+ MmDereferencePage(*Pages);
+
+ //
+ // Clear this page and move on
+ //
+ *Pages++ = -1;
+ } while (--NumberOfPages != 0);
+
+ //
+ // Remove the pages locked flag
+ //
+ Mdl->MdlFlags &= ~MDL_PAGES_LOCKED;
+}
+
+/*
+ * @implemented
+ */
+PVOID
+NTAPI
+MmMapLockedPagesSpecifyCache(IN PMDL Mdl,
+ IN KPROCESSOR_MODE AccessMode,
+ IN MEMORY_CACHING_TYPE CacheType,
+ IN PVOID BaseAddress,
+ IN ULONG BugCheckOnFailure,
+ IN MM_PAGE_PRIORITY Priority)
+{
+ PVOID Base;
+ PPFN_NUMBER MdlPages, LastPage;
+ PFN_NUMBER PageCount;
+ BOOLEAN IsIoMapping;
+ MI_PFN_CACHE_ATTRIBUTE CacheAttribute;
+ PMMPTE PointerPte;
+ MMPTE TempPte;
+
+ //
+ // Sanity check
+ //
+ ASSERT(Mdl->ByteCount != 0);
+
+ //
+ // Get the base
+ //
+ Base = (PVOID)((ULONG_PTR)Mdl->StartVa + Mdl->ByteOffset);
+
+ //
+ // Handle kernel case first
+ //
+ if (AccessMode == KernelMode)
+ {
+ //
+ // Get the list of pages and count
+ //
+ MdlPages = (PPFN_NUMBER)(Mdl + 1);
+ PageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(Base, Mdl->ByteCount);
+ LastPage = MdlPages + PageCount;
+
+ //
+ // Sanity checks
+ //
+ ASSERT((Mdl->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL |
+ MDL_PARTIAL_HAS_BEEN_MAPPED)) == 0);
+ ASSERT((Mdl->MdlFlags & (MDL_PAGES_LOCKED | MDL_PARTIAL)) != 0);
+
+ //
+ // Get the correct cache type
+ //
+ IsIoMapping = (Mdl->MdlFlags & MDL_IO_SPACE) != 0;
+ CacheAttribute = MiPlatformCacheAttributes[IsIoMapping][CacheType];
+
+ //
+ // Reserve the PTEs
+ //
+ PointerPte = MiReserveSystemPtes(PageCount, SystemPteSpace);
+ if (!PointerPte)
+ {
+ //
+ // If it can fail, return NULL
+ //
+ if (Mdl->MdlFlags & MDL_MAPPING_CAN_FAIL) return NULL;
+
+ //
+ // Should we bugcheck?
+ //
+ if (!BugCheckOnFailure) return NULL;
+
+ //
+ // Yes, crash the system
+ //
+ KeBugCheckEx(NO_MORE_SYSTEM_PTES, 0, PageCount, 0, 0);
+ }
+
+ //
+ // Get the mapped address
+ //
+ Base = (PVOID)((ULONG_PTR)MiPteToAddress(PointerPte) + Mdl->ByteOffset);
+
+ //
+ // Get the template
+ //
+ TempPte = HyperTemplatePte;
+ switch (CacheAttribute)
+ {
+ case MiNonCached:
+
+ //
+ // Disable caching
+ //
+ MI_PAGE_DISABLE_CACHE(&TempPte);
+ MI_PAGE_WRITE_THROUGH(&TempPte);
+ break;
+
+ case MiWriteCombined:
+
+ //
+ // Enable write combining
+ //
+ MI_PAGE_DISABLE_CACHE(&TempPte);
+ MI_PAGE_WRITE_COMBINED(&TempPte);
+ break;
+
+ default:
+ //
+ // Nothing to do
+ //
+ break;
+ }
+
+ //
+ // Loop all PTEs
+ //
+ do
+ {
+ //
+ // We're done here
+ //
+ if (*MdlPages == -1) break;
+
+ //
+ // Write the PTE
+ //
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+ TempPte.u.Hard.PageFrameNumber = *MdlPages;
+ *PointerPte++ = TempPte;
+ } while (++MdlPages < LastPage);
+
+ //
+ // Mark it as mapped
+ //
+ ASSERT((Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0);
+ Mdl->MappedSystemVa = Base;
+ Mdl->MdlFlags |= MDL_MAPPED_TO_SYSTEM_VA;
+
+ //
+ // Check if it was partial
+ //
+ if (Mdl->MdlFlags & MDL_PARTIAL)
+ {
+ //
+ // Write the appropriate flag here too
+ //
+ Mdl->MdlFlags |= MDL_PARTIAL_HAS_BEEN_MAPPED;
+ }
+
+ //
+ // Return the mapped address
+ //
+ return Base;
+ }
+
+ //
+ // In user-mode, let ReactOS do it
+ //
+ return MiMapLockedPagesInUserSpace(Mdl, Base, CacheType, BaseAddress);
+}
+
+/*
+ * @implemented
+ */
+PVOID
+NTAPI
+MmMapLockedPages(IN PMDL Mdl,
+ IN KPROCESSOR_MODE AccessMode)
+{
+ //
+ // Call the extended version
+ //
+ return MmMapLockedPagesSpecifyCache(Mdl,
+ AccessMode,
+ MmCached,
+ NULL,
+ TRUE,
+ HighPagePriority);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+MmUnmapLockedPages(IN PVOID BaseAddress,
+ IN PMDL Mdl)
+{
+ PVOID Base;
+ PFN_NUMBER PageCount;
+ PPFN_NUMBER MdlPages;
+ PMMPTE PointerPte;
+
+ //
+ // Sanity check
+ //
+ ASSERT(Mdl->ByteCount != 0);
+
+ //
+ // Check if this is a kernel request
+ //
+ if (BaseAddress > MM_HIGHEST_USER_ADDRESS)
+ {
+ //
+ // Get base and count information
+ //
+ Base = (PVOID)((ULONG_PTR)Mdl->StartVa + Mdl->ByteOffset);
+ PageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(Base, Mdl->ByteCount);
+
+ //
+ // Sanity checks
+ //
+ ASSERT((Mdl->MdlFlags & MDL_PARENT_MAPPED_SYSTEM_VA) == 0);
+ ASSERT(PageCount != 0);
+ ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+
+ //
+ // Get the PTE
+ //
+ PointerPte = MiAddressToPte(BaseAddress);
+ ASSERT(PointerPte >= MmSystemPtesStart[SystemPteSpace]);
+ ASSERT(PointerPte <= MmSystemPtesEnd[SystemPteSpace]);
+
+ //
+ // Check if the caller wants us to free advanced pages
+ //
+ if (Mdl->MdlFlags & MDL_FREE_EXTRA_PTES)
+ {
+ //
+ // Get the MDL page array
+ //
+ MdlPages = (PPFN_NUMBER)(Mdl + 1);
+ MdlPages += PageCount;
+
+ //
+ // Do the math
+ //
+ PageCount += *MdlPages;
+ PointerPte -= *MdlPages;
+ ASSERT(PointerPte >= MmSystemPtesStart[SystemPteSpace]);
+ ASSERT(PointerPte <= MmSystemPtesEnd[SystemPteSpace]);
+
+ //
+ // Get the new base address
+ //
+ BaseAddress = (PVOID)((ULONG_PTR)BaseAddress -
+ ((*MdlPages) << PAGE_SHIFT));
+ }
+
+ //
+ // Remove flags
+ //
+ Mdl->MdlFlags &= ~(MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_PARTIAL_HAS_BEEN_MAPPED |
+ MDL_FREE_EXTRA_PTES);
+
+ //
+ // Release the system PTEs
+ //
+ MiReleaseSystemPtes(PointerPte, PageCount, SystemPteSpace);
+ }
+ else
+ {
+ //
+ // Let ReactOS handle it
+ //
+ MiUnmapLockedPagesInUserSpace(BaseAddress, Mdl);
+ }
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+MmProbeAndLockPages(IN PMDL Mdl,
+ IN KPROCESSOR_MODE AccessMode,
+ IN LOCK_OPERATION Operation)
+{
+ PPFN_TYPE MdlPages;
+ PVOID Base, Address, LastAddress, StartAddress;
+ ULONG LockPages, TotalPages;
+ NTSTATUS Status = STATUS_SUCCESS;
+ PEPROCESS CurrentProcess;
+ PETHREAD Thread;
+ PMMSUPPORT AddressSpace;
+ NTSTATUS ProbeStatus;
+ PMMPTE PointerPte, PointerPde, LastPte;
+ PFN_NUMBER PageFrameIndex;
+ PMMPFN Pfn1;
+ BOOLEAN UsePfnLock;
+ KIRQL OldIrql;
+ DPRINT("Probing MDL: %p\n", Mdl);
+
+ //
+ // Sanity checks
+ //
+ ASSERT(Mdl->ByteCount != 0);
+ ASSERT(((ULONG)Mdl->ByteOffset & ~(PAGE_SIZE - 1)) == 0);
+ ASSERT(((ULONG_PTR)Mdl->StartVa & (PAGE_SIZE - 1)) == 0);
+ ASSERT((Mdl->MdlFlags & (MDL_PAGES_LOCKED |
+ MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL |
+ MDL_PARTIAL |
+ MDL_IO_SPACE)) == 0);
+
+ //
+ // Get page and base information
+ //
+ MdlPages = (PPFN_NUMBER)(Mdl + 1);
+ Base = (PVOID)Mdl->StartVa;
+
+ //
+ // Get the addresses and how many pages we span (and need to lock)
+ //
+ Address = (PVOID)((ULONG_PTR)Base + Mdl->ByteOffset);
+ LastAddress = (PVOID)((ULONG_PTR)Address + Mdl->ByteCount);
+ LockPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(Address, Mdl->ByteCount);
+ ASSERT(LockPages != 0);
+
+ //
+ // Get the thread and process
+ //
+ Thread = PsGetCurrentThread();
+ if (Address <= MM_HIGHEST_USER_ADDRESS)
+ {
+ //
+ // Get the process
+ //
+ CurrentProcess = PsGetCurrentProcess();
+ }
+ else
+ {
+ //
+ // No process
+ //
+ CurrentProcess = NULL;
+ }
+
+ //
+ // Save the number of pages we'll have to lock, and the start address
+ //
+ TotalPages = LockPages;
+ StartAddress = Address;
+
+ //
+ // Now probe them
+ //
+ ProbeStatus = STATUS_SUCCESS;
+ _SEH2_TRY
+ {
+ //
+ // Enter probe loop
+ //
+ do
+ {
+ //
+ // Assume failure
+ //
+ *MdlPages = -1;
+
+ //
+ // Read
+ //
+ *(volatile CHAR*)Address;
+
+ //
+ // Check if this is write access (only probe for user-mode)
+ //
+ if ((Operation != IoReadAccess) &&
+ (Address <= MM_HIGHEST_USER_ADDRESS))
+ {
+ //
+ // Probe for write too
+ //
+ ProbeForWriteChar(Address);
+ }
+
+ //
+ // Next address...
+ //
+ Address = (PVOID)((ULONG_PTR)Address + PAGE_SIZE);
+ Address = PAGE_ALIGN(Address);
+
+ //
+ // Next page...
+ //
+ LockPages--;
+ MdlPages++;
+ } while (Address < LastAddress);
+
+ //
+ // Reset back to the original page
+ //
+ ASSERT(LockPages == 0);
+ MdlPages = (PPFN_NUMBER)(Mdl + 1);
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ //
+ // Oops :(
+ //
+ ProbeStatus = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ //
+ // So how did that go?
+ //
+ if (ProbeStatus != STATUS_SUCCESS)
+ {
+ //
+ // Fail
+ //
+ DPRINT1("MDL PROBE FAILED!\n");
+ Mdl->Process = NULL;
+ ExRaiseStatus(ProbeStatus);
+ }
+
+ //
+ // Get the PTE and PDE
+ //
+ PointerPte = MiAddressToPte(StartAddress);
+ PointerPde = MiAddressToPde(StartAddress);
+
+ //
+ // Sanity check
+ //
+ ASSERT(MdlPages = (PPFN_NUMBER)(Mdl + 1));
+
+ //
+ // Check what kind of operation this is
+ //
+ if (Operation != IoReadAccess)
+ {
+ //
+ // Set the write flag
+ //
+ Mdl->MdlFlags |= MDL_WRITE_OPERATION;
+ }
+ else
+ {
+ //
+ // Remove the write flag
+ //
+ Mdl->MdlFlags &= ~(MDL_WRITE_OPERATION);
+ }
+
+ //
+ // Mark the MDL as locked *now*
+ //
+ Mdl->MdlFlags |= MDL_PAGES_LOCKED;
+
+ //
+ // Check if this came from kernel mode
+ //
+ if (Base >= MM_HIGHEST_USER_ADDRESS)
+ {
+ //
+ // We should not have a process
+ //
+ ASSERT(CurrentProcess == NULL);
+ Mdl->Process = NULL;
+
+ //
+ // In kernel mode, we don't need to check for write access
+ //
+ Operation = IoReadAccess;
+
+ //
+ // Use the PFN lock
+ //
+ UsePfnLock = TRUE;
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+ AddressSpace = NULL; // Keep compiler happy
+ }
+ else
+ {
+ //
+ // Sanity checks
+ //
+ ASSERT(TotalPages != 0);
+ ASSERT(CurrentProcess == PsGetCurrentProcess());
+
+ //
+ // Track locked pages
+ //
+ InterlockedExchangeAddSizeT(&CurrentProcess->NumberOfLockedPages,
+ TotalPages);
+
+ //
+ // Save the process
+ //
+ Mdl->Process = CurrentProcess;
+
+ //
+ // Use the process lock
+ //
+ UsePfnLock = FALSE;
+ AddressSpace = &CurrentProcess->Vm;
+ MmLockAddressSpace(AddressSpace);
+ OldIrql = DISPATCH_LEVEL; // Keep compiler happy
+ }
+
+ //
+ // Get the last PTE
+ //
+ LastPte = MiAddressToPte((PVOID)((ULONG_PTR)LastAddress - 1));
+
+ //
+ // Loop the pages
+ //
+ do
+ {
+ //
+ // Assume failure and check for non-mapped pages
+ //
+ *MdlPages = -1;
+ while ((PointerPde->u.Hard.Valid == 0) ||
+ (PointerPte->u.Hard.Valid == 0))
+ {
+ //
+ // What kind of lock where we using?
+ //
+ if (UsePfnLock)
+ {
+ //
+ // Release PFN lock
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+ }
+ else
+ {
+ //
+ // Release process address space lock
+ //
+ MmUnlockAddressSpace(AddressSpace);
+ }
+
+ //
+ // Access the page
+ //
+ Address = MiPteToAddress(PointerPte);
+ Status = MmAccessFault(FALSE, Address, KernelMode, NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ //
+ // Fail
+ //
+ DPRINT1("Access fault failed\n");
+ goto Cleanup;
+ }
+
+ //
+ // Waht lock should we use?
+ //
+ if (UsePfnLock)
+ {
+ //
+ // Grab the PFN lock
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+ }
+ else
+ {
+ //
+ // Use the address space lock
+ //
+ MmLockAddressSpace(AddressSpace);
+ }
+ }
+
+ //
+ // Check if this was a write or modify
+ //
+ if (Operation != IoReadAccess)
+ {
+ //
+ // Check if the PTE is not writable
+ //
+ if (MI_IS_PAGE_WRITEABLE(PointerPte) == FALSE)
+ {
+ //
+ // Check if it's copy on write
+ //
+ if (MI_IS_PAGE_COPY_ON_WRITE(PointerPte))
+ {
+ //
+ // Get the base address and allow a change for user-mode
+ //
+ Address = MiPteToAddress(PointerPte);
+ if (Address <= MM_HIGHEST_USER_ADDRESS)
+ {
+ //
+ // What kind of lock where we using?
+ //
+ if (UsePfnLock)
+ {
+ //
+ // Release PFN lock
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+ }
+ else
+ {
+ //
+ // Release process address space lock
+ //
+ MmUnlockAddressSpace(AddressSpace);
+ }
+
+ //
+ // Access the page
+ //
+ Status = MmAccessFault(TRUE, Address, KernelMode, NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ //
+ // Fail
+ //
+ DPRINT1("Access fault failed\n");
+ goto Cleanup;
+ }
+
+ //
+ // Re-acquire the lock
+ //
+ if (UsePfnLock)
+ {
+ //
+ // Grab the PFN lock
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+ }
+ else
+ {
+ //
+ // Use the address space lock
+ //
+ MmLockAddressSpace(AddressSpace);
+ }
+
+ //
+ // Start over
+ //
+ continue;
+ }
+ }
+
+ //
+ // Fail, since we won't allow this
+ //
+ Status = STATUS_ACCESS_VIOLATION;
+ goto CleanupWithLock;
+ }
+ }
+
+ //
+ // Grab the PFN
+ //
+ PageFrameIndex = PFN_FROM_PTE(PointerPte);
+ if (PageFrameIndex < MmHighestPhysicalPage)
+ {
+ //
+ // Get the PFN entry
+ //
+ Pfn1 = MiGetPfnEntry(PageFrameIndex);
+ ASSERT((CurrentProcess == NULL) || (UsePfnLock == FALSE));
+
+ //
+ // Now lock the page
+ //
+ MmReferencePage(PageFrameIndex);
+ MmLockPage(PageFrameIndex);
+ }
+ else
+ {
+ //
+ // For I/O addresses, just remember this
+ //
+ Mdl->MdlFlags |= MDL_IO_SPACE;
+ }
+
+ //
+ // Write the page and move on
+ //
+ *MdlPages++ = PageFrameIndex;
+ if (!((ULONG_PTR)(++PointerPte) & (PAGE_SIZE - 1))) PointerPde++;
+ } while (PointerPte <= LastPte);
+
+ //
+ // What kind of lock where we using?
+ //
+ if (UsePfnLock)
+ {
+ //
+ // Release PFN lock
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+ }
+ else
+ {
+ //
+ // Release process address space lock
+ //
+ MmUnlockAddressSpace(AddressSpace);
+ }
+
+ //
+ // Sanity check
+ //
+ ASSERT((Mdl->MdlFlags & MDL_DESCRIBES_AWE) == 0);
+ return;
+
+CleanupWithLock:
+ //
+ // This is the failure path
+ //
+ ASSERT(!NT_SUCCESS(Status));
+
+ //
+ // What kind of lock where we using?
+ //
+ if (UsePfnLock)
+ {
+ //
+ // Release PFN lock
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+ }
+ else
+ {
+ //
+ // Release process address space lock
+ //
+ MmUnlockAddressSpace(AddressSpace);
+ }
+Cleanup:
+ //
+ // Pages must be locked so MmUnlock can work
+ //
+ ASSERT(Mdl->MdlFlags & MDL_PAGES_LOCKED);
+ MmUnlockPages(Mdl);
+
+ //
+ // Raise the error
+ //
+ ExRaiseStatus(Status);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+MmUnlockPages(IN PMDL Mdl)
+{
+ PPFN_NUMBER MdlPages, LastPage;
+ PEPROCESS Process;
+ PVOID Base;
+ ULONG Flags, PageCount;
+ KIRQL OldIrql;
+ DPRINT("Unlocking MDL: %p\n", Mdl);
+
+ //
+ // Sanity checks
+ //
+ ASSERT((Mdl->MdlFlags & MDL_PAGES_LOCKED) != 0);
+ ASSERT((Mdl->MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) == 0);
+ ASSERT((Mdl->MdlFlags & MDL_PARTIAL) == 0);
+ ASSERT(Mdl->ByteCount != 0);
+
+ //
+ // Get the process associated and capture the flags which are volatile
+ //
+ Process = Mdl->Process;
+ Flags = Mdl->MdlFlags;
+
+ //
+ // Automagically undo any calls to MmGetSystemAddressForMdl's for this MDL
+ //
+ if (Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA)
+ {
+ //
+ // Unmap the pages from system space
+ //
+ MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl);
+ }
+
+ //
+ // Get the page count
+ //
+ MdlPages = (PPFN_NUMBER)(Mdl + 1);
+ Base = (PVOID)((ULONG_PTR)Mdl->StartVa + Mdl->ByteOffset);
+ PageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(Base, Mdl->ByteCount);
+ ASSERT(PageCount != 0);
+
+ //
+ // We don't support AWE
+ //
+ if (Flags & MDL_DESCRIBES_AWE) ASSERT(FALSE);
+
+ //
+ // Check if the buffer is mapped I/O space
+ //
+ if (Flags & MDL_IO_SPACE)
+ {
+ //
+ // Acquire PFN lock
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+
+ //
+ // Loop every page
+ //
+ LastPage = MdlPages + PageCount;
+ do
+ {
+ //
+ // Last page, break out
+ //
+ if (*MdlPages == -1) break;
+
+ //
+ // Check if this page is in the PFN database
+ //
+ if (*MdlPages <= MmHighestPhysicalPage)
+ {
+ //
+ // Unlock and dereference
+ //
+ MmUnlockPage(*MdlPages);
+ MmDereferencePage(*MdlPages);
+ }
+ } while (++MdlPages < LastPage);
+
+ //
+ // Release the lock
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+
+ //
+ // Check if we have a process
+ //
+ if (Process)
+ {
+ //
+ // Handle the accounting of locked pages
+ //
+ ASSERT(Process->NumberOfLockedPages > 0);
+ InterlockedExchangeAddSizeT(&Process->NumberOfLockedPages,
+ -PageCount);
+ }
+
+ //
+ // We're done
+ //
+ Mdl->MdlFlags &= ~MDL_IO_SPACE;
+ Mdl->MdlFlags &= ~MDL_PAGES_LOCKED;
+ return;
+ }
+
+ //
+ // Check if we have a process
+ //
+ if (Process)
+ {
+ //
+ // Handle the accounting of locked pages
+ //
+ ASSERT(Process->NumberOfLockedPages > 0);
+ InterlockedExchangeAddSizeT(&Process->NumberOfLockedPages,
+ -PageCount);
+ }
+
+ //
+ // Loop every page
+ //
+ LastPage = MdlPages + PageCount;
+ do
+ {
+ //
+ // Last page reached
+ //
+ if (*MdlPages == -1)
+ {
+ //
+ // Were there no pages at all?
+ //
+ if (MdlPages == (PPFN_NUMBER)(Mdl + 1))
+ {
+ //
+ // We're already done
+ //
+ Mdl->MdlFlags &= ~MDL_PAGES_LOCKED;
+ return;
+ }
+
+ //
+ // Otherwise, stop here
+ //
+ LastPage = MdlPages;
+ break;
+ }
+
+ //
+ // Sanity check
+ //
+ ASSERT(*MdlPages <= MmHighestPhysicalPage);
+ } while (++MdlPages < LastPage);
+
+ //
+ // Reset pointer
+ //
+ MdlPages = (PPFN_NUMBER)(Mdl + 1);
+
+ //
+ // Now grab the PFN lock for the actual unlock and dereference
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+ do
+ {
+ //
+ // Unlock and dereference
+ //
+ MmUnlockPage(*MdlPages);
+ MmDereferencePage(*MdlPages);
+ } while (++MdlPages < LastPage);
+
+ //
+ // Release the lock
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+
+ //
+ // We're done
+ //
+ Mdl->MdlFlags &= ~MDL_PAGES_LOCKED;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+MmAdvanceMdl(IN PMDL Mdl,
+ IN ULONG NumberOfBytes)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+PVOID
+NTAPI
+MmMapLockedPagesWithReservedMapping(IN PVOID MappingAddress,
+ IN ULONG PoolTag,
+ IN PMDL MemoryDescriptorList,
+ IN MEMORY_CACHING_TYPE CacheType)
+{
+ UNIMPLEMENTED;
+ return 0;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+MmUnmapReservedMapping(IN PVOID BaseAddress,
+ IN ULONG PoolTag,
+ IN PMDL MemoryDescriptorList)
+{
+ UNIMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+MmPrefetchPages(IN ULONG NumberOfLists,
+ IN PREAD_LIST *ReadLists)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+MmProtectMdlSystemAddress(IN PMDL MemoryDescriptorList,
+ IN ULONG NewProtect)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+MmProbeAndLockProcessPages(IN OUT PMDL MemoryDescriptorList,
+ IN PEPROCESS Process,
+ IN KPROCESSOR_MODE AccessMode,
+ IN LOCK_OPERATION Operation)
+{
+ UNIMPLEMENTED;
+}
+
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+MmProbeAndLockSelectedPages(IN OUT PMDL MemoryDescriptorList,
+ IN LARGE_INTEGER PageList[],
+ IN KPROCESSOR_MODE AccessMode,
+ IN LOCK_OPERATION Operation)
+{
+ UNIMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+MmMapMemoryDumpMdl(IN PMDL Mdl)
+{
+ UNIMPLEMENTED;
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h
new file mode 100644
index 00000000000..a9506daa88a
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/miarm.h
@@ -0,0 +1,224 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/miarm.h
+ * PURPOSE: ARM Memory Manager Header
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+#define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255*1024*1024) >> PAGE_SHIFT)
+#define MI_MIN_PAGES_FOR_SYSPTE_TUNING ((19*1024*1024) >> PAGE_SHIFT)
+#define MI_MIN_PAGES_FOR_SYSPTE_BOOST ((32*1024*1024) >> PAGE_SHIFT)
+#define MI_MAX_INIT_NONPAGED_POOL_SIZE (128 * 1024 * 1024)
+#define MI_MAX_NONPAGED_POOL_SIZE (128 * 1024 * 1024)
+#define MI_MAX_FREE_PAGE_LISTS 4
+
+#define MI_MIN_INIT_PAGED_POOLSIZE (32 * 1024 * 1024)
+
+#define MI_SESSION_VIEW_SIZE (20 * 1024 * 1024)
+#define MI_SESSION_POOL_SIZE (16 * 1024 * 1024)
+#define MI_SESSION_IMAGE_SIZE (8 * 1024 * 1024)
+#define MI_SESSION_WORKING_SET_SIZE (4 * 1024 * 1024)
+#define MI_SESSION_SIZE (MI_SESSION_VIEW_SIZE + \
+ MI_SESSION_POOL_SIZE + \
+ MI_SESSION_IMAGE_SIZE + \
+ MI_SESSION_WORKING_SET_SIZE)
+
+#define MI_SYSTEM_VIEW_SIZE (16 * 1024 * 1024)
+
+#define MI_PAGED_POOL_START (PVOID)0xE1000000
+#define MI_NONPAGED_POOL_END (PVOID)0xFFBE0000
+
+//
+// FIXFIX: These should go in ex.h after the pool merge
+//
+#define POOL_LISTS_PER_PAGE (PAGE_SIZE / sizeof(LIST_ENTRY))
+#define BASE_POOL_TYPE_MASK 1
+#define POOL_MAX_ALLOC (PAGE_SIZE - (sizeof(POOL_HEADER) + sizeof(LIST_ENTRY)))
+
+typedef struct _POOL_DESCRIPTOR
+{
+ POOL_TYPE PoolType;
+ ULONG PoolIndex;
+ ULONG RunningAllocs;
+ ULONG RunningDeAllocs;
+ ULONG TotalPages;
+ ULONG TotalBigPages;
+ ULONG Threshold;
+ PVOID LockAddress;
+ PVOID PendingFrees;
+ LONG PendingFreeDepth;
+ SIZE_T TotalBytes;
+ SIZE_T Spare0;
+ LIST_ENTRY ListHeads[POOL_LISTS_PER_PAGE];
+} POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;
+
+typedef struct _POOL_HEADER
+{
+ union
+ {
+ struct
+ {
+ USHORT PreviousSize:9;
+ USHORT PoolIndex:7;
+ USHORT BlockSize:9;
+ USHORT PoolType:7;
+ };
+ ULONG Ulong1;
+ };
+ union
+ {
+ ULONG PoolTag;
+ struct
+ {
+ USHORT AllocatorBackTraceIndex;
+ USHORT PoolTagHash;
+ };
+ };
+} POOL_HEADER, *PPOOL_HEADER;
+
+//
+// Everything depends on this
+//
+C_ASSERT(sizeof(POOL_HEADER) == 8);
+C_ASSERT(sizeof(POOL_HEADER) == sizeof(LIST_ENTRY));
+
+//
+// END FIXFIX
+//
+
+typedef enum _MMSYSTEM_PTE_POOL_TYPE
+{
+ SystemPteSpace,
+ NonPagedPoolExpansion,
+ MaximumPtePoolTypes
+} MMSYSTEM_PTE_POOL_TYPE;
+
+typedef enum _MI_PFN_CACHE_ATTRIBUTE
+{
+ MiNonCached,
+ MiCached,
+ MiWriteCombined,
+ MiNotMapped
+} MI_PFN_CACHE_ATTRIBUTE, *PMI_PFN_CACHE_ATTRIBUTE;
+
+typedef struct _PHYSICAL_MEMORY_RUN
+{
+ ULONG BasePage;
+ ULONG PageCount;
+} PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;
+
+typedef struct _PHYSICAL_MEMORY_DESCRIPTOR
+{
+ ULONG NumberOfRuns;
+ ULONG NumberOfPages;
+ PHYSICAL_MEMORY_RUN Run[1];
+} PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
+
+extern MMPTE HyperTemplatePte;
+
+extern ULONG MmSizeOfNonPagedPoolInBytes;
+extern ULONG MmMaximumNonPagedPoolInBytes;
+extern PVOID MmNonPagedPoolStart;
+extern PVOID MmNonPagedPoolExpansionStart;
+extern PVOID MmNonPagedPoolEnd;
+extern PMMPTE MmFirstReservedMappingPte, MmLastReservedMappingPte;
+extern PMMPTE MiFirstReservedZeroingPte;
+extern MI_PFN_CACHE_ATTRIBUTE MiPlatformCacheAttributes[2][MmMaximumCacheType];
+extern PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;
+extern ULONG MmBootImageSize;
+extern PMMPTE MmSystemPtesStart[MaximumPtePoolTypes];
+extern PMMPTE MmSystemPtesEnd[MaximumPtePoolTypes];
+extern PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor;
+extern MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor;
+extern ULONG MxPfnAllocation;
+extern MM_PAGED_POOL_INFO MmPagedPoolInfo;
+extern RTL_BITMAP MiPfnBitMap;
+
+VOID
+NTAPI
+MiInitializeArmPool(
+ VOID
+);
+
+VOID //
+NTAPI //
+InitializePool( //
+ IN POOL_TYPE PoolType,// FIXFIX: This should go in ex.h after the pool merge
+ IN ULONG Threshold //
+); //
+
+VOID
+NTAPI
+MiInitializeSystemPtes(
+ IN PMMPTE StartingPte,
+ IN ULONG NumberOfPtes,
+ IN MMSYSTEM_PTE_POOL_TYPE PoolType
+);
+
+PMMPTE
+NTAPI
+MiReserveSystemPtes(
+ IN ULONG NumberOfPtes,
+ IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
+);
+
+VOID
+NTAPI
+MiReleaseSystemPtes(
+ IN PMMPTE StartingPte,
+ IN ULONG NumberOfPtes,
+ IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
+);
+
+
+PFN_NUMBER
+NTAPI
+MiFindContiguousPages(
+ IN PFN_NUMBER LowestPfn,
+ IN PFN_NUMBER HighestPfn,
+ IN PFN_NUMBER BoundaryPfn,
+ IN PFN_NUMBER SizeInPages,
+ IN MEMORY_CACHING_TYPE CacheType
+);
+
+PVOID
+NTAPI
+MiCheckForContiguousMemory(
+ IN PVOID BaseAddress,
+ IN PFN_NUMBER BaseAddressPages,
+ IN PFN_NUMBER SizeInPages,
+ IN PFN_NUMBER LowestPfn,
+ IN PFN_NUMBER HighestPfn,
+ IN PFN_NUMBER BoundaryPfn,
+ IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute
+);
+
+PMDL
+NTAPI
+MiAllocatePagesForMdl(
+ IN PHYSICAL_ADDRESS LowAddress,
+ IN PHYSICAL_ADDRESS HighAddress,
+ IN PHYSICAL_ADDRESS SkipBytes,
+ IN SIZE_T TotalBytes,
+ IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
+ IN ULONG Flags
+);
+
+PVOID
+NTAPI
+MiMapLockedPagesInUserSpace(
+ IN PMDL Mdl,
+ IN PVOID BaseVa,
+ IN MEMORY_CACHING_TYPE CacheType,
+ IN PVOID BaseAddress
+);
+
+VOID
+NTAPI
+MiUnmapLockedPagesInUserSpace(
+ IN PVOID BaseAddress,
+ IN PMDL Mdl
+);
+
+/* EOF */
diff --git a/reactos/ntoskrnl/mm/ARM3/ncache.c b/reactos/ntoskrnl/mm/ARM3/ncache.c
new file mode 100644
index 00000000000..7979d391847
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/ncache.c
@@ -0,0 +1,214 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/ncache.c
+ * PURPOSE: ARM Memory Manager Noncached Memory Allocator
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#line 15 "ARM³::NCACHE"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* GLOBALS ********************************************************************/
+
+/*
+ * @implemented
+ */
+PVOID
+NTAPI
+MmAllocateNonCachedMemory(IN ULONG NumberOfBytes)
+{
+ PFN_NUMBER PageCount, MdlPageCount, PageFrameIndex;
+ PHYSICAL_ADDRESS LowAddress, HighAddress, SkipBytes;
+ MI_PFN_CACHE_ATTRIBUTE CacheAttribute;
+ PMDL Mdl;
+ PVOID BaseAddress;
+ PPFN_NUMBER MdlPages;
+ PMMPTE PointerPte;
+ MMPTE TempPte;
+
+ //
+ // Get the page count
+ //
+ ASSERT(NumberOfBytes != 0);
+ PageCount = BYTES_TO_PAGES(NumberOfBytes);
+
+ //
+ // Use the MDL allocator for simplicity, so setup the parameters
+ //
+ LowAddress.QuadPart = 0;
+ HighAddress.QuadPart = -1;
+ SkipBytes.QuadPart = 0;
+ CacheAttribute = MiPlatformCacheAttributes[0][MmNonCached];
+
+ //
+ // Now call the MDL allocator
+ //
+ Mdl = MiAllocatePagesForMdl(LowAddress,
+ HighAddress,
+ SkipBytes,
+ NumberOfBytes,
+ CacheAttribute,
+ 0);
+ if (!Mdl) return NULL;
+
+ //
+ // Get the MDL VA and check how many pages we got (could be partial)
+ //
+ BaseAddress = (PVOID)((ULONG_PTR)Mdl->StartVa + Mdl->ByteOffset);
+ MdlPageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(BaseAddress, Mdl->ByteCount);
+ if (PageCount != MdlPageCount)
+ {
+ //
+ // Unlike MDLs, partial isn't okay for a noncached allocation, so fail
+ //
+ ASSERT(PageCount > MdlPageCount);
+ MmFreePagesFromMdl(Mdl);
+ ExFreePool(Mdl);
+ return NULL;
+ }
+
+ //
+ // Allocate system PTEs for the base address
+ // We use an extra page to store the actual MDL pointer for the free later
+ //
+ PointerPte = MiReserveSystemPtes(PageCount + 1, SystemPteSpace);
+ if (!PointerPte)
+ {
+ //
+ // Out of memory...
+ //
+ MmFreePagesFromMdl(Mdl);
+ ExFreePool(Mdl);
+ return NULL;
+ }
+
+ //
+ // Store the MDL pointer
+ //
+ *(PMDL*)PointerPte++ = Mdl;
+
+ //
+ // Okay, now see what range we got
+ //
+ BaseAddress = MiPteToAddress(PointerPte);
+
+ //
+ // This is our array of pages
+ //
+ MdlPages = (PPFN_NUMBER)(Mdl + 1);
+
+ //
+ // Setup the template PTE
+ //
+ TempPte = HyperTemplatePte;
+
+ //
+ // Now check what kind of caching we should use
+ //
+ switch (CacheAttribute)
+ {
+ case MiNonCached:
+
+ //
+ // Disable caching
+ //
+ MI_PAGE_DISABLE_CACHE(&TempPte);
+ MI_PAGE_WRITE_THROUGH(&TempPte);
+ break;
+
+ case MiWriteCombined:
+
+ //
+ // Enable write combining
+ //
+ MI_PAGE_DISABLE_CACHE(&TempPte);
+ MI_PAGE_WRITE_COMBINED(&TempPte);
+ break;
+
+ default:
+ //
+ // Nothing to do
+ //
+ break;
+ }
+
+ //
+ // Now loop the MDL pages
+ //
+ do
+ {
+ //
+ // Get the PFN
+ //
+ PageFrameIndex = *MdlPages++;
+
+ //
+ // Set the PFN in the page and write it
+ //
+ TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+ ASSERT(TempPte.u.Hard.Valid == 1);
+ *PointerPte++ = TempPte;
+ } while (--PageCount);
+
+ //
+ // Return the base address
+ //
+ return BaseAddress;
+
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+MmFreeNonCachedMemory(IN PVOID BaseAddress,
+ IN ULONG NumberOfBytes)
+{
+ PMDL Mdl;
+ PMMPTE PointerPte;
+ PFN_NUMBER PageCount;
+
+ //
+ // Sanity checks
+ //
+ ASSERT(NumberOfBytes != 0);
+ ASSERT(PAGE_ALIGN(BaseAddress) == BaseAddress);
+
+ //
+ // Get the page count
+ //
+ PageCount = BYTES_TO_PAGES(NumberOfBytes);
+
+ //
+ // Get the first PTE
+ //
+ PointerPte = MiAddressToPte(BaseAddress);
+
+ //
+ // Remember this is where we store the shadow MDL pointer
+ //
+ Mdl = *(PMDL*)(--PointerPte);
+
+ //
+ // Kill the MDL (and underlying pages)
+ //
+ MmFreePagesFromMdl(Mdl);
+ ExFreePool(Mdl);
+
+ //
+ // Now free the system PTEs for the underlying VA
+ //
+ MiReleaseSystemPtes(PointerPte, PageCount + 1, SystemPteSpace);
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/mm/ARM3/pool.c b/reactos/ntoskrnl/mm/ARM3/pool.c
new file mode 100644
index 00000000000..aa2603a5acc
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/pool.c
@@ -0,0 +1,585 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/pool.c
+ * PURPOSE: ARM Memory Manager Pool Allocator
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#line 15 "ARM³::POOL"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* GLOBALS ********************************************************************/
+
+LIST_ENTRY MmNonPagedPoolFreeListHead[MI_MAX_FREE_PAGE_LISTS];
+PFN_NUMBER MmNumberOfFreeNonPagedPool, MiExpansionPoolPagesInitialCharge;
+PVOID MmNonPagedPoolEnd0;
+PFN_NUMBER MiStartOfInitialPoolFrame, MiEndOfInitialPoolFrame;
+
+MM_PAGED_POOL_INFO MmPagedPoolInfo;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+VOID
+NTAPI
+MiInitializeArmPool(VOID)
+{
+ ULONG i;
+ PFN_NUMBER PoolPages;
+ PMMFREE_POOL_ENTRY FreeEntry, FirstEntry;
+ PMMPTE PointerPte;
+ PAGED_CODE();
+
+ //
+ // We keep 4 lists of free pages (4 lists help avoid contention)
+ //
+ for (i = 0; i < MI_MAX_FREE_PAGE_LISTS; i++)
+ {
+ //
+ // Initialize each of them
+ //
+ InitializeListHead(&MmNonPagedPoolFreeListHead[i]);
+ }
+
+ //
+ // Calculate how many pages the initial nonpaged pool has
+ //
+ PoolPages = BYTES_TO_PAGES(MmSizeOfNonPagedPoolInBytes);
+ MmNumberOfFreeNonPagedPool = PoolPages;
+
+ //
+ // Initialize the first free entry
+ //
+ FreeEntry = MmNonPagedPoolStart;
+ FirstEntry = FreeEntry;
+ FreeEntry->Size = PoolPages;
+ FreeEntry->Owner = FirstEntry;
+
+ //
+ // Insert it into the last list
+ //
+ InsertHeadList(&MmNonPagedPoolFreeListHead[MI_MAX_FREE_PAGE_LISTS - 1],
+ &FreeEntry->List);
+
+ //
+ // Now create free entries for every single other page
+ //
+ while (PoolPages-- > 1)
+ {
+ //
+ // Link them all back to the original entry
+ //
+ FreeEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)FreeEntry + PAGE_SIZE);
+ FreeEntry->Owner = FirstEntry;
+ }
+
+ //
+ // Validate and remember first allocated pool page
+ //
+ PointerPte = MiAddressToPte(MmNonPagedPoolStart);
+ ASSERT(PointerPte->u.Hard.Valid == 1);
+ MiStartOfInitialPoolFrame = PFN_FROM_PTE(PointerPte);
+
+ //
+ // Keep track of where initial nonpaged pool ends
+ //
+ MmNonPagedPoolEnd0 = (PVOID)((ULONG_PTR)MmNonPagedPoolStart +
+ MmSizeOfNonPagedPoolInBytes);
+
+ //
+ // Validate and remember last allocated pool page
+ //
+ PointerPte = MiAddressToPte((PVOID)((ULONG_PTR)MmNonPagedPoolEnd0 - 1));
+ ASSERT(PointerPte->u.Hard.Valid == 1);
+ MiEndOfInitialPoolFrame = PFN_FROM_PTE(PointerPte);
+
+ //
+ // Validate the first nonpaged pool expansion page (which is a guard page)
+ //
+ PointerPte = MiAddressToPte(MmNonPagedPoolExpansionStart);
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+
+ //
+ // Calculate the size of the expansion region alone
+ //
+ MiExpansionPoolPagesInitialCharge =
+ BYTES_TO_PAGES(MmMaximumNonPagedPoolInBytes - MmSizeOfNonPagedPoolInBytes);
+
+ //
+ // Remove 2 pages, since there's a guard page on top and on the bottom
+ //
+ MiExpansionPoolPagesInitialCharge -= 2;
+
+ //
+ // Now initialize the nonpaged pool expansion PTE space. Remember there's a
+ // guard page on top so make sure to skip it. The bottom guard page will be
+ // guaranteed by the fact our size is off by one.
+ //
+ MiInitializeSystemPtes(PointerPte + 1,
+ MiExpansionPoolPagesInitialCharge,
+ NonPagedPoolExpansion);
+}
+
+PVOID
+NTAPI
+MiAllocatePoolPages(IN POOL_TYPE PoolType,
+ IN SIZE_T SizeInBytes)
+{
+ PFN_NUMBER SizeInPages, PageFrameNumber;
+ ULONG i;
+ KIRQL OldIrql;
+ PLIST_ENTRY NextEntry, NextHead, LastHead;
+ PMMPTE PointerPte, StartPte;
+ MMPTE TempPte;
+ PMMPFN Pfn1;
+ PVOID BaseVa;
+ PMMFREE_POOL_ENTRY FreeEntry;
+
+ //
+ // Figure out how big the allocation is in pages
+ //
+ SizeInPages = BYTES_TO_PAGES(SizeInBytes);
+
+ //
+ // Allocations of less than 4 pages go into their individual buckets
+ //
+ i = SizeInPages - 1;
+ if (i >= MI_MAX_FREE_PAGE_LISTS) i = MI_MAX_FREE_PAGE_LISTS - 1;
+
+ //
+ // Loop through all the free page lists based on the page index
+ //
+ NextHead = &MmNonPagedPoolFreeListHead[i];
+ LastHead = &MmNonPagedPoolFreeListHead[MI_MAX_FREE_PAGE_LISTS];
+
+ //
+ // Acquire the nonpaged pool lock
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueueMmNonPagedPoolLock);
+ do
+ {
+ //
+ // Now loop through all the free page entries in this given list
+ //
+ NextEntry = NextHead->Flink;
+ while (NextEntry != NextHead)
+ {
+ //
+ // Grab the entry and see if it can handle our allocation
+ //
+ FreeEntry = CONTAINING_RECORD(NextEntry, MMFREE_POOL_ENTRY, List);
+ if (FreeEntry->Size >= SizeInPages)
+ {
+ //
+ // It does, so consume the pages from here
+ //
+ FreeEntry->Size -= SizeInPages;
+
+ //
+ // The allocation will begin in this free page area
+ //
+ BaseVa = (PVOID)((ULONG_PTR)FreeEntry +
+ (FreeEntry->Size << PAGE_SHIFT));
+
+ //
+ // This is not a free page segment anymore
+ //
+ RemoveEntryList(&FreeEntry->List);
+
+ //
+ // However, check if its' still got space left
+ //
+ if (FreeEntry->Size != 0)
+ {
+ //
+ // Insert it back into a different list, based on its pages
+ //
+ i = FreeEntry->Size - 1;
+ if (i >= MI_MAX_FREE_PAGE_LISTS) i = MI_MAX_FREE_PAGE_LISTS - 1;
+ InsertTailList (&MmNonPagedPoolFreeListHead[i],
+ &FreeEntry->List);
+ }
+
+ //
+ // Grab the PTE for this allocation
+ //
+ PointerPte = MiAddressToPte(BaseVa);
+ ASSERT(PointerPte->u.Hard.Valid == 1);
+
+ //
+ // Grab the PFN NextEntry and index
+ //
+ Pfn1 = MiGetPfnEntry(PFN_FROM_PTE(PointerPte));
+
+ //
+ // Now mark it as the beginning of an allocation
+ //
+ ASSERT(Pfn1->u3.e1.StartOfAllocation == 0);
+ Pfn1->u3.e1.StartOfAllocation = 1;
+
+ //
+ // Check if the allocation is larger than one page
+ //
+ if (SizeInPages != 1)
+ {
+ //
+ // Navigate to the last PFN entry and PTE
+ //
+ PointerPte += SizeInPages - 1;
+ ASSERT(PointerPte->u.Hard.Valid == 1);
+ Pfn1 = MiGetPfnEntry(PointerPte->u.Hard.PageFrameNumber);
+ }
+
+ //
+ // Mark this PFN as the last (might be the same as the first)
+ //
+ ASSERT(Pfn1->u3.e1.EndOfAllocation == 0);
+ Pfn1->u3.e1.EndOfAllocation = 1;
+
+ //
+ // Release the nonpaged pool lock, and return the allocation
+ //
+ KeReleaseQueuedSpinLock(LockQueueMmNonPagedPoolLock, OldIrql);
+ return BaseVa;
+ }
+
+ //
+ // Try the next free page entry
+ //
+ NextEntry = FreeEntry->List.Flink;
+ }
+ } while (++NextHead < LastHead);
+
+ //
+ // If we got here, we're out of space.
+ // Start by releasing the lock
+ //
+ KeReleaseQueuedSpinLock(LockQueueMmNonPagedPoolLock, OldIrql);
+
+ //
+ // Allocate some system PTEs
+ //
+ StartPte = MiReserveSystemPtes(SizeInPages, NonPagedPoolExpansion);
+ PointerPte = StartPte;
+ if (StartPte == NULL)
+ {
+ //
+ // Ran out of memory
+ //
+ DPRINT1("Out of NP Expansion Pool\n");
+ return NULL;
+ }
+
+ //
+ // Acquire the pool lock now
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueueMmNonPagedPoolLock);
+
+ //
+ // Lock the PFN database too
+ //
+ //KeAcquireQueuedSpinLockAtDpcLevel(LockQueuePfnLock);
+
+ //
+ // Loop the pages
+ //
+ TempPte = HyperTemplatePte;
+ do
+ {
+ //
+ // Allocate a page
+ //
+ PageFrameNumber = MmAllocPage(MC_NPPOOL, 0);
+
+ //
+ // Get the PFN entry for it
+ //
+ Pfn1 = MiGetPfnEntry(PageFrameNumber);
+
+ //
+ // Write the PTE for it
+ //
+ TempPte.u.Hard.PageFrameNumber = PageFrameNumber;
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+ ASSERT(TempPte.u.Hard.Valid == 1);
+ *PointerPte++ = TempPte;
+ } while (--SizeInPages > 0);
+
+ //
+ // This is the last page
+ //
+ Pfn1->u3.e1.EndOfAllocation = 1;
+
+ //
+ // Get the first page and mark it as such
+ //
+ Pfn1 = MiGetPfnEntry(StartPte->u.Hard.PageFrameNumber);
+ Pfn1->u3.e1.StartOfAllocation = 1;
+
+ //
+ // Release the PFN and nonpaged pool lock
+ //
+ //KeReleaseQueuedSpinLockFromDpcLevel(LockQueuePfnLock);
+ KeReleaseQueuedSpinLock(LockQueueMmNonPagedPoolLock, OldIrql);
+
+ //
+ // Return the address
+ //
+ return MiPteToAddress(StartPte);
+}
+
+ULONG
+NTAPI
+MiFreePoolPages(IN PVOID StartingVa)
+{
+ PMMPTE PointerPte, StartPte;
+ PMMPFN Pfn1, StartPfn;
+ PFN_NUMBER FreePages, NumberOfPages;
+ KIRQL OldIrql;
+ PMMFREE_POOL_ENTRY FreeEntry, NextEntry, LastEntry;
+ ULONG i;
+
+ //
+ // Get the first PTE and its corresponding PFN entry
+ //
+ StartPte = PointerPte = MiAddressToPte(StartingVa);
+ StartPfn = Pfn1 = MiGetPfnEntry(PointerPte->u.Hard.PageFrameNumber);
+
+ //
+ // Loop until we find the last PTE
+ //
+ while (Pfn1->u3.e1.EndOfAllocation == 0)
+ {
+ //
+ // Keep going
+ //
+ PointerPte++;
+ Pfn1 = MiGetPfnEntry(PointerPte->u.Hard.PageFrameNumber);
+ }
+
+ //
+ // Now we know how many pages we have
+ //
+ NumberOfPages = PointerPte - StartPte + 1;
+
+ //
+ // Acquire the nonpaged pool lock
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueueMmNonPagedPoolLock);
+
+ //
+ // Mark the first and last PTEs as not part of an allocation anymore
+ //
+ StartPfn->u3.e1.StartOfAllocation = 0;
+ Pfn1->u3.e1.EndOfAllocation = 0;
+
+ //
+ // Assume we will free as many pages as the allocation was
+ //
+ FreePages = NumberOfPages;
+
+ //
+ // Peek one page past the end of the allocation
+ //
+ PointerPte++;
+
+ //
+ // Guard against going past initial nonpaged pool
+ //
+ if (MiGetPfnEntryIndex(Pfn1) == MiEndOfInitialPoolFrame)
+ {
+ //
+ // This page is on the outskirts of initial nonpaged pool, so ignore it
+ //
+ Pfn1 = NULL;
+ }
+ else
+ {
+ //
+ // Otherwise, our entire allocation must've fit within the initial non
+ // paged pool, or the expansion nonpaged pool, so get the PFN entry of
+ // the next allocation
+ //
+ ASSERT((ULONG_PTR)StartingVa + NumberOfPages <= (ULONG_PTR)MmNonPagedPoolEnd);
+ if (PointerPte->u.Hard.Valid == 1)
+ {
+ //
+ // It's either expansion or initial: get the PFN entry
+ //
+ Pfn1 = MiGetPfnEntry(PointerPte->u.Hard.PageFrameNumber);
+ }
+ else
+ {
+ //
+ // This means we've reached the guard page that protects the end of
+ // the expansion nonpaged pool
+ //
+ Pfn1 = NULL;
+ }
+
+ }
+
+ //
+ // Check if this allocation actually exists
+ //
+ if ((Pfn1) && (Pfn1->u3.e1.StartOfAllocation == 0))
+ {
+ //
+ // It doesn't, so we should actually locate a free entry descriptor
+ //
+ FreeEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)StartingVa +
+ (NumberOfPages << PAGE_SHIFT));
+ ASSERT(FreeEntry->Owner == FreeEntry);
+
+ //
+ // Consume this entry's pages, and remove it from its free list
+ //
+ FreePages += FreeEntry->Size;
+ RemoveEntryList (&FreeEntry->List);
+ }
+
+ //
+ // Now get the official free entry we'll create for the caller's allocation
+ //
+ FreeEntry = StartingVa;
+
+ //
+ // Check if the our allocation is the very first page
+ //
+ if (MiGetPfnEntryIndex(StartPfn) == MiStartOfInitialPoolFrame)
+ {
+ //
+ // Then we can't do anything or we'll risk underflowing
+ //
+ Pfn1 = NULL;
+ }
+ else
+ {
+ //
+ // Otherwise, get the PTE for the page right before our allocation
+ //
+ PointerPte -= NumberOfPages + 1;
+ if (PointerPte->u.Hard.Valid == 1)
+ {
+ //
+ // It's either expansion or initial nonpaged pool, get the PFN entry
+ //
+ Pfn1 = MiGetPfnEntry(PointerPte->u.Hard.PageFrameNumber);
+ }
+ else
+ {
+ //
+ // We must've reached the guard page, so don't risk touching it
+ //
+ Pfn1 = NULL;
+ }
+ }
+
+ //
+ // Check if there is a valid PFN entry for the page before the allocation
+ // and then check if this page was actually the end of an allocation.
+ // If it wasn't, then we know for sure it's a free page
+ //
+ if ((Pfn1) && (Pfn1->u3.e1.EndOfAllocation == 0))
+ {
+ //
+ // Get the free entry descriptor for that given page range
+ //
+ FreeEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)StartingVa - PAGE_SIZE);
+ FreeEntry = FreeEntry->Owner;
+
+ //
+ // Check if the entry is small enough to be indexed on a free list
+ // If it is, we'll want to re-insert it, since we're about to
+ // collapse our pages on top of it, which will change its count
+ //
+ if (FreeEntry->Size < (MI_MAX_FREE_PAGE_LISTS - 1))
+ {
+ //
+ // Remove the list from where it is now
+ //
+ RemoveEntryList(&FreeEntry->List);
+
+ //
+ // Update its size
+ //
+ FreeEntry->Size += FreePages;
+
+ //
+ // And now find the new appropriate list to place it in
+ //
+ i = (ULONG)(FreeEntry->Size - 1);
+ if (i >= MI_MAX_FREE_PAGE_LISTS) i = MI_MAX_FREE_PAGE_LISTS - 1;
+
+ //
+ // Do it
+ //
+ InsertTailList(&MmNonPagedPoolFreeListHead[i], &FreeEntry->List);
+ }
+ else
+ {
+ //
+ // Otherwise, just combine our free pages into this entry
+ //
+ FreeEntry->Size += FreePages;
+ }
+ }
+
+ //
+ // Check if we were unable to do any compaction, and we'll stick with this
+ //
+ if (FreeEntry == StartingVa)
+ {
+ //
+ // Well, now we are a free entry. At worse we just have our newly freed
+ // pages, at best we have our pages plus whatever entry came after us
+ //
+ FreeEntry->Size = FreePages;
+
+ //
+ // Find the appropriate list we should be on
+ //
+ i = FreeEntry->Size - 1;
+ if (i >= MI_MAX_FREE_PAGE_LISTS) i = MI_MAX_FREE_PAGE_LISTS - 1;
+
+ //
+ // And insert us
+ //
+ InsertTailList (&MmNonPagedPoolFreeListHead[i], &FreeEntry->List);
+ }
+
+ //
+ // Just a sanity check
+ //
+ ASSERT(FreePages != 0);
+
+ //
+ // Get all the pages between our allocation and its end. These will all now
+ // become free page chunks.
+ //
+ NextEntry = StartingVa;
+ LastEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)NextEntry + (FreePages << PAGE_SHIFT));
+ do
+ {
+ //
+ // Link back to the parent free entry, and keep going
+ //
+ NextEntry->Owner = FreeEntry;
+ NextEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)NextEntry + PAGE_SIZE);
+ } while (NextEntry != LastEntry);
+
+ //
+ // We're done, release the lock and let the caller know how much we freed
+ //
+ KeReleaseQueuedSpinLock(LockQueueMmNonPagedPoolLock, OldIrql);
+ return NumberOfPages;
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c
new file mode 100644
index 00000000000..919b3e43de4
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/procsup.c
@@ -0,0 +1,281 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/procsup.c
+ * PURPOSE: ARM Memory Manager Process Related Management
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#line 15 "ARM³::PROCSUP"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+VOID
+NTAPI
+MmDeleteKernelStack(IN PVOID StackBase,
+ IN BOOLEAN GuiStack)
+{
+ PMMPTE PointerPte;
+ PFN_NUMBER StackPages;
+ ULONG i;
+
+ //
+ // This should be the guard page, so decrement by one
+ //
+ PointerPte = MiAddressToPte(StackBase);
+ PointerPte--;
+
+ //
+ // Calculate pages used
+ //
+ StackPages = BYTES_TO_PAGES(GuiStack ?
+ KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE);
+
+ //
+ // Loop them
+ //
+ for (i = 0; i < StackPages; i++)
+ {
+ //
+ // Check if this is a valid PTE
+ //
+ if (PointerPte->u.Hard.Valid == 1)
+ {
+ //
+ // Nuke it
+ //
+ MmReleasePageMemoryConsumer(MC_NPPOOL, PFN_FROM_PTE(PointerPte));
+ }
+
+ //
+ // Next one
+ //
+ PointerPte--;
+ }
+
+ //
+ // We should be at the guard page now
+ //
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+
+ //
+ // Release the PTEs
+ //
+ MiReleaseSystemPtes(PointerPte, StackPages + 1, SystemPteSpace);
+}
+
+PVOID
+NTAPI
+MmCreateKernelStack(IN BOOLEAN GuiStack,
+ IN UCHAR Node)
+{
+ PFN_NUMBER StackPtes, StackPages;
+ PMMPTE PointerPte, StackPte;
+ PVOID BaseAddress;
+ MMPTE TempPte;
+ KIRQL OldIrql;
+ PFN_NUMBER PageFrameIndex;
+ ULONG i;
+
+ //
+ // Calculate pages needed
+ //
+ if (GuiStack)
+ {
+ //
+ // We'll allocate 64KB stack, but only commit 12K
+ //
+ StackPtes = BYTES_TO_PAGES(KERNEL_LARGE_STACK_SIZE);
+ StackPages = BYTES_TO_PAGES(KERNEL_LARGE_STACK_COMMIT);
+
+ }
+ else
+ {
+ //
+ // We'll allocate 12K and that's it
+ //
+ StackPtes = BYTES_TO_PAGES(KERNEL_STACK_SIZE);
+ StackPages = StackPtes;
+ }
+
+ //
+ // Reserve stack pages, plus a guard page
+ //
+ StackPte = MiReserveSystemPtes(StackPtes + 1, SystemPteSpace);
+ if (!StackPte) return NULL;
+
+ //
+ // Get the stack address
+ //
+ BaseAddress = MiPteToAddress(StackPte + StackPtes + 1);
+
+ //
+ // Select the right PTE address where we actually start committing pages
+ //
+ PointerPte = StackPte;
+ if (GuiStack) PointerPte += BYTES_TO_PAGES(KERNEL_LARGE_STACK_SIZE -
+ KERNEL_LARGE_STACK_COMMIT);
+
+ //
+ // Setup the template stack PTE
+ //
+ TempPte = HyperTemplatePte;
+ MI_MAKE_LOCAL_PAGE(&TempPte);
+ MI_MAKE_DIRTY_PAGE(&TempPte);
+ TempPte.u.Hard.PageFrameNumber = 0;
+
+ //
+ // Acquire the PFN DB lock
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+
+ //
+ // Loop each stack page
+ //
+ for (i = 0; i < StackPages; i++)
+ {
+ //
+ // Next PTE
+ //
+ PointerPte++;
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+
+ //
+ // Get a page
+ //
+ PageFrameIndex = MmAllocPage(MC_NPPOOL, 0);
+ TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
+
+ //
+ // Write it
+ //
+ *PointerPte = TempPte;
+ }
+
+ //
+ // Release the PFN lock
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+
+ //
+ // Return the stack address
+ //
+ return BaseAddress;
+}
+
+NTSTATUS
+NTAPI
+MmGrowKernelStackEx(IN PVOID StackPointer,
+ IN ULONG GrowSize)
+{
+ PKTHREAD Thread = KeGetCurrentThread();
+ PMMPTE LimitPte, NewLimitPte, LastPte;
+ PFN_NUMBER StackPages;
+ KIRQL OldIrql;
+ MMPTE TempPte;
+ PFN_NUMBER PageFrameIndex;
+
+ //
+ // Make sure the stack did not overflow
+ //
+ ASSERT(((ULONG_PTR)Thread->StackBase - (ULONG_PTR)Thread->StackLimit) <=
+ (KERNEL_LARGE_STACK_SIZE + PAGE_SIZE));
+
+ //
+ // Get the current stack limit
+ //
+ LimitPte = MiAddressToPte(Thread->StackLimit);
+ ASSERT(LimitPte->u.Hard.Valid == 1);
+
+ //
+ // Get the new one and make sure this isn't a retarded request
+ //
+ NewLimitPte = MiAddressToPte((PVOID)((ULONG_PTR)StackPointer - GrowSize));
+ if (NewLimitPte == LimitPte) return STATUS_SUCCESS;
+
+ //
+ // Now make sure you're not going past the reserved space
+ //
+ LastPte = MiAddressToPte((PVOID)((ULONG_PTR)Thread->StackBase -
+ KERNEL_LARGE_STACK_SIZE));
+ if (NewLimitPte < LastPte)
+ {
+ //
+ // Sorry!
+ //
+ DPRINT1("Thread wants too much stack\n");
+ return STATUS_STACK_OVERFLOW;
+ }
+
+ //
+ // Calculate the number of new pages
+ //
+ LimitPte--;
+ StackPages = (LimitPte - NewLimitPte + 1);
+
+ //
+ // Setup the template stack PTE
+ //
+ TempPte = HyperTemplatePte;
+ MI_MAKE_LOCAL_PAGE(&TempPte);
+ MI_MAKE_DIRTY_PAGE(&TempPte);
+ TempPte.u.Hard.PageFrameNumber = 0;
+
+ //
+ // Acquire the PFN DB lock
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+
+ //
+ // Loop each stack page
+ //
+ while (LimitPte >= NewLimitPte)
+ {
+ //
+ // Sanity check
+ //
+ ASSERT(LimitPte->u.Hard.Valid == 0);
+
+ //
+ // Get a page
+ //
+ PageFrameIndex = MmAllocPage(MC_NPPOOL, 0);
+ TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
+
+ //
+ // Write it
+ //
+ *LimitPte-- = TempPte;
+ }
+
+ //
+ // Release the PFN lock
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+
+ //
+ // Set the new limit
+ //
+ Thread->StackLimit = (ULONG_PTR)MiPteToAddress(NewLimitPte);
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+MmGrowKernelStack(IN PVOID StackPointer)
+{
+ //
+ // Call the extended version
+ //
+ return MmGrowKernelStackEx(StackPointer, KERNEL_LARGE_STACK_COMMIT);
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/mm/ARM3/syspte.c b/reactos/ntoskrnl/mm/ARM3/syspte.c
new file mode 100644
index 00000000000..73a11801682
--- /dev/null
+++ b/reactos/ntoskrnl/mm/ARM3/syspte.c
@@ -0,0 +1,410 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/syspte.c
+ * PURPOSE: ARM Memory Manager System PTE Allocator
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#line 15 "ARM³::SYSPTE"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* GLOBALS ********************************************************************/
+
+PMMPTE MmSystemPteBase;
+PMMPTE MmSystemPtesStart[MaximumPtePoolTypes];
+PMMPTE MmSystemPtesEnd[MaximumPtePoolTypes];
+MMPTE MmFirstFreeSystemPte[MaximumPtePoolTypes];
+ULONG MmTotalFreeSystemPtes[MaximumPtePoolTypes];
+ULONG MmTotalSystemPtes;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+PMMPTE
+NTAPI
+MiReserveAlignedSystemPtes(IN ULONG NumberOfPtes,
+ IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType,
+ IN ULONG Alignment)
+{
+ KIRQL OldIrql;
+ PMMPTE PointerPte, NextPte, PreviousPte;
+ ULONG_PTR ClusterSize;
+
+ //
+ // Sanity check
+ //
+ ASSERT(Alignment <= PAGE_SIZE);
+
+ //
+ // Lock the system PTE space
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueueSystemSpaceLock);
+
+ //
+ // Get the first free cluster and make sure we have PTEs available
+ //
+ PointerPte = &MmFirstFreeSystemPte[SystemPtePoolType];
+ if (PointerPte->u.List.NextEntry == ((ULONG)0xFFFFF))
+ {
+ //
+ // Fail
+ //
+ KeReleaseQueuedSpinLock(LockQueueSystemSpaceLock, OldIrql);
+ return NULL;
+ }
+
+ //
+ // Now move to the first free system PTE cluster
+ //
+ PreviousPte = PointerPte;
+ PointerPte = MmSystemPteBase + PointerPte->u.List.NextEntry;
+
+ //
+ // Loop each cluster
+ //
+ while (TRUE)
+ {
+ //
+ // Check if we're done to only one PTE left
+ //
+ if (!PointerPte->u.List.OneEntry)
+ {
+ //
+ // Keep track of the next cluster in case we have to relink
+ //
+ NextPte = PointerPte + 1;
+
+ //
+ // Can this cluster satisfy the request?
+ //
+ ClusterSize = (ULONG_PTR)NextPte->u.List.NextEntry;
+ if (NumberOfPtes < ClusterSize)
+ {
+ //
+ // It can, and it will leave just one PTE left
+ //
+ if ((ClusterSize - NumberOfPtes) == 1)
+ {
+ //
+ // This cluster becomes a single system PTE entry
+ //
+ PointerPte->u.List.OneEntry = 1;
+ }
+ else
+ {
+ //
+ // Otherwise, the next cluster aborbs what's left
+ //
+ NextPte->u.List.NextEntry = ClusterSize - NumberOfPtes;
+ }
+
+ //
+ // Decrement the free count and move to the next starting PTE
+ //
+ MmTotalFreeSystemPtes[SystemPtePoolType] -= NumberOfPtes;
+ KeReleaseQueuedSpinLock(LockQueueSystemSpaceLock, OldIrql);
+ PointerPte += (ClusterSize - NumberOfPtes);
+ break;
+ }
+
+ //
+ // Did we find exactly what you wanted?
+ //
+ if (NumberOfPtes == ClusterSize)
+ {
+ //
+ // Yes, fixup the cluster and decrease free system PTE count
+ //
+ PreviousPte->u.List.NextEntry = PointerPte->u.List.NextEntry;
+ MmTotalFreeSystemPtes[SystemPtePoolType] -= NumberOfPtes;
+ break;
+ }
+ }
+ else if (NumberOfPtes == 1)
+ {
+ //
+ // We have one PTE in this cluster, and it's all you want
+ //
+ PreviousPte->u.List.NextEntry = PointerPte->u.List.NextEntry;
+ MmTotalFreeSystemPtes[SystemPtePoolType]--;
+ break;
+ }
+
+ //
+ // We couldn't find what you wanted -- is this the last cluster?
+ //
+ if (PointerPte->u.List.NextEntry == ((ULONG)0xFFFFF))
+ {
+ //
+ // Fail
+ //
+ KeReleaseQueuedSpinLock(LockQueueSystemSpaceLock, OldIrql);
+ return NULL;
+ }
+
+ //
+ // Go to the next cluster
+ //
+ PreviousPte = PointerPte;
+ PointerPte = MmSystemPteBase + PointerPte->u.List.NextEntry;
+ ASSERT(PointerPte > PreviousPte);
+ }
+
+ //
+ // Flush the TLB and return the first PTE
+ //
+ KeFlushProcessTb();
+ return PointerPte;
+}
+
+PMMPTE
+NTAPI
+MiReserveSystemPtes(IN ULONG NumberOfPtes,
+ IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
+{
+ PMMPTE PointerPte;
+
+ //
+ // Use the extended function
+ //
+ PointerPte = MiReserveAlignedSystemPtes(NumberOfPtes, SystemPtePoolType, 0);
+ ASSERT(PointerPte != NULL);
+ return PointerPte;
+}
+
+VOID
+NTAPI
+MiReleaseSystemPtes(IN PMMPTE StartingPte,
+ IN ULONG NumberOfPtes,
+ IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
+{
+ KIRQL OldIrql;
+ ULONG_PTR ClusterSize, CurrentSize;
+ PMMPTE CurrentPte, NextPte, PointerPte;
+
+ //
+ // Check to make sure the PTE address is within bounds
+ //
+ ASSERT(NumberOfPtes != 0);
+ ASSERT(StartingPte >= MmSystemPtesStart[SystemPtePoolType]);
+ ASSERT(StartingPte <= MmSystemPtesEnd[SystemPtePoolType]);
+
+ //
+ // Zero PTEs
+ //
+ RtlZeroMemory(StartingPte, NumberOfPtes * sizeof(MMPTE));
+ CurrentSize = (ULONG_PTR)(StartingPte - MmSystemPteBase);
+
+ //
+ // Acquire the system PTE lock
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueueSystemSpaceLock);
+
+ //
+ // Increase availability
+ //
+ MmTotalFreeSystemPtes[SystemPtePoolType] += NumberOfPtes;
+
+ //
+ // Get the free cluster and start going through them
+ //
+ CurrentPte = &MmFirstFreeSystemPte[SystemPtePoolType];
+ while (TRUE)
+ {
+ //
+ // Get the first real cluster of PTEs and check if it's ours
+ //
+ PointerPte = MmSystemPteBase + CurrentPte->u.List.NextEntry;
+ if (CurrentSize < CurrentPte->u.List.NextEntry)
+ {
+ //
+ // Sanity check
+ //
+ ASSERT(((StartingPte + NumberOfPtes) <= PointerPte) ||
+ (CurrentPte->u.List.NextEntry == ((ULONG)0xFFFFF)));
+
+ //
+ // Get the next cluster in case it's the one
+ //
+ NextPte = CurrentPte + 1;
+
+ //
+ // Check if this was actually a single-PTE entry
+ //
+ if (CurrentPte->u.List.OneEntry)
+ {
+ //
+ // We only have one page
+ //
+ ClusterSize = 1;
+ }
+ else
+ {
+ //
+ // The next cluster will have the page count
+ //
+ ClusterSize = (ULONG_PTR)NextPte->u.List.NextEntry;
+ }
+
+ //
+ // So check if this cluster actually describes the entire mapping
+ //
+ if ((CurrentPte + ClusterSize) == StartingPte)
+ {
+ //
+ // It does -- collapse the free PTEs into the next cluster
+ //
+ NumberOfPtes += ClusterSize;
+ NextPte->u.List.NextEntry = NumberOfPtes;
+ CurrentPte->u.List.OneEntry = 0;
+
+ //
+ // Make another pass
+ //
+ StartingPte = CurrentPte;
+ }
+ else
+ {
+ //
+ // There's still PTEs left -- make us into a cluster
+ //
+ StartingPte->u.List.NextEntry = CurrentPte->u.List.NextEntry;
+ CurrentPte->u.List.NextEntry = CurrentSize;
+
+ //
+ // Is there just one page left?
+ //
+ if (NumberOfPtes == 1)
+ {
+ //
+ // Then this actually becomes a single PTE entry
+ //
+ StartingPte->u.List.OneEntry = 1;
+ }
+ else
+ {
+ //
+ // Otherwise, create a new cluster for the remaining pages
+ //
+ StartingPte->u.List.OneEntry = 0;
+ NextPte = StartingPte + 1;
+ NextPte->u.List.NextEntry = NumberOfPtes;
+ }
+ }
+
+ //
+ // Now check if we've arrived at yet another cluster
+ //
+ if ((StartingPte + NumberOfPtes) == PointerPte)
+ {
+ //
+ // We'll collapse the next cluster into us
+ //
+ StartingPte->u.List.NextEntry = PointerPte->u.List.NextEntry;
+ StartingPte->u.List.OneEntry = 0;
+ NextPte = StartingPte + 1;
+
+ //
+ // Check if the cluster only had one page
+ //
+ if (PointerPte->u.List.OneEntry)
+ {
+ //
+ // So will we...
+ //
+ ClusterSize = 1;
+ }
+ else
+ {
+ //
+ // Otherwise, grab the page count from the next-next cluster
+ //
+ PointerPte++;
+ ClusterSize = (ULONG_PTR)PointerPte->u.List.NextEntry;
+ }
+
+ //
+ // And create the final combined cluster
+ //
+ NextPte->u.List.NextEntry = NumberOfPtes + ClusterSize;
+ }
+
+ //
+ // We released the PTEs into their cluster (and optimized the list)
+ //
+ KeReleaseQueuedSpinLock(LockQueueSystemSpaceLock, OldIrql);
+ break;
+ }
+
+ //
+ // Try the next cluster of PTEs...
+ //
+ CurrentPte = PointerPte;
+ }
+}
+
+VOID
+NTAPI
+MiInitializeSystemPtes(IN PMMPTE StartingPte,
+ IN ULONG NumberOfPtes,
+ IN MMSYSTEM_PTE_POOL_TYPE PoolType)
+{
+ //
+ // Sanity checks
+ //
+ ASSERT(NumberOfPtes >= 1);
+
+ //
+ // Set the starting and ending PTE addresses for this space
+ //
+ MmSystemPteBase = (PVOID)PTE_BASE;
+ MmSystemPtesStart[PoolType] = StartingPte;
+ MmSystemPtesEnd[PoolType] = StartingPte + NumberOfPtes - 1;
+ DPRINT("System PTE space for %d starting at: %p and ending at: %p\n",
+ PoolType, MmSystemPtesStart[PoolType], MmSystemPtesEnd[PoolType]);
+
+ //
+ // Clear all the PTEs to start with
+ //
+ RtlZeroMemory(StartingPte, NumberOfPtes * sizeof(MMPTE));
+
+ //
+ // Make the first entry free and link it
+ //
+ StartingPte->u.List.NextEntry = ((ULONG)0xFFFFF);
+ MmFirstFreeSystemPte[PoolType].u.Long = 0;
+ MmFirstFreeSystemPte[PoolType].u.List.NextEntry = StartingPte -
+ MmSystemPteBase;
+
+ //
+ // The second entry stores the size of this PTE space
+ //
+ StartingPte++;
+ StartingPte->u.Long = 0;
+ StartingPte->u.List.NextEntry = NumberOfPtes;
+
+ //
+ // We also keep a global for it
+ //
+ MmTotalFreeSystemPtes[PoolType] = NumberOfPtes;
+
+ //
+ // Check if this is the system PTE space
+ //
+ if (PoolType == SystemPteSpace)
+ {
+ //
+ // Remember how many PTEs we have
+ //
+ MmTotalSystemPtes = NumberOfPtes;
+ }
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/mm/arm/stubs.c b/reactos/ntoskrnl/mm/arm/stubs.c
index 950dddd4f33..d7c1a27b1e2 100644
--- a/reactos/ntoskrnl/mm/arm/stubs.c
+++ b/reactos/ntoskrnl/mm/arm/stubs.c
@@ -15,7 +15,8 @@
/* GLOBALS ********************************************************************/
ULONG MmGlobalKernelPageDirectory[1024];
-MMPTE MiArmTemplatePte, MiArmTemplatePde;
+MMPTE MiArmTemplatePte;
+MMPDE_HARDWARE MiArmTemplatePde;
/* PRIVATE FUNCTIONS **********************************************************/
@@ -67,8 +68,10 @@ MiGetPageTableForProcess(IN PEPROCESS Process,
IN BOOLEAN Create)
{
//ULONG PdeOffset;
- PMMPTE PointerPde, PointerPte;
- MMPTE TempPde, TempPte;
+ PMMPTE PointerPte;
+ PMMPDE_HARDWARE PointerPde;
+ MMPDE_HARDWARE TempPde;
+ MMPTE TempPte;
NTSTATUS Status;
PFN_NUMBER Pfn;
@@ -95,7 +98,7 @@ MiGetPageTableForProcess(IN PEPROCESS Process,
// Get the PDE
//
PointerPde = MiGetPdeAddress(Address);
- if (PointerPde->u.Hard.L1.Fault.Type == FaultPte)
+ if (PointerPde->u.Hard.Coarse.Valid)
{
//
// Invalid PDE, is this a kernel address?
@@ -125,13 +128,13 @@ MiGetPageTableForProcess(IN PEPROCESS Process,
//
// Setup the PFN
//
- TempPde.u.Hard.L1.Coarse.BaseAddress = (Pfn << PAGE_SHIFT) >> CPT_SHIFT;
+ TempPde.u.Hard.Coarse.PageFrameNumber = (Pfn << PAGE_SHIFT) >> CPT_SHIFT;
//
// Write the PDE
//
- ASSERT(PointerPde->u.Hard.L1.Fault.Type == FaultPte);
- ASSERT(TempPde.u.Hard.L1.Coarse.Type == CoarsePte);
+ ASSERT(PointerPde->u.Hard.Coarse.Valid == 0);
+ ASSERT(TempPde.u.Hard.Coarse.Valid == 1);
*PointerPde = TempPde;
//
@@ -153,13 +156,13 @@ MiGetPageTableForProcess(IN PEPROCESS Process,
//
// Write the PFN of the PDE
//
- TempPte.u.Hard.L2.Small.BaseAddress = Pfn;
+ TempPte.u.Hard.PageFrameNumber = Pfn;
//
// Write the PTE
//
- ASSERT(PointerPte->u.Hard.L2.Fault.Type == FaultPte);
- ASSERT(TempPte.u.Hard.L2.Small.Type == SmallPte);
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+ ASSERT(TempPte.u.Hard.Valid == 1);
*PointerPte = TempPte;
/////
}
@@ -191,12 +194,12 @@ MiGetPageTableForProcess(IN PEPROCESS Process,
//
// Make the entry valid
//
- TempPte.u.Hard.AsUlong = 0xDEADBEEF;
+ TempPde.u.Hard.AsUlong = 0xDEADBEEF;
//
// Set it
//
- *PointerPde = TempPte;
+ *PointerPde = TempPde;
}
}
@@ -239,7 +242,7 @@ NTAPI
MmDeletePageTable(IN PEPROCESS Process,
IN PVOID Address)
{
- PMMPTE PointerPde;
+ PMMPDE_HARDWARE PointerPde;
//
// Not valid for kernel addresses
@@ -266,37 +269,37 @@ MmDeletePageTable(IN PEPROCESS Process,
//
// On ARM, we use a section mapping for the original low-memory mapping
//
- if ((Address) || (PointerPde->u.Hard.L1.Section.Type != SectionPte))
+ if ((Address) || (PointerPde->u.Hard.Section.Valid == 0))
{
//
// Make sure it's valid
//
- ASSERT(PointerPde->u.Hard.L1.Coarse.Type == CoarsePte);
+ ASSERT(PointerPde->u.Hard.Coarse.Valid == 1);
}
//
// Clear the PDE
//
PointerPde->u.Hard.AsUlong = 0;
- ASSERT(PointerPde->u.Hard.L1.Fault.Type == FaultPte);
+ ASSERT(PointerPde->u.Hard.Coarse.Valid == 0);
//
// Invalidate the TLB entry
//
- MiFlushTlb(PointerPde, MiGetPteAddress(Address));
+ MiFlushTlb((PMMPTE)PointerPde, MiGetPteAddress(Address));
}
BOOLEAN
NTAPI
MmCreateProcessAddressSpace(IN ULONG MinWs,
IN PEPROCESS Process,
- IN PLARGE_INTEGER DirectoryTableBase)
+ IN PULONG DirectoryTableBase)
{
NTSTATUS Status;
ULONG i;
PFN_NUMBER Pfn[2];
- PMMPTE PageDirectory, PointerPde;
- MMPTE TempPde;
+ PMMPDE_HARDWARE PageDirectory, PointerPde;
+ MMPDE_HARDWARE TempPde;
ASSERT(FALSE);
//
@@ -329,27 +332,27 @@ MmCreateProcessAddressSpace(IN ULONG MinWs,
// Setup the PDE for the table base
//
TempPde = MiArmTemplatePde;
- TempPde.u.Hard.L1.Coarse.BaseAddress = (Pfn[0] << PAGE_SHIFT) >> CPT_SHIFT;
+ TempPde.u.Hard.Coarse.PageFrameNumber = (Pfn[0] << PAGE_SHIFT) >> CPT_SHIFT;
PointerPde = &PageDirectory[MiGetPdeOffset(PTE_BASE)];
//
// Write the PDE
//
- ASSERT(PointerPde->u.Hard.L1.Fault.Type == FaultPte);
- ASSERT(TempPde.u.Hard.L1.Coarse.Type == CoarsePte);
+ ASSERT(PointerPde->u.Hard.Coarse.Valid == 0);
+ ASSERT(TempPde.u.Hard.Coarse.Valid == 1);
*PointerPde = TempPde;
//
// Setup the PDE for the hyperspace
//
- TempPde.u.Hard.L1.Coarse.BaseAddress = (Pfn[1] << PAGE_SHIFT) >> CPT_SHIFT;
+ TempPde.u.Hard.Coarse.PageFrameNumber = (Pfn[1] << PAGE_SHIFT) >> CPT_SHIFT;
PointerPde = &PageDirectory[MiGetPdeOffset(HYPER_SPACE)];
//
// Write the PDE
//
- ASSERT(PointerPde->u.Hard.L1.Fault.Type == FaultPte);
- ASSERT(TempPde.u.Hard.L1.Coarse.Type == CoarsePte);
+ ASSERT(PointerPde->u.Hard.Coarse.Valid == 0);
+ ASSERT(TempPde.u.Hard.Coarse.Valid == 1);
*PointerPde = TempPde;
//
@@ -360,7 +363,7 @@ MmCreateProcessAddressSpace(IN ULONG MinWs,
//
// Return the page table base
//
- DirectoryTableBase->QuadPart = Pfn[0] << PAGE_SHIFT;
+ DirectoryTableBase[0] = Pfn[0] << PAGE_SHIFT;
return TRUE;
}
@@ -391,12 +394,13 @@ Mmi386ReleaseMmInfo(IN PEPROCESS Process)
NTSTATUS
NTAPI
MmInitializeHandBuiltProcess(IN PEPROCESS Process,
- IN PLARGE_INTEGER DirectoryTableBase)
+ IN PULONG DirectoryTableBase)
{
//
// Share the directory base with the idle process
//
- *DirectoryTableBase = PsGetCurrentProcess()->Pcb.DirectoryTableBase;
+ DirectoryTableBase[0] = PsGetCurrentProcess()->Pcb.DirectoryTableBase[0];
+ DirectoryTableBase[1] = PsGetCurrentProcess()->Pcb.DirectoryTableBase[1];
//
// Initialize the Addresss Space
@@ -514,13 +518,13 @@ MmCreateVirtualMappingInternal(IN PEPROCESS Process,
//
// Set the PFN
//
- TempPte.u.Hard.L2.Small.BaseAddress = *Pages++;
+ TempPte.u.Hard.PageFrameNumber = *Pages++;
//
// Write the PTE
//
- ASSERT(PointerPte->u.Hard.L2.Fault.Type == FaultPte);
- ASSERT(TempPte.u.Hard.L2.Small.Type == SmallPte);
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+ ASSERT(TempPte.u.Hard.Valid == 1);
*PointerPte = TempPte;
//
@@ -625,7 +629,7 @@ MmRawDeleteVirtualMapping(IN PVOID Address)
// Get the PTE
//
PointerPte = MiGetPageTableForProcess(NULL, Address, FALSE);
- if ((PointerPte) && (PointerPte->u.Hard.L2.Fault.Type != FaultPte))
+ if ((PointerPte) && (PointerPte->u.Hard.Valid))
{
//
// Destroy it
@@ -671,7 +675,7 @@ MmDeleteVirtualMapping(IN PEPROCESS Process,
//
// Unmap the PFN
//
- Pfn = Pte.u.Hard.L2.Small.BaseAddress;
+ Pfn = Pte.u.Hard.PageFrameNumber;
if (Pfn) MmMarkPageUnmapped(Pfn);
//
@@ -687,93 +691,6 @@ MmDeleteVirtualMapping(IN PEPROCESS Process,
if (Page) *Page = Pfn;
}
-PVOID
-NTAPI
-MmCreateHyperspaceMapping(IN PFN_TYPE Page)
-{
- PMMPTE PointerPte, FirstPte, LastPte;
- MMPTE TempPte;
- PVOID Address;
-
- //
- // Loop hyperspace PTEs (1MB)
- //
- FirstPte = PointerPte = MiGetPteAddress((PVOID)HYPER_SPACE);
- LastPte = PointerPte + 256;
- while (PointerPte <= LastPte)
- {
- //
- // Find a free slot
- //
- if (PointerPte->u.Hard.L2.Fault.Type == FaultPte)
- {
- //
- // Use this entry
- //
- break;
- }
-
- //
- // Try the next one
- //
- PointerPte++;
- }
-
- //
- // Check if we didn't find anything
- //
- if (PointerPte > LastPte) return NULL;
-
- //
- // Create the mapping
- //
- TempPte = MiArmTemplatePte;
- TempPte.u.Hard.L2.Small.BaseAddress = Page;
- ASSERT(PointerPte->u.Hard.L2.Fault.Type == FaultPte);
- ASSERT(TempPte.u.Hard.L2.Small.Type == SmallPte);
- *PointerPte = TempPte;
-
- //
- // Return the address
- //
- Address = (PVOID)(HYPER_SPACE + ((PointerPte - FirstPte) * PAGE_SIZE));
- KeArmInvalidateTlbEntry(Address);
- DPRINT("[HMAP]: %p %lx\n", Address, Page);
- return Address;
-}
-
-PFN_TYPE
-NTAPI
-MmDeleteHyperspaceMapping(IN PVOID Address)
-{
- PFN_TYPE Pfn;
- PMMPTE PointerPte;
- DPRINT("[HUNMAP]: %p\n", Address);
-
- //
- // Get the PTE
- //
- PointerPte = MiGetPteAddress(Address);
- ASSERT(PointerPte->u.Hard.L2.Small.Type == SmallPte);
-
- //
- // Save the PFN
- //
- Pfn = PointerPte->u.Hard.L2.Small.BaseAddress;
-
- //
- // Destroy the PTE
- //
- PointerPte->u.Hard.AsUlong = 0;
- ASSERT(PointerPte->u.Hard.L2.Fault.Type == FaultPte);
-
- //
- // Flush the TLB entry and return the PFN
- //
- KeArmInvalidateTlbEntry(Address);
- return Pfn;
-}
-
VOID
NTAPI
MmDeletePageFileMapping(IN PEPROCESS Process,
@@ -812,12 +729,12 @@ MmGetPfnForProcess(IN PEPROCESS Process,
// Get the PTE
//
Pte = MiGetPageEntryForProcess(Process, Address);
- if (Pte.u.Hard.L2.Fault.Type == FaultPte) return 0;
+ if (Pte.u.Hard.Valid == 0) return 0;
//
// Return PFN
//
- return Pte.u.Hard.L2.Small.BaseAddress;
+ return Pte.u.Hard.PageFrameNumber;
}
BOOLEAN
@@ -865,7 +782,7 @@ MmIsPagePresent(IN PEPROCESS Process,
//
// Fault PTEs are 0, which is FALSE (non-present)
//
- return MiGetPageEntryForProcess(Process, Address).u.Hard.L2.Fault.Type;
+ return MiGetPageEntryForProcess(Process, Address).u.Hard.Valid;
}
BOOLEAN
@@ -881,9 +798,9 @@ MmIsPageSwapEntry(IN PEPROCESS Process,
Pte = MiGetPageEntryForProcess(Process, Address);
//
- // Make sure it's valid, but faulting
+ // Make sure it exists, but is faulting
//
- return (Pte.u.Hard.L2.Fault.Type == FaultPte) && (Pte.u.Hard.AsUlong);
+ return (Pte.u.Hard.Valid == 0) && (Pte.u.Hard.AsUlong);
}
ULONG
@@ -1020,10 +937,10 @@ MmGetPhysicalAddress(IN PVOID Address)
//
// ARM Hack while we still use a section PTE
//
- PMMPTE PointerPte;
- PointerPte = MiGetPdeAddress(PCR);
- ASSERT(PointerPte->u.Hard.L1.Section.Type == SectionPte);
- PhysicalAddress.QuadPart = PointerPte->u.Hard.L1.Section.BaseAddress;
+ PMMPDE_HARDWARE PointerPde;
+ PointerPde = MiGetPdeAddress(PCR);
+ ASSERT(PointerPde->u.Hard.Section.Valid == 1);
+ PhysicalAddress.QuadPart = PointerPde->u.Hard.Section.PageFrameNumber;
PhysicalAddress.QuadPart <<= CPT_SHIFT;
PhysicalAddress.LowPart += BYTE_OFFSET(Address);
return PhysicalAddress;
@@ -1033,13 +950,12 @@ MmGetPhysicalAddress(IN PVOID Address)
// Get the PTE
//
Pte = MiGetPageEntryForProcess(NULL, Address);
- if ((Pte.u.Hard.AsUlong) && (Pte.u.Hard.L2.Fault.Type != FaultPte))
+ if (Pte.u.Hard.Valid)
{
//
// Return the information
//
- ASSERT(Pte.u.Hard.L2.Small.Type == SmallPte);
- PhysicalAddress.QuadPart = Pte.u.Hard.L2.Small.BaseAddress;
+ PhysicalAddress.QuadPart = Pte.u.Hard.PageFrameNumber;
PhysicalAddress.QuadPart <<= PAGE_SHIFT;
PhysicalAddress.LowPart += BYTE_OFFSET(Address);
}
diff --git a/reactos/ntoskrnl/mm/balance.c b/reactos/ntoskrnl/mm/balance.c
index 9d05b34a2b2..8a7209b73e5 100644
--- a/reactos/ntoskrnl/mm/balance.c
+++ b/reactos/ntoskrnl/mm/balance.c
@@ -85,6 +85,8 @@ MmInitializeBalancer(ULONG NrAvailablePages, ULONG NrSystemPages)
MiMemoryConsumers[MC_PPOOL].PagesTarget = NrAvailablePages / 2;
MiMemoryConsumers[MC_NPPOOL].PagesTarget = 0xFFFFFFFF;
MiMemoryConsumers[MC_NPPOOL].PagesUsed = NrSystemPages;
+ MiMemoryConsumers[MC_SYSTEM].PagesTarget = 0xFFFFFFFF;
+ MiMemoryConsumers[MC_SYSTEM].PagesUsed = 0;
}
VOID
@@ -161,6 +163,38 @@ MiTrimMemoryConsumer(ULONG Consumer)
}
}
+NTSTATUS
+MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages)
+{
+ PFN_TYPE CurrentPage;
+ PFN_TYPE NextPage;
+ NTSTATUS Status;
+
+ (*NrFreedPages) = 0;
+
+ CurrentPage = MmGetLRUFirstUserPage();
+ while (CurrentPage != 0 && Target > 0)
+ {
+ NextPage = MmGetLRUNextUserPage(CurrentPage);
+
+ Status = MmPageOutPhysicalAddress(CurrentPage);
+ if (NT_SUCCESS(Status))
+ {
+ DPRINT("Succeeded\n");
+ Target--;
+ (*NrFreedPages)++;
+ }
+ else if (Status == STATUS_PAGEFILE_QUOTA)
+ {
+ MmRemoveLRUUserPage(CurrentPage);
+ MmInsertLRULastUserPage(CurrentPage);
+ }
+
+ CurrentPage = NextPage;
+ }
+ return(STATUS_SUCCESS);
+}
+
VOID
NTAPI
MmRebalanceMemoryConsumers(VOID)
@@ -221,7 +255,7 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait,
/*
* Allocate always memory for the non paged pool and for the pager thread.
*/
- if (Consumer == MC_NPPOOL || MiIsBalancerThread())
+ if ((Consumer == MC_NPPOOL) || (Consumer == MC_SYSTEM) || MiIsBalancerThread())
{
Page = MmAllocPage(Consumer, 0);
if (Page == 0)
@@ -277,7 +311,7 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait,
KeBugCheck(NO_PAGES_AVAILABLE);
}
/* Update the Consumer */
- MiGetPfnEntry(Page)->Flags.Consumer = Consumer;
+ MiGetPfnEntry(Page)->u3.e1.PageLocation = Consumer;
if(Consumer == MC_USER) MmInsertLRULastUserPage(Page);
*AllocatedPage = Page;
(void)InterlockedDecrementUL(&MiPagesRequired);
diff --git a/reactos/ntoskrnl/mm/cont.c b/reactos/ntoskrnl/mm/cont.c
deleted file mode 100644
index 4df2c8d5fc1..00000000000
--- a/reactos/ntoskrnl/mm/cont.c
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: ntoskrnl/mm/cont.c
- * PURPOSE: Manages continuous memory
- *
- * PROGRAMMERS: David Welch (welch@cwcom.net)
- */
-
-/* INCLUDES *****************************************************************/
-
-#include
-#define NDEBUG
-#include
-
-/* FUNCTIONS *****************************************************************/
-
-static VOID
-MmFreeContinuousPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address,
- PFN_TYPE Page, SWAPENTRY SwapEntry,
- BOOLEAN Dirty)
-{
- ASSERT(SwapEntry == 0);
- if (Page != 0)
- {
- MmReleasePageMemoryConsumer(MC_NPPOOL, Page);
- }
-}
-
-/**********************************************************************
- * NAME EXPORTED
- * MmAllocateContiguousMemorySpecifyCache@32
- *
- * DESCRIPTION
- * Allocates a range of physically contiguous memory
- * with a cache parameter.
- *
- * ARGUMENTS
- * NumberOfBytes
- * Size of the memory block to allocate;
- *
- * LowestAcceptableAddress
- * Lowest address valid for the caller.
- *
- * HighestAcceptableAddress
- * Highest address valid for the caller.
- *
- * BoundaryAddressMultiple
- * Address multiple not to be crossed by allocated buffer (optional).
- *
- * CacheType
- * Type of caching to use.
- *
- * RETURN VALUE
- * The virtual address of the memory block on success;
- * NULL on error.
- *
- * REVISIONS
- *
- * @implemented
- */
-PVOID NTAPI
-MmAllocateContiguousMemorySpecifyCache(IN SIZE_T NumberOfBytes,
- IN PHYSICAL_ADDRESS LowestAcceptableAddress OPTIONAL,
- IN PHYSICAL_ADDRESS HighestAcceptableAddress,
- IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
- IN MEMORY_CACHING_TYPE CacheType OPTIONAL)
-{
- PMEMORY_AREA MArea;
- NTSTATUS Status;
- PVOID BaseAddress = NULL;
- PFN_TYPE PBase;
- ULONG Protect;
- ULONG i;
-
- Protect = PAGE_EXECUTE_READWRITE | PAGE_SYSTEM;
- if (CacheType == MmNonCached || CacheType == MmWriteCombined)
- {
- Protect |= PAGE_NOCACHE;
- }
- if (CacheType == MmWriteCombined)
- {
- Protect |= PAGE_WRITECOMBINE;
- }
-
- MmLockAddressSpace(MmGetKernelAddressSpace());
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_CONTINUOUS_MEMORY,
- &BaseAddress,
- NumberOfBytes,
- PAGE_READWRITE,
- &MArea,
- FALSE,
- 0,
- RtlConvertLongToLargeInteger(0));
- MmUnlockAddressSpace(MmGetKernelAddressSpace());
-
- if (!NT_SUCCESS(Status))
- {
- return(NULL);
- }
- DPRINT( "Base = %x\n", BaseAddress );
- PBase = MmGetContinuousPages(NumberOfBytes,
- LowestAcceptableAddress,
- HighestAcceptableAddress,
- BoundaryAddressMultiple);
- if (PBase == 0)
- {
- MmLockAddressSpace(MmGetKernelAddressSpace());
- MmFreeMemoryArea(MmGetKernelAddressSpace(),
- MArea,
- NULL,
- NULL);
- MmUnlockAddressSpace(MmGetKernelAddressSpace());
- return(NULL);
- }
- for (i = 0; i < (PAGE_ROUND_UP(NumberOfBytes) / PAGE_SIZE); i++, PBase++)
- {
- MmCreateVirtualMapping(NULL,
- (char*)BaseAddress + (i * PAGE_SIZE),
- Protect,
- &PBase,
- 1);
- }
- return(BaseAddress);
-}
-
-/**********************************************************************
- * NAME EXPORTED
- * MmAllocateContiguousMemory@12
- *
- * DESCRIPTION
- * Allocates a range of physically contiguous cache aligned
- * memory from the non-paged pool.
- *
- * ARGUMENTS
- * NumberOfBytes
- * Size of the memory block to allocate;
- *
- * HighestAcceptableAddress
- * Highest address valid for the caller.
- *
- * RETURN VALUE
- * The virtual address of the memory block on success;
- * NULL on error.
- *
- * NOTE
- * Description taken from include/ddk/mmfuncs.h.
- * Code taken from ntoskrnl/mm/special.c.
- *
- * REVISIONS
- *
- * @implemented
- */
-PVOID NTAPI
-MmAllocateContiguousMemory (IN ULONG NumberOfBytes,
- IN PHYSICAL_ADDRESS HighestAcceptableAddress)
-{
- return MmAllocateContiguousMemorySpecifyCache(NumberOfBytes,
- RtlConvertLongToLargeInteger(0),
- HighestAcceptableAddress,
- RtlConvertLongToLargeInteger(0),
- MmCached);
-}
-
-
-/**********************************************************************
- * NAME EXPORTED
- * MmFreeContiguousMemory@4
- *
- * DESCRIPTION
- * Releases a range of physically contiguous memory allocated
- * with MmAllocateContiguousMemory.
- *
- * ARGUMENTS
- * BaseAddress
- * Virtual address of the memory to be freed.
- *
- * RETURN VALUE
- * None.
- *
- * NOTE
- * Description taken from include/ddk/mmfuncs.h.
- * Code taken from ntoskrnl/mm/special.c.
- *
- * REVISIONS
- *
- * @implemented
- */
-VOID NTAPI
-MmFreeContiguousMemory(IN PVOID BaseAddress)
-{
- MmLockAddressSpace(MmGetKernelAddressSpace());
- MmFreeMemoryAreaByPtr(MmGetKernelAddressSpace(),
- BaseAddress,
- MmFreeContinuousPage,
- NULL);
- MmUnlockAddressSpace(MmGetKernelAddressSpace());
-}
-
-/**********************************************************************
- * NAME EXPORTED
- * MmFreeContiguousMemorySpecifyCache@12
- *
- * DESCRIPTION
- * Releases a range of physically contiguous memory allocated
- * with MmAllocateContiguousMemorySpecifyCache.
- *
- * ARGUMENTS
- * BaseAddress
- * Virtual address of the memory to be freed.
- *
- * NumberOfBytes
- * Size of the memory block to free.
- *
- * CacheType
- * Type of caching used.
- *
- * RETURN VALUE
- * None.
- *
- * REVISIONS
- *
- * @implemented
- */
-VOID NTAPI
-MmFreeContiguousMemorySpecifyCache(IN PVOID BaseAddress,
- IN SIZE_T NumberOfBytes,
- IN MEMORY_CACHING_TYPE CacheType)
-{
- MmLockAddressSpace(MmGetKernelAddressSpace());
- MmFreeMemoryAreaByPtr(MmGetKernelAddressSpace(),
- BaseAddress,
- MmFreeContinuousPage,
- NULL);
- MmUnlockAddressSpace(MmGetKernelAddressSpace());
-}
-
-
-/* EOF */
diff --git a/reactos/ntoskrnl/mm/drvlck.c b/reactos/ntoskrnl/mm/drvlck.c
deleted file mode 100644
index c8b64683c12..00000000000
--- a/reactos/ntoskrnl/mm/drvlck.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: ntoskrnl/mm/drvlck.c
- * PURPOSE: Managing driver managing
- *
- * PROGRAMMERS: David Welch (welch@mcmail.com)
- */
-
-/* INCLUDES *****************************************************************/
-
-#include
-#include
-
-/* FUNCTIONS *****************************************************************/
-
-#undef MmLockPagableDataSection
-
-#if 0
-VOID
-MmUnlockPagableImageSection(IN PVOID ImageSectionHandle)
-/*
- * FUNCTION: Releases a section of driver code or driver data, previously
- * locked into system space with MmLockPagableCodeSection,
- * MmLockPagableDataSection or MmLockPagableSectionByHandle
- * ARGUMENTS:
- * ImageSectionHandle = Handle returned by MmLockPagableCodeSection or
- * MmLockPagableDataSection
- */
-{
- // MmUnlockMemoryArea((MEMORY_AREA *)ImageSectionHandle);
- UNIMPLEMENTED;
-}
-#endif
-
-
-/*
- * @unimplemented
- */
-VOID NTAPI
-MmLockPagableSectionByHandle(IN PVOID ImageSectionHandle)
-{
- UNIMPLEMENTED;
-}
-
-
-#if 0
-PVOID
-MmLockPagableCodeSection(IN PVOID AddressWithinSection)
-{
- PVOID Handle;
- Handle = MmLocateMemoryAreaByAddress(NULL,AddressWithinSection);
- MmLockPagableSectionByHandle(Handle);
- return(Handle);
-}
-#endif
-
-
-/*
- * @implemented
- */
-PVOID NTAPI
-MmLockPagableDataSection(IN PVOID AddressWithinSection)
-{
- PVOID Handle;
- Handle = MmLocateMemoryAreaByAddress(MmGetKernelAddressSpace(),
- AddressWithinSection);
- MmLockPagableSectionByHandle(Handle);
- return(Handle);
-}
-
-
-/*
- * @unimplemented
- */
-VOID NTAPI
-MmUnlockPagableImageSection(IN PVOID ImageSectionHandle)
-{
- UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-PVOID NTAPI
-MmPageEntireDriver(IN PVOID AddressWithinSection)
-{
- UNIMPLEMENTED;
- return NULL;
-}
-
-
-/*
- * @unimplemented
- */
-VOID NTAPI
-MmResetDriverPaging(IN PVOID AddressWithinSection)
-{
- UNIMPLEMENTED;
-}
-
-/* EOF */
diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c
index bbb517cdaf4..5febd3a6f0a 100644
--- a/reactos/ntoskrnl/mm/freelist.c
+++ b/reactos/ntoskrnl/mm/freelist.c
@@ -18,17 +18,38 @@
#pragma alloc_text(INIT, MmInitializePageList)
#endif
+#define MODULE_INVOLVED_IN_ARM3
+#include "ARM3/miarm.h"
/* TYPES *******************************************************************/
#define MM_PHYSICAL_PAGE_FREE (0x1)
#define MM_PHYSICAL_PAGE_USED (0x2)
-#define MM_PHYSICAL_PAGE_BIOS (0x3)
/* GLOBALS ****************************************************************/
-PPHYSICAL_PAGE MmPageArray;
-ULONG MmPageArraySize;
+//
+//
+// ReactOS to NT Physical Page Descriptor Entry Legacy Mapping Definitions
+//
+// REACTOS NT
+//
+#define Consumer PageLocation
+#define Type CacheAttribute
+#define Zero PrototypePte
+#define LockCount u3.e1.PageColor
+#define RmapListHead AweReferenceCount
+#define SavedSwapEntry u4.EntireFrame
+#define Flags u3.e1
+#define ReferenceCount u3.ReferenceCount
+#define RemoveEntryList(x) RemoveEntryList((PLIST_ENTRY)x)
+#define InsertTailList(x, y) InsertTailList(x, (PLIST_ENTRY)y)
+#define ListEntry u1
+#define PHYSICAL_PAGE MMPFN
+#define PPHYSICAL_PAGE PMMPFN
+
+PPHYSICAL_PAGE MmPfnDatabase;
+ULONG MmHighestPhysicalPage;
/* List of pages allocated to the MC_USER Consumer */
static LIST_ENTRY UserPageListHead;
@@ -63,7 +84,7 @@ MmGetLRUFirstUserPage(VOID)
PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry);
ASSERT_PFN(PageDescriptor);
KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- return PageDescriptor - MmPageArray;
+ return PageDescriptor - MmPfnDatabase;
}
VOID
@@ -75,6 +96,7 @@ MmInsertLRULastUserPage(PFN_TYPE Pfn)
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
Page = MiGetPfnEntry(Pfn);
+ ASSERT(Page);
ASSERT(Page->Flags.Type == MM_PHYSICAL_PAGE_USED);
ASSERT(Page->Flags.Consumer == MC_USER);
InsertTailList(&UserPageListHead, &Page->ListEntry);
@@ -92,9 +114,10 @@ MmGetLRUNextUserPage(PFN_TYPE PreviousPfn)
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
Page = MiGetPfnEntry(PreviousPfn);
+ ASSERT(Page);
ASSERT(Page->Flags.Type == MM_PHYSICAL_PAGE_USED);
ASSERT(Page->Flags.Consumer == MC_USER);
- NextListEntry = Page->ListEntry.Flink;
+ NextListEntry = (PLIST_ENTRY)Page->ListEntry.Flink;
if (NextListEntry == &UserPageListHead)
{
KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
@@ -102,7 +125,7 @@ MmGetLRUNextUserPage(PFN_TYPE PreviousPfn)
}
PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry);
KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- return PageDescriptor - MmPageArray;
+ return PageDescriptor - MmPfnDatabase;
}
VOID
@@ -112,121 +135,560 @@ MmRemoveLRUUserPage(PFN_TYPE Page)
RemoveEntryList(&MiGetPfnEntry(Page)->ListEntry);
}
-PFN_TYPE
+PFN_NUMBER
NTAPI
-MmGetContinuousPages(ULONG NumberOfBytes,
- PHYSICAL_ADDRESS LowestAcceptableAddress,
- PHYSICAL_ADDRESS HighestAcceptableAddress,
- PHYSICAL_ADDRESS BoundaryAddressMultiple)
+MiFindContiguousPages(IN PFN_NUMBER LowestPfn,
+ IN PFN_NUMBER HighestPfn,
+ IN PFN_NUMBER BoundaryPfn,
+ IN PFN_NUMBER SizeInPages,
+ IN MEMORY_CACHING_TYPE CacheType)
{
- ULONG NrPages;
- ULONG i, j;
- ULONG start;
- ULONG last;
- ULONG length;
- ULONG boundary;
- KIRQL oldIrql;
+ PFN_NUMBER Page, PageCount, LastPage, Length, BoundaryMask;
+ ULONG i = 0;
+ PMMPFN Pfn1, EndPfn;
+ KIRQL OldIrql;
+ PAGED_CODE ();
+ ASSERT(SizeInPages != 0);
+
+ //
+ // Convert the boundary PFN into an alignment mask
+ //
+ BoundaryMask = ~(BoundaryPfn - 1);
+
+ //
+ // Loop all the physical memory blocks
+ //
+ do
+ {
+ //
+ // Capture the base page and length of this memory block
+ //
+ Page = MmPhysicalMemoryBlock->Run[i].BasePage;
+ PageCount = MmPhysicalMemoryBlock->Run[i].PageCount;
+
+ //
+ // Check how far this memory block will go
+ //
+ LastPage = Page + PageCount;
+
+ //
+ // Trim it down to only the PFNs we're actually interested in
+ //
+ if ((LastPage - 1) > HighestPfn) LastPage = HighestPfn + 1;
+ if (Page < LowestPfn) Page = LowestPfn;
+
+ //
+ // Skip this run if it's empty or fails to contain all the pages we need
+ //
+ if (!(PageCount) || ((Page + SizeInPages) > LastPage)) continue;
+
+ //
+ // Now scan all the relevant PFNs in this run
+ //
+ Length = 0;
+ for (Pfn1 = MiGetPfnEntry(Page); Page < LastPage; Page++, Pfn1++)
+ {
+ //
+ // If this PFN is in use, ignore it
+ //
+ if (Pfn1->Flags.Type != MM_PHYSICAL_PAGE_FREE) continue;
+
+ //
+ // If we haven't chosen a start PFN yet and the caller specified an
+ // alignment, make sure the page matches the alignment restriction
+ //
+ if ((!(Length) && (BoundaryPfn)) &&
+ (((Page ^ (Page + SizeInPages - 1)) & BoundaryMask)))
+ {
+ //
+ // It does not, so bail out
+ //
+ continue;
+ }
+
+ //
+ // Increase the number of valid pages, and check if we have enough
+ //
+ if (++Length == SizeInPages)
+ {
+ //
+ // It appears we've amassed enough legitimate pages, rollback
+ //
+ Pfn1 -= (Length - 1);
+ Page -= (Length - 1);
+
+ //
+ // Acquire the PFN lock
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+ do
+ {
+ //
+ // Things might've changed for us. Is the page still free?
+ //
+ if (Pfn1->Flags.Type != MM_PHYSICAL_PAGE_FREE) break;
+
+ //
+ // So far so good. Is this the last confirmed valid page?
+ //
+ if (!--Length)
+ {
+ //
+ // Sanity check that we didn't go out of bounds
+ //
+ ASSERT(i != MmPhysicalMemoryBlock->NumberOfRuns);
+
+ //
+ // Loop until all PFN entries have been processed
+ //
+ EndPfn = Pfn1 - SizeInPages + 1;
+ do
+ {
+ //
+ // If this was an unzeroed page, there are now less
+ //
+ if (Pfn1->Flags.Zero == 0) UnzeroedPageCount--;
+
+ //
+ // One less free page, one more system page
+ //
+ MmStats.NrFreePages--;
+ MmStats.NrSystemPages++;
+
+ //
+ // This PFN is now a used page, set it up
+ //
+ RemoveEntryList(&Pfn1->ListEntry);
+ Pfn1->Flags.Type = MM_PHYSICAL_PAGE_USED;
+ Pfn1->Flags.Consumer = MC_NPPOOL;
+ Pfn1->ReferenceCount = 1;
+ Pfn1->LockCount = 0;
+ Pfn1->SavedSwapEntry = 0;
+
+ //
+ // Check if it was already zeroed
+ //
+ if (Pfn1->Flags.Zero == 0)
+ {
+ //
+ // It wasn't, so zero it
+ //
+ MiZeroPage(MiGetPfnEntryIndex(Pfn1));
+ }
- NrPages = PAGE_ROUND_UP(NumberOfBytes) / PAGE_SIZE;
-
- oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-
- last = min(HighestAcceptableAddress.LowPart / PAGE_SIZE, MmPageArraySize - 1);
- boundary = BoundaryAddressMultiple.LowPart / PAGE_SIZE;
-
- for (j = 0; j < 2; j++)
- {
- start = -1;
- length = 0;
- /* First try to allocate the pages above the 16MB area. This may fail
- * because there are not enough continuous pages or we cannot allocate
- * pages above the 16MB area because the caller has specify an upper limit.
- * The second try uses the specified lower limit.
- */
- for (i = j == 0 ? 0x100000 / PAGE_SIZE : LowestAcceptableAddress.LowPart / PAGE_SIZE; i <= last; )
- {
- if (MiGetPfnEntry(i)->Flags.Type == MM_PHYSICAL_PAGE_FREE)
- {
- if (start == (ULONG)-1)
- {
- start = i;
- length = 1;
+ //
+ // Check if this is the last PFN, otherwise go on
+ //
+ if (Pfn1 == EndPfn) break;
+ Pfn1--;
+ } while (TRUE);
+
+ //
+ // Mark the first and last PFN so we can find them later
+ //
+ Pfn1->Flags.StartOfAllocation = 1;
+ (Pfn1 + SizeInPages - 1)->Flags.EndOfAllocation = 1;
+
+ //
+ // Now it's safe to let go of the PFN lock
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+
+ //
+ // Quick sanity check that the last PFN is consistent
+ //
+ EndPfn = Pfn1 + SizeInPages;
+ ASSERT(EndPfn == MiGetPfnEntry(Page + 1));
+
+ //
+ // Compute the first page, and make sure it's consistent
+ //
+ Page -= SizeInPages - 1;
+ ASSERT(Pfn1 == MiGetPfnEntry(Page));
+ ASSERT(Page != 0);
+ return Page;
+ }
+
+ //
+ // Keep going. The purpose of this loop is to reconfirm that
+ // after acquiring the PFN lock these pages are still usable
+ //
+ Pfn1++;
+ Page++;
+ } while (TRUE);
+
+ //
+ // If we got here, something changed while we hadn't acquired
+ // the PFN lock yet, so we'll have to restart
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+ Length = 0;
}
- else
- {
- length++;
- if (boundary)
- {
- if (start / boundary != i / boundary)
- {
- start = i;
- length = 1;
- }
- }
- }
- if (length == NrPages)
- {
- break;
- }
- }
- else
- {
- start = (ULONG)-1;
- }
- i++;
- }
-
- if (start != (ULONG)-1 && length == NrPages)
- {
- for (i = start; i < (start + length); i++)
- {
- PPHYSICAL_PAGE Page;
- Page = MiGetPfnEntry(i);
- RemoveEntryList(&Page->ListEntry);
- if (MmPageArray[i].Flags.Zero == 0)
- {
- UnzeroedPageCount--;
- }
- MmStats.NrFreePages--;
- MmStats.NrSystemPages++;
- Page->Flags.Type = MM_PHYSICAL_PAGE_USED;
- Page->Flags.Consumer = MC_NPPOOL;
- Page->ReferenceCount = 1;
- Page->LockCount = 0;
- Page->MapCount = 0;
- Page->SavedSwapEntry = 0;
- }
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- for (i = start; i < (start + length); i++)
- {
- if (MiGetPfnEntry(i)->Flags.Zero == 0)
- {
- MiZeroPage(i);
- }
- else
- {
- MiGetPfnEntry(i)->Flags.Zero = 0;
- }
- }
- return start;
- }
- }
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- return 0;
+ }
+ } while (++i != MmPhysicalMemoryBlock->NumberOfRuns);
+
+ //
+ // And if we get here, it means no suitable physical memory runs were found
+ //
+ return 0;
}
-PFN_TYPE
+PMDL
NTAPI
-MmAllocEarlyPage(VOID)
+MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress,
+ IN PHYSICAL_ADDRESS HighAddress,
+ IN PHYSICAL_ADDRESS SkipBytes,
+ IN SIZE_T TotalBytes,
+ IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
+ IN ULONG MdlFlags)
{
- PFN_TYPE Pfn;
+ PMDL Mdl;
+ PFN_NUMBER PageCount, LowPage, HighPage, SkipPages, PagesFound = 0, Page;
+ PPFN_NUMBER MdlPage, LastMdlPage;
+ KIRQL OldIrql;
+ PLIST_ENTRY ListEntry;
+ PPHYSICAL_PAGE Pfn1;
+ INT LookForZeroedPages;
+ ASSERT (KeGetCurrentIrql() <= APC_LEVEL);
+
+ //
+ // Convert the low address into a PFN
+ //
+ LowPage = (PFN_NUMBER)(LowAddress.QuadPart >> PAGE_SHIFT);
+
+ //
+ // Convert, and normalize, the high address into a PFN
+ //
+ HighPage = (PFN_NUMBER)(HighAddress.QuadPart >> PAGE_SHIFT);
+ if (HighPage > MmHighestPhysicalPage) HighPage = MmHighestPhysicalPage;
+
+ //
+ // Validate skipbytes and convert them into pages
+ //
+ if (BYTE_OFFSET(SkipBytes.LowPart)) return NULL;
+ SkipPages = (PFN_NUMBER)(SkipBytes.QuadPart >> PAGE_SHIFT);
+
+ //
+ // Now compute the number of pages the MDL will cover
+ //
+ PageCount = (PFN_NUMBER)ADDRESS_AND_SIZE_TO_SPAN_PAGES(0, TotalBytes);
+ do
+ {
+ //
+ // Try creating an MDL for these many pages
+ //
+ Mdl = MmCreateMdl(NULL, NULL, PageCount << PAGE_SHIFT);
+ if (Mdl) break;
+
+ //
+ // This function is not required to return the amount of pages requested
+ // In fact, it can return as little as 1 page, and callers are supposed
+ // to deal with this scenario. So re-attempt the allocation with less
+ // pages than before, and see if it worked this time.
+ //
+ PageCount -= (PageCount >> 4);
+ } while (PageCount);
+
+ //
+ // Wow, not even a single page was around!
+ //
+ if (!Mdl) return NULL;
+
+ //
+ // This is where the page array starts....
+ //
+ MdlPage = (PPFN_NUMBER)(Mdl + 1);
+
+ //
+ // Lock the PFN database
+ //
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+
+ //
+ // Are we looking for any pages, without discriminating?
+ //
+ if ((LowPage == 0) && (HighPage == MmHighestPhysicalPage))
+ {
+ //
+ // Well then, let's go shopping
+ //
+ while (PagesFound < PageCount)
+ {
+ //
+ // Do we have zeroed pages?
+ //
+ if (!IsListEmpty(&FreeZeroedPageListHead))
+ {
+ //
+ // Grab a zero page
+ //
+ ListEntry = RemoveTailList(&FreeZeroedPageListHead);
+ }
+ else if (!IsListEmpty(&FreeUnzeroedPageListHead))
+ {
+ //
+ // Nope, grab an unzeroed page
+ //
+ ListEntry = RemoveTailList(&FreeUnzeroedPageListHead);
+ UnzeroedPageCount--;
+ }
+ else
+ {
+ //
+ // This is not good... hopefully we have at least SOME pages
+ //
+ ASSERT(PagesFound);
+ break;
+ }
+
+ //
+ // Get the PFN entry for this page
+ //
+ Pfn1 = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry);
+
+ //
+ // Make sure it's really free
+ //
+ ASSERT(Pfn1->Flags.Type == MM_PHYSICAL_PAGE_FREE);
+ ASSERT(Pfn1->ReferenceCount == 0);
+
+ //
+ // Allocate it and mark it
+ //
+ Pfn1->Flags.Type = MM_PHYSICAL_PAGE_USED;
+ Pfn1->Flags.Consumer = MC_NPPOOL;
+ Pfn1->Flags.StartOfAllocation = 1;
+ Pfn1->Flags.EndOfAllocation = 1;
+ Pfn1->ReferenceCount = 1;
+ Pfn1->LockCount = 0;
+ Pfn1->SavedSwapEntry = 0;
+
+ //
+ // Decrease available pages
+ //
+ MmStats.NrSystemPages++;
+ MmStats.NrFreePages--;
+
+ //
+ // Save it into the MDL
+ //
+ *MdlPage++ = MiGetPfnEntryIndex(Pfn1);
+ PagesFound++;
+ }
+ }
+ else
+ {
+ //
+ // You want specific range of pages. We'll do this in two runs
+ //
+ for (LookForZeroedPages = 1; LookForZeroedPages >= 0; LookForZeroedPages--)
+ {
+ //
+ // Scan the range you specified
+ //
+ for (Page = LowPage; Page < HighPage; Page++)
+ {
+ //
+ // Get the PFN entry for this page
+ //
+ Pfn1 = MiGetPfnEntry(Page);
+ ASSERT(Pfn1);
+
+ //
+ // Make sure it's free and if this is our first pass, zeroed
+ //
+ if (Pfn1->Flags.Type != MM_PHYSICAL_PAGE_FREE) continue;
+ if (Pfn1->Flags.Zero != LookForZeroedPages) continue;
+
+ //
+ // Sanity checks
+ //
+ ASSERT(Pfn1->ReferenceCount == 0);
+
+ //
+ // Now setup the page and mark it
+ //
+ Pfn1->Flags.Type = MM_PHYSICAL_PAGE_USED;
+ Pfn1->Flags.Consumer = MC_NPPOOL;
+ Pfn1->ReferenceCount = 1;
+ Pfn1->Flags.StartOfAllocation = 1;
+ Pfn1->Flags.EndOfAllocation = 1;
+ Pfn1->LockCount = 0;
+ Pfn1->SavedSwapEntry = 0;
+
+ //
+ // If this page was unzeroed, we've consumed such a page
+ //
+ if (!Pfn1->Flags.Zero) UnzeroedPageCount--;
+
+ //
+ // Decrease available pages
+ //
+ MmStats.NrSystemPages++;
+ MmStats.NrFreePages--;
+
+ //
+ // Save this page into the MDL
+ //
+ *MdlPage++ = Page;
+ if (++PagesFound == PageCount) break;
+ }
+
+ //
+ // If the first pass was enough, don't keep going, otherwise, go again
+ //
+ if (PagesFound == PageCount) break;
+ }
+ }
+
+ //
+ // Now release the PFN count
+ //
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+
+ //
+ // We might've found less pages, but not more ;-)
+ //
+ if (PagesFound != PageCount) ASSERT(PagesFound < PageCount);
+ if (!PagesFound)
+ {
+ //
+ // If we didn' tfind any pages at all, fail
+ //
+ DPRINT1("NO MDL PAGES!\n");
+ ExFreePool(Mdl);
+ return NULL;
+ }
+
+ //
+ // Write out how many pages we found
+ //
+ Mdl->ByteCount = (ULONG)(PagesFound << PAGE_SHIFT);
+
+ //
+ // Terminate the MDL array if there's certain missing pages
+ //
+ if (PagesFound != PageCount) *MdlPage = -1;
+
+ //
+ // Now go back and loop over all the MDL pages
+ //
+ MdlPage = (PPFN_NUMBER)(Mdl + 1);
+ LastMdlPage = MdlPage + PagesFound;
+ while (MdlPage < LastMdlPage)
+ {
+ //
+ // Check if we've reached the end
+ //
+ Page = *MdlPage;
+ if (Page == (PFN_NUMBER)-1) break;
+
+ //
+ // Get the PFN entry for the page and check if we should zero it out
+ //
+ Pfn1 = MiGetPfnEntry(Page);
+ ASSERT(Pfn1);
+ if (Pfn1->Flags.Zero == 0) MiZeroPage(Page);
+ }
+
+ //
+ // We're done, mark the pages as locked (should we lock them, though???)
+ //
+ Mdl->Process = NULL;
+ Mdl->MdlFlags |= MDL_PAGES_LOCKED;
+ return Mdl;
+}
- /* Use one of our highest usable pages */
- Pfn = MiFreeDescriptor->BasePage + MiFreeDescriptor->PageCount - 1;
- MiFreeDescriptor->PageCount--;
+VOID
+NTAPI
+MmDumpPfnDatabase(VOID)
+{
+ ULONG i;
+ PPHYSICAL_PAGE Pfn1;
+ PCHAR State = "????", Consumer = "Unknown";
+ KIRQL OldIrql;
+ ULONG Totals[5] = {0}, FreePages = 0;
+
+ KeRaiseIrql(HIGH_LEVEL, &OldIrql);
+
+ //
+ // Loop the PFN database
+ //
+ for (i = 0; i <= MmHighestPhysicalPage; i++)
+ {
+ Pfn1 = MiGetPfnEntry(i);
+ if (!Pfn1) continue;
+
+ //
+ // Get the consumer
+ //
+ switch (Pfn1->Flags.Consumer)
+ {
+ case MC_NPPOOL:
+
+ Consumer = "Nonpaged Pool";
+ break;
+
+ case MC_PPOOL:
+
+ Consumer = "Paged Pool";
+ break;
+
+ case MC_CACHE:
+
+ Consumer = "File System Cache";
+ break;
+
+ case MC_USER:
+
+ Consumer = "Process Working Set";
+ break;
+
+ case MC_SYSTEM:
+
+ Consumer = "System";
+ break;
+ }
+
+ //
+ // Get the type
+ //
+ switch (Pfn1->Flags.Type)
+ {
+ case MM_PHYSICAL_PAGE_USED:
+
+ State = "Used";
+ Totals[Pfn1->Flags.Consumer]++;
+ break;
+
+ case MM_PHYSICAL_PAGE_FREE:
+
+ State = "Free";
+ Consumer = "Free";
+ FreePages++;
+ break;
+ }
- /* Return it */
- return Pfn;
+ //
+ // Pretty-print the page
+ //
+ DbgPrint("0x%08p:\t%04s\t%20s\t(%02d.%02d) [%08p])\n",
+ i << PAGE_SHIFT,
+ State,
+ Consumer,
+ Pfn1->ReferenceCount,
+ Pfn1->LockCount,
+ Pfn1->RmapListHead);
+ }
+
+ DbgPrint("Nonpaged Pool: %d pages\t[%d KB]\n", Totals[MC_NPPOOL], (Totals[MC_NPPOOL] << PAGE_SHIFT) / 1024);
+ DbgPrint("Paged Pool: %d pages\t[%d KB]\n", Totals[MC_PPOOL], (Totals[MC_PPOOL] << PAGE_SHIFT) / 1024);
+ DbgPrint("File System Cache: %d pages\t[%d KB]\n", Totals[MC_CACHE], (Totals[MC_CACHE] << PAGE_SHIFT) / 1024);
+ DbgPrint("Process Working Set: %d pages\t[%d KB]\n", Totals[MC_USER], (Totals[MC_USER] << PAGE_SHIFT) / 1024);
+ DbgPrint("System: %d pages\t[%d KB]\n", Totals[MC_SYSTEM], (Totals[MC_SYSTEM] << PAGE_SHIFT) / 1024);
+ DbgPrint("Free: %d pages\t[%d KB]\n", FreePages, (FreePages << PAGE_SHIFT) / 1024);
+
+ KeLowerIrql(OldIrql);
}
VOID
@@ -234,71 +696,32 @@ NTAPI
MmInitializePageList(VOID)
{
ULONG i;
- ULONG Reserved;
- NTSTATUS Status;
- PFN_TYPE Pfn = 0;
PHYSICAL_PAGE UsedPage;
- PLIST_ENTRY NextEntry;
PMEMORY_ALLOCATION_DESCRIPTOR Md;
+ PLIST_ENTRY NextEntry;
/* Initialize the page lists */
InitializeListHead(&UserPageListHead);
InitializeListHead(&FreeUnzeroedPageListHead);
InitializeListHead(&FreeZeroedPageListHead);
-
- /* Set the size and start of the PFN Database */
- MmPageArray = (PHYSICAL_PAGE *)MmPfnDatabase;
- MmPageArraySize = MmHighestPhysicalPage;
- Reserved = PAGE_ROUND_UP((MmPageArraySize * sizeof(PHYSICAL_PAGE))) / PAGE_SIZE;
-
- /* Loop every page required to hold the PFN database */
- for (i = 0; i < Reserved; i++)
- {
- PVOID Address = (char*)MmPageArray + (i * PAGE_SIZE);
-
- /* Check if FreeLDR has already allocated it for us */
- if (!MmIsPagePresent(NULL, Address))
- {
- /* Use one of our highest usable pages */
- Pfn = MmAllocEarlyPage();
-
- /* Set the PFN */
- Status = MmCreateVirtualMappingForKernel(Address,
- PAGE_READWRITE,
- &Pfn,
- 1);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Unable to create virtual mapping\n");
- KeBugCheck(MEMORY_MANAGEMENT);
- }
- }
- else
- {
- /* Setting the page protection is necessary to set the global bit */
- MmSetPageProtect(NULL, Address, PAGE_READWRITE);
- }
- }
-
- /* Clear the PFN database */
- RtlZeroMemory(MmPageArray, (MmPageArraySize + 1) * sizeof(PHYSICAL_PAGE));
/* This is what a used page looks like */
RtlZeroMemory(&UsedPage, sizeof(UsedPage));
UsedPage.Flags.Type = MM_PHYSICAL_PAGE_USED;
UsedPage.Flags.Consumer = MC_NPPOOL;
- UsedPage.ReferenceCount = 2;
- UsedPage.MapCount = 1;
+ UsedPage.ReferenceCount = 1;
/* Loop the memory descriptors */
for (NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink;
NextEntry != &KeLoaderBlock->MemoryDescriptorListHead;
NextEntry = NextEntry->Flink)
{
+#undef ListEntry
/* Get the descriptor */
Md = CONTAINING_RECORD(NextEntry,
MEMORY_ALLOCATION_DESCRIPTOR,
ListEntry);
+#define ListEntry u1
/* Skip bad memory */
if ((Md->MemoryType == LoaderFirmwarePermanent) ||
@@ -306,17 +729,10 @@ MmInitializePageList(VOID)
(Md->MemoryType == LoaderSpecialMemory) ||
(Md->MemoryType == LoaderBad))
{
- /* Loop every page part of the block but valid in the database */
- for (i = 0; i < Md->PageCount; i++)
- {
- /* Skip memory we ignore completely */
- if ((Md->BasePage + i) > MmPageArraySize) break;
-
- /* These are pages reserved by the BIOS/ROMs */
- MmPageArray[Md->BasePage + i].Flags.Type = MM_PHYSICAL_PAGE_BIOS;
- MmPageArray[Md->BasePage + i].Flags.Consumer = MC_NPPOOL;
- MmStats.NrSystemPages++;
- }
+ //
+ // We do not build PFN entries for this
+ //
+ continue;
}
else if ((Md->MemoryType == LoaderFree) ||
(Md->MemoryType == LoaderLoadedProgram) ||
@@ -327,9 +743,9 @@ MmInitializePageList(VOID)
for (i = 0; i < Md->PageCount; i++)
{
/* Mark it as a free page */
- MmPageArray[Md->BasePage + i].Flags.Type = MM_PHYSICAL_PAGE_FREE;
+ MmPfnDatabase[Md->BasePage + i].Flags.Type = MM_PHYSICAL_PAGE_FREE;
InsertTailList(&FreeUnzeroedPageListHead,
- &MmPageArray[Md->BasePage + i].ListEntry);
+ &MmPfnDatabase[Md->BasePage + i].ListEntry);
UnzeroedPageCount++;
MmStats.NrFreePages++;
}
@@ -340,43 +756,29 @@ MmInitializePageList(VOID)
for (i = 0; i < Md->PageCount; i++)
{
/* Everything else is used memory */
- MmPageArray[Md->BasePage + i] = UsedPage;
+ MmPfnDatabase[Md->BasePage + i] = UsedPage;
MmStats.NrSystemPages++;
}
}
}
-
+
/* Finally handle the pages describing the PFN database themselves */
- for (i = (MiFreeDescriptor->BasePage + MiFreeDescriptor->PageCount);
- i < (MiFreeDescriptorOrg.BasePage + MiFreeDescriptorOrg.PageCount);
- i++)
+ for (i = MxOldFreeDescriptor.BasePage; i < MxFreeDescriptor->BasePage; i++)
{
/* Ensure this page was not added previously */
- ASSERT(MmPageArray[i].Flags.Type == 0);
+ ASSERT(MmPfnDatabase[i].Flags.Type == 0);
/* Mark it as used kernel memory */
- MmPageArray[i] = UsedPage;
+ MmPfnDatabase[i] = UsedPage;
MmStats.NrSystemPages++;
}
-
+
KeInitializeEvent(&ZeroPageThreadEvent, NotificationEvent, TRUE);
-
DPRINT("Pages: %x %x\n", MmStats.NrFreePages, MmStats.NrSystemPages);
MmStats.NrTotalPages = MmStats.NrFreePages + MmStats.NrSystemPages + MmStats.NrUserPages;
MmInitializeBalancer(MmStats.NrFreePages, MmStats.NrSystemPages);
}
-VOID
-NTAPI
-MmSetFlagsPage(PFN_TYPE Pfn, ULONG Flags)
-{
- KIRQL oldIrql;
-
- oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- MiGetPfnEntry(Pfn)->AllFlags = Flags;
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
-}
-
VOID
NTAPI
MmSetRmapListHeadPage(PFN_TYPE Pfn, struct _MM_RMAP_ENTRY* ListHead)
@@ -384,7 +786,7 @@ MmSetRmapListHeadPage(PFN_TYPE Pfn, struct _MM_RMAP_ENTRY* ListHead)
KIRQL oldIrql;
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- MiGetPfnEntry(Pfn)->RmapListHead = ListHead;
+ MiGetPfnEntry(Pfn)->RmapListHead = (LONG)ListHead;
KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
}
@@ -396,7 +798,7 @@ MmGetRmapListHeadPage(PFN_TYPE Pfn)
struct _MM_RMAP_ENTRY* ListHead;
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- ListHead = MiGetPfnEntry(Pfn)->RmapListHead;
+ ListHead = (struct _MM_RMAP_ENTRY*)MiGetPfnEntry(Pfn)->RmapListHead;
KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
return(ListHead);
@@ -404,76 +806,12 @@ MmGetRmapListHeadPage(PFN_TYPE Pfn)
VOID
NTAPI
-MmMarkPageMapped(PFN_TYPE Pfn)
-{
- KIRQL oldIrql;
- PPHYSICAL_PAGE Page;
-
- if (Pfn <= MmPageArraySize)
- {
- oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- Page = MiGetPfnEntry(Pfn);
- if (Page->Flags.Type == MM_PHYSICAL_PAGE_FREE)
- {
- DPRINT1("Mapping non-used page\n");
- KeBugCheck(MEMORY_MANAGEMENT);
- }
- Page->MapCount++;
- Page->ReferenceCount++;
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- }
-}
-
-VOID
-NTAPI
-MmMarkPageUnmapped(PFN_TYPE Pfn)
-{
- KIRQL oldIrql;
- PPHYSICAL_PAGE Page;
-
- if (Pfn <= MmPageArraySize)
- {
- oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- Page = MiGetPfnEntry(Pfn);
- if (Page->Flags.Type == MM_PHYSICAL_PAGE_FREE)
- {
- DPRINT1("Unmapping non-used page\n");
- KeBugCheck(MEMORY_MANAGEMENT);
- }
- if (Page->MapCount == 0)
- {
- DPRINT1("Unmapping not mapped page\n");
- KeBugCheck(MEMORY_MANAGEMENT);
- }
- Page->MapCount--;
- Page->ReferenceCount--;
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- }
-}
-
-ULONG
-NTAPI
-MmGetFlagsPage(PFN_TYPE Pfn)
-{
- KIRQL oldIrql;
- ULONG Flags;
-
- oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- Flags = MiGetPfnEntry(Pfn)->AllFlags;
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
-
- return(Flags);
-}
-
-
-VOID
-NTAPI
-MmSetSavedSwapEntryPage(PFN_TYPE Pfn, SWAPENTRY SavedSwapEntry)
+MmSetSavedSwapEntryPage(PFN_TYPE Pfn, SWAPENTRY SwapEntry)
{
KIRQL oldIrql;
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- MiGetPfnEntry(Pfn)->SavedSwapEntry = SavedSwapEntry;
+ MiGetPfnEntry(Pfn)->SavedSwapEntry = SwapEntry;
KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
}
@@ -481,14 +819,14 @@ SWAPENTRY
NTAPI
MmGetSavedSwapEntryPage(PFN_TYPE Pfn)
{
- SWAPENTRY SavedSwapEntry;
+ SWAPENTRY SwapEntry;
KIRQL oldIrql;
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- SavedSwapEntry = MiGetPfnEntry(Pfn)->SavedSwapEntry;
+ SwapEntry = MiGetPfnEntry(Pfn)->SavedSwapEntry;
KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- return(SavedSwapEntry);
+ return(SwapEntry);
}
VOID
@@ -500,7 +838,7 @@ MmReferencePageUnsafe(PFN_TYPE Pfn)
DPRINT("MmReferencePageUnsafe(PysicalAddress %x)\n", Pfn << PAGE_SHIFT);
- if (Pfn == 0 || Pfn > MmPageArraySize)
+ if (Pfn == 0 || Pfn > MmHighestPhysicalPage)
{
return;
}
@@ -508,6 +846,7 @@ MmReferencePageUnsafe(PFN_TYPE Pfn)
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
Page = MiGetPfnEntry(Pfn);
+ ASSERT(Page);
if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)
{
DPRINT1("Referencing non-used page\n");
@@ -539,6 +878,7 @@ MmGetReferenceCountPage(PFN_TYPE Pfn)
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
Page = MiGetPfnEntry(Pfn);
+ ASSERT(Page);
if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)
{
DPRINT1("Getting reference count for free page\n");
@@ -573,6 +913,7 @@ MmDereferencePage(PFN_TYPE Pfn)
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
Page = MiGetPfnEntry(Pfn);
+ ASSERT(Page);
if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)
{
@@ -591,17 +932,11 @@ MmDereferencePage(PFN_TYPE Pfn)
MmStats.NrFreePages++;
MmStats.NrSystemPages--;
if (Page->Flags.Consumer == MC_USER) RemoveEntryList(&Page->ListEntry);
- if (Page->RmapListHead != NULL)
+ if (Page->RmapListHead != (LONG)NULL)
{
DPRINT1("Freeing page with rmap entries.\n");
KeBugCheck(MEMORY_MANAGEMENT);
}
- if (Page->MapCount != 0)
- {
- DPRINT1("Freeing mapped page (0x%x count %d)\n",
- Pfn << PAGE_SHIFT, Page->MapCount);
- KeBugCheck(MEMORY_MANAGEMENT);
- }
if (Page->LockCount > 0)
{
DPRINT1("Freeing locked page\n");
@@ -636,7 +971,7 @@ NTAPI
MmGetLockCountPage(PFN_TYPE Pfn)
{
KIRQL oldIrql;
- ULONG LockCount;
+ ULONG CurrentLockCount;
PPHYSICAL_PAGE Page;
DPRINT("MmGetLockCountPage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT);
@@ -644,16 +979,17 @@ MmGetLockCountPage(PFN_TYPE Pfn)
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
Page = MiGetPfnEntry(Pfn);
+ ASSERT(Page);
if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)
{
DPRINT1("Getting lock count for free page\n");
KeBugCheck(MEMORY_MANAGEMENT);
}
- LockCount = Page->LockCount;
+ CurrentLockCount = Page->LockCount;
KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- return(LockCount);
+ return(CurrentLockCount);
}
VOID
@@ -668,6 +1004,7 @@ MmLockPageUnsafe(PFN_TYPE Pfn)
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
Page = MiGetPfnEntry(Pfn);
+ ASSERT(Page);
if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)
{
DPRINT1("Locking free page\n");
@@ -699,6 +1036,7 @@ MmUnlockPage(PFN_TYPE Pfn)
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
Page = MiGetPfnEntry(Pfn);
+ ASSERT(Page);
if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)
{
DPRINT1("Unlocking free page\n");
@@ -711,7 +1049,7 @@ MmUnlockPage(PFN_TYPE Pfn)
PFN_TYPE
NTAPI
-MmAllocPage(ULONG Consumer, SWAPENTRY SavedSwapEntry)
+MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry)
{
PFN_TYPE PfnOffset;
PLIST_ENTRY ListEntry;
@@ -729,11 +1067,7 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SavedSwapEntry)
/* Check if this allocation is for the PFN DB itself */
if (MmStats.NrTotalPages == 0)
{
- /* Allocate an early page -- we'll account for it later */
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- PfnOffset = MmAllocEarlyPage();
- MiZeroPage(PfnOffset);
- return PfnOffset;
+ ASSERT(FALSE);
}
DPRINT1("MmAllocPage(): Out of memory\n");
@@ -759,11 +1093,6 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SavedSwapEntry)
DPRINT1("Got non-free page from freelist\n");
KeBugCheck(MEMORY_MANAGEMENT);
}
- if (PageDescriptor->MapCount != 0)
- {
- DPRINT1("Got mapped page from freelist\n");
- KeBugCheck(MEMORY_MANAGEMENT);
- }
if (PageDescriptor->ReferenceCount != 0)
{
DPRINT1("%d\n", PageDescriptor->ReferenceCount);
@@ -773,190 +1102,21 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SavedSwapEntry)
PageDescriptor->Flags.Consumer = Consumer;
PageDescriptor->ReferenceCount = 1;
PageDescriptor->LockCount = 0;
- PageDescriptor->MapCount = 0;
- PageDescriptor->SavedSwapEntry = SavedSwapEntry;
+ PageDescriptor->SavedSwapEntry = SwapEntry;
MmStats.NrSystemPages++;
MmStats.NrFreePages--;
KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- PfnOffset = PageDescriptor - MmPageArray;
- if (NeedClear)
+ PfnOffset = PageDescriptor - MmPfnDatabase;
+ if ((NeedClear) && (Consumer != MC_SYSTEM))
{
MiZeroPage(PfnOffset);
}
- if (PageDescriptor->MapCount != 0)
- {
- DPRINT1("Returning mapped page.\n");
- KeBugCheck(MEMORY_MANAGEMENT);
- }
return PfnOffset;
}
-LONG
-NTAPI
-MmAllocPagesSpecifyRange(ULONG Consumer,
- PHYSICAL_ADDRESS LowestAddress,
- PHYSICAL_ADDRESS HighestAddress,
- ULONG NumberOfPages,
- PPFN_TYPE Pages)
-{
- PPHYSICAL_PAGE PageDescriptor;
- KIRQL oldIrql;
- PFN_TYPE LowestPage, HighestPage;
- PFN_TYPE pfn;
- ULONG NumberOfPagesFound = 0;
- ULONG i;
-
- DPRINT("MmAllocPagesSpecifyRange()\n"
- " LowestAddress = 0x%08x%08x\n"
- " HighestAddress = 0x%08x%08x\n"
- " NumberOfPages = %d\n",
- LowestAddress.u.HighPart, LowestAddress.u.LowPart,
- HighestAddress.u.HighPart, HighestAddress.u.LowPart,
- NumberOfPages);
-
- if (NumberOfPages == 0)
- return 0;
-
- LowestPage = LowestAddress.LowPart / PAGE_SIZE;
- HighestPage = HighestAddress.LowPart / PAGE_SIZE;
- if ((HighestAddress.u.LowPart % PAGE_SIZE) != 0)
- HighestPage++;
-
- if (LowestPage >= MmPageArraySize)
- {
- DPRINT1("MmAllocPagesSpecifyRange(): Out of memory\n");
- return -1;
- }
- if (HighestPage > MmPageArraySize)
- HighestPage = MmPageArraySize;
-
- oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- if (LowestPage == 0 && HighestPage == MmPageArraySize)
- {
- PLIST_ENTRY ListEntry;
- while (NumberOfPagesFound < NumberOfPages)
- {
- if (!IsListEmpty(&FreeZeroedPageListHead))
- {
- ListEntry = RemoveTailList(&FreeZeroedPageListHead);
- }
- else if (!IsListEmpty(&FreeUnzeroedPageListHead))
- {
- ListEntry = RemoveTailList(&FreeUnzeroedPageListHead);
- UnzeroedPageCount--;
- }
- else
- {
- if (NumberOfPagesFound == 0)
- {
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- DPRINT1("MmAllocPagesSpecifyRange(): Out of memory\n");
- return -1;
- }
- else
- {
- break;
- }
- }
- PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry);
-
- ASSERT(PageDescriptor->Flags.Type == MM_PHYSICAL_PAGE_FREE);
- ASSERT(PageDescriptor->MapCount == 0);
- ASSERT(PageDescriptor->ReferenceCount == 0);
-
- /* Allocate the page */
- PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED;
- PageDescriptor->Flags.Consumer = Consumer;
- PageDescriptor->ReferenceCount = 1;
- PageDescriptor->LockCount = 0;
- PageDescriptor->MapCount = 0;
- PageDescriptor->SavedSwapEntry = 0; /* FIXME: Do we need swap entries? */
-
- MmStats.NrSystemPages++;
- MmStats.NrFreePages--;
-
- /* Remember the page */
- pfn = PageDescriptor - MmPageArray;
- Pages[NumberOfPagesFound++] = pfn;
- if(Consumer == MC_USER) MmInsertLRULastUserPage(pfn);
- }
- }
- else
- {
- INT LookForZeroedPages;
- for (LookForZeroedPages = 1; LookForZeroedPages >= 0; LookForZeroedPages--)
- {
- for (pfn = LowestPage; pfn < HighestPage; pfn++)
- {
- PageDescriptor = MmPageArray + pfn;
-
- if (PageDescriptor->Flags.Type != MM_PHYSICAL_PAGE_FREE)
- continue;
- if (PageDescriptor->Flags.Zero != LookForZeroedPages)
- continue;
-
- ASSERT(PageDescriptor->MapCount == 0);
- ASSERT(PageDescriptor->ReferenceCount == 0);
-
- /* Allocate the page */
- PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED;
- PageDescriptor->Flags.Consumer = Consumer;
- PageDescriptor->ReferenceCount = 1;
- PageDescriptor->LockCount = 0;
- PageDescriptor->MapCount = 0;
- PageDescriptor->SavedSwapEntry = 0; /* FIXME: Do we need swap entries? */
-
- if (!PageDescriptor->Flags.Zero)
- UnzeroedPageCount--;
- MmStats.NrSystemPages++;
- MmStats.NrFreePages--;
-
- /* Remember the page */
- Pages[NumberOfPagesFound++] = pfn;
- if (NumberOfPagesFound == NumberOfPages)
- break;
- }
- if (NumberOfPagesFound == NumberOfPages)
- break;
- }
- }
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
-
- /* Zero unzero-ed pages */
- for (i = 0; i < NumberOfPagesFound; i++)
- {
- pfn = Pages[i];
- if (MiGetPfnEntry(pfn)->Flags.Zero == 0)
- {
- MiZeroPage(pfn);
- }
- else
- {
- MiGetPfnEntry(pfn)->Flags.Zero = 0;
- }
- }
-
- return NumberOfPagesFound;
-}
-
-static
-NTSTATUS
-MiZeroPageInternal(PFN_TYPE Page)
-{
- PVOID TempAddress;
-
- TempAddress = MiMapPageToZeroInHyperSpace(Page);
- if (TempAddress == NULL)
- {
- return(STATUS_NO_MEMORY);
- }
- memset(TempAddress, 0, PAGE_SIZE);
- return(STATUS_SUCCESS);
-}
-
NTSTATUS
NTAPI
MmZeroPageThreadMain(PVOID Ignored)
@@ -1003,16 +1163,11 @@ MmZeroPageThreadMain(PVOID Ignored)
/* We set the page to used, because MmCreateVirtualMapping failed with unused pages */
PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED;
KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- Pfn = PageDescriptor - MmPageArray;
- Status = MiZeroPageInternal(Pfn);
+ Pfn = PageDescriptor - MmPfnDatabase;
+ Status = MiZeroPage(Pfn);
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- if (PageDescriptor->MapCount != 0)
- {
- DPRINT1("Mapped page on freelist.\n");
- KeBugCheck(MEMORY_MANAGEMENT);
- }
- PageDescriptor->Flags.Zero = 1;
+ PageDescriptor->Flags.Zero = 1;
PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_FREE;
if (NT_SUCCESS(Status))
{
diff --git a/reactos/ntoskrnl/mm/hypermap.c b/reactos/ntoskrnl/mm/hypermap.c
deleted file mode 100644
index 4d818a74c45..00000000000
--- a/reactos/ntoskrnl/mm/hypermap.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * PROJECT: ReactOS Kernel
- * LICENSE: BSD - See COPYING.ARM in the top level directory
- * FILE: ntoskrnl/mm/hypermap.c
- * PURPOSE: Hyperspace Mapping Functionality
- * PROGRAMMERS: ReactOS Portable Systems Group
- */
-
-/* INCLUDES *******************************************************************/
-
-#include
-#define NDEBUG
-#include
-
-/* GLOBALS ********************************************************************/
-
-PMMPTE MmFirstReservedMappingPte;
-PMMPTE MmLastReservedMappingPte;
-MMPTE HyperTemplatePte;
-PEPROCESS HyperProcess;
-KIRQL HyperIrql;
-
-/* PRIVATE FUNCTIONS **********************************************************/
-
-VOID
-NTAPI
-MiInitHyperSpace(VOID)
-{
- PMMPTE PointerPte;
-
- /* Get the hyperspace PTE and zero out the page table */
- PointerPte = MiAddressToPte(HYPER_SPACE);
- RtlZeroMemory(PointerPte, PAGE_SIZE);
-
- /* Setup mapping PTEs */
- MmFirstReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_START);
- MmLastReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_END);
- MmFirstReservedMappingPte->u.Hard.PageFrameNumber = MI_HYPERSPACE_PTES;
-}
-
-PVOID
-NTAPI
-MiMapPageInHyperSpace(IN PEPROCESS Process,
- IN PFN_NUMBER Page,
- IN PKIRQL OldIrql)
-{
- MMPTE TempPte;
- PMMPTE PointerPte;
- PFN_NUMBER Offset;
- PVOID Address;
-
- /* Never accept page 0 */
- ASSERT(Page != 0);
-
- /* Build the PTE */
- TempPte = HyperTemplatePte;
- TempPte.u.Hard.PageFrameNumber = Page;
-
- /* Pick the first hyperspace PTE */
- PointerPte = MmFirstReservedMappingPte;
-
- /* Acquire the hyperlock */
- ASSERT(Process == PsGetCurrentProcess());
- KeAcquireSpinLock(&Process->HyperSpaceLock, OldIrql);
-
- /* Now get the first free PTE */
- Offset = PFN_FROM_PTE(PointerPte);
- if (!Offset)
- {
- /* Reset the PTEs */
- Offset = MI_HYPERSPACE_PTES;
- KeFlushProcessTb();
- }
-
- /* Prepare the next PTE */
- PointerPte->u.Hard.PageFrameNumber = Offset - 1;
-
- /* Write the current PTE */
- PointerPte += Offset;
- ASSERT(PointerPte->u.Hard.Valid == 0);
- ASSERT(TempPte.u.Hard.Valid == 1);
- *PointerPte = TempPte;
-
- /* Return the address */
- Address = (PVOID)((ULONG_PTR)PointerPte << 10);
- return Address;
-}
-
-VOID
-NTAPI
-MiUnmapPageInHyperSpace(IN PEPROCESS Process,
- IN PVOID Address,
- IN KIRQL OldIrql)
-{
- ASSERT(Process == PsGetCurrentProcess());
-
- /* Blow away the mapping */
- MiAddressToPte(Address)->u.Long = 0;
-
- /* Release the hyperlock */
- ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
- KeReleaseSpinLock(&Process->HyperSpaceLock, OldIrql);
-}
-
-PVOID
-NTAPI
-MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page)
-{
- MMPTE TempPte;
- PMMPTE PointerPte;
- PVOID Address;
-
- /* Never accept page 0 */
- ASSERT(Page != 0);
-
- /* Build the PTE */
- TempPte = HyperTemplatePte;
- TempPte.u.Hard.PageFrameNumber = Page;
-
- /* Get the Zero PTE and its address */
- PointerPte = MiAddressToPte(MI_ZERO_PTE);
- Address = (PVOID)((ULONG_PTR)PointerPte << 10);
-
- /* Invalidate the old address */
- __invlpg(Address);
-
- /* Write the current PTE */
- TempPte.u.Hard.PageFrameNumber = Page;
- *PointerPte = TempPte;
-
- /* Return the address */
- return Address;
-}
diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c
index 40401327d72..040693dc00a 100644
--- a/reactos/ntoskrnl/mm/i386/page.c
+++ b/reactos/ntoskrnl/mm/i386/page.c
@@ -71,12 +71,6 @@ MiFlushTlb(PULONG Pt, PVOID Address)
}
}
-PULONG
-MmGetPageDirectory(VOID)
-{
- return (PULONG)(ULONG_PTR)__readcr3();
-}
-
static ULONG
ProtectToPTE(ULONG flProtect)
{
@@ -226,32 +220,6 @@ MmCreateProcessAddressSpace(IN ULONG MinWs,
return TRUE;
}
-VOID
-NTAPI
-MmDeletePageTable(PEPROCESS Process, PVOID Address)
-{
- PEPROCESS CurrentProcess = PsGetCurrentProcess();
-
- if (Process != NULL && Process != CurrentProcess)
- {
- KeAttachProcess(&Process->Pcb);
- }
-
- MiAddressToPde(Address)->u.Long = 0;
- MiFlushTlb((PULONG)MiAddressToPde(Address),
- MiAddressToPte(Address));
-
- if (Address >= MmSystemRangeStart)
- {
- KeBugCheck(MEMORY_MANAGEMENT);
- // MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)] = 0;
- }
- if (Process != NULL && Process != CurrentProcess)
- {
- KeDetachProcess();
- }
-}
-
static PULONG
MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
{
@@ -310,7 +278,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
{
return NULL;
}
- Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Pfn);
+ Status = MmRequestPageMemoryConsumer(MC_SYSTEM, FALSE, &Pfn);
if (!NT_SUCCESS(Status) || Pfn == 0)
{
KeBugCheck(MEMORY_MANAGEMENT);
@@ -322,8 +290,11 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
}
if(0 != InterlockedCompareExchangePte(&MmGlobalKernelPageDirectory[PdeOffset], Entry, 0))
{
- MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn);
+ MmReleasePageMemoryConsumer(MC_SYSTEM, Pfn);
}
+ InterlockedExchangePte(PageDir, MmGlobalKernelPageDirectory[PdeOffset]);
+ RtlZeroMemory(MiPteToAddress(PageDir), PAGE_SIZE);
+ return (PULONG)MiAddressToPte(Address);
}
InterlockedExchangePte(PageDir, MmGlobalKernelPageDirectory[PdeOffset]);
}
@@ -494,7 +465,6 @@ MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOLEAN FreePage,
if (WasValid)
{
Pfn = PTE_TO_PFN(Pte);
- MmMarkPageUnmapped(Pfn);
}
else
{
@@ -797,10 +767,6 @@ MmCreatePageFileMapping(PEPROCESS Process,
KeBugCheck(MEMORY_MANAGEMENT);
}
Pte = *Pt;
- if (PAGE_MASK((Pte)) != 0)
- {
- MmMarkPageUnmapped(PTE_TO_PFN((Pte)));
- }
InterlockedExchangePte(Pt, SwapEntry << 1);
if (Pte != 0)
{
@@ -911,16 +877,11 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
oldPdeOffset = PdeOffset;
Pte = *Pt;
- MmMarkPageMapped(Pages[i]);
if (PAGE_MASK(Pte) != 0 && !(Pte & PA_PRESENT) && (Pte & 0x800))
{
DPRINT1("Bad PTE %lx\n", Pte);
KeBugCheck(MEMORY_MANAGEMENT);
}
- if (PAGE_MASK(Pte) != 0)
- {
- MmMarkPageUnmapped(PTE_TO_PFN(Pte));
- }
InterlockedExchangePte(Pt, PFN_TO_PTE(Pages[i]) | Attributes);
if (Pte != 0)
{
@@ -1078,6 +1039,18 @@ MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size)
{
ULONG StartOffset, EndOffset, Offset;
PULONG Pde;
+
+ //
+ // Check if the process isn't there anymore
+ // This is probably a bad sign, since it means the caller is setting cr3 to
+ // 0 or something...
+ //
+ if ((PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0]) == 0) && (Process != PsGetCurrentProcess()))
+ {
+ DPRINT1("Process: %16s is dead: %p\n", Process->ImageFileName, Process->Pcb.DirectoryTableBase[0]);
+ ASSERT(FALSE);
+ return;
+ }
if (Address < MmSystemRangeStart)
{
@@ -1158,7 +1131,7 @@ MiInitPageDirectoryMap(VOID)
BoundaryAddressMultiple.QuadPart = 0;
BaseAddress = (PVOID)PAGETABLE_MAP;
Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_SYSTEM,
+ MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC,
&BaseAddress,
0x400000,
PAGE_READWRITE,
@@ -1172,7 +1145,7 @@ MiInitPageDirectoryMap(VOID)
}
BaseAddress = (PVOID)HYPERSPACE;
Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_SYSTEM,
+ MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC,
&BaseAddress,
0x400000,
PAGE_READWRITE,
diff --git a/reactos/ntoskrnl/mm/iospace.c b/reactos/ntoskrnl/mm/iospace.c
deleted file mode 100644
index 967246a0aeb..00000000000
--- a/reactos/ntoskrnl/mm/iospace.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: ntoskrnl/mm/iospace.c
- * PURPOSE: Mapping I/O space
- *
- * PROGRAMMERS: David Welch (welch@mcmail.com)
- */
-
-/* INCLUDES *****************************************************************/
-
-#include
-#define NDEBUG
-#include
-
-/* FUNCTIONS *****************************************************************/
-
-/**********************************************************************
- * NAME EXPORTED
- * MmMapIoSpace@16
- *
- * DESCRIPTION
- * Maps a physical memory range into system space.
- *
- * ARGUMENTS
- * PhysicalAddress
- * First physical address to map;
- *
- * NumberOfBytes
- * Number of bytes to map;
- *
- * CacheEnable
- * Type of memory caching.
- *
- * RETURN VALUE
- * The base virtual address which maps the region.
- *
- * NOTE
- * Description moved here from include/ddk/mmfuncs.h.
- * Code taken from ntoskrnl/mm/special.c.
- *
- * REVISIONS
- *
- * @implemented
- */
-PVOID NTAPI
-MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress,
- IN ULONG NumberOfBytes,
- IN MEMORY_CACHING_TYPE CacheEnable)
-{
- PVOID Result;
- ULONG Offset;
- MEMORY_AREA* marea;
- NTSTATUS Status;
- ULONG i;
- ULONG Protect;
- PHYSICAL_ADDRESS BoundaryAddressMultiple;
- PFN_TYPE Pfn;
-
- DPRINT("MmMapIoSpace(%lx, %d, %d)\n", PhysicalAddress, NumberOfBytes, CacheEnable);
-
- if (CacheEnable != MmNonCached &&
- CacheEnable != MmCached &&
- CacheEnable != MmWriteCombined)
- {
- return NULL;
- }
-
- BoundaryAddressMultiple.QuadPart = 0;
- Result = NULL;
- Offset = PhysicalAddress.u.LowPart % PAGE_SIZE;
- NumberOfBytes += Offset;
- PhysicalAddress.QuadPart -= Offset;
- Protect = PAGE_EXECUTE_READWRITE | PAGE_SYSTEM;
- if (CacheEnable != MmCached)
- {
- Protect |= (PAGE_NOCACHE | PAGE_WRITETHROUGH);
- }
-
- MmLockAddressSpace(MmGetKernelAddressSpace());
- Status = MmCreateMemoryArea (MmGetKernelAddressSpace(),
- MEMORY_AREA_IO_MAPPING,
- &Result,
- NumberOfBytes,
- Protect,
- &marea,
- 0,
- FALSE,
- BoundaryAddressMultiple);
- MmUnlockAddressSpace(MmGetKernelAddressSpace());
-
- if (!NT_SUCCESS(Status))
- {
- DPRINT("MmMapIoSpace failed (%lx)\n", Status);
- return (NULL);
- }
- Pfn = PhysicalAddress.LowPart >> PAGE_SHIFT;
- for (i = 0; i < PAGE_ROUND_UP(NumberOfBytes); i += PAGE_SIZE, Pfn++)
- {
- Status = MmCreateVirtualMappingForKernel((char*)Result + i,
- Protect,
- &Pfn,
- 1);
- if (!NT_SUCCESS(Status))
- {
- DbgPrint("Unable to create virtual mapping\n");
- KeBugCheck(MEMORY_MANAGEMENT);
- }
- }
- return (PVOID)((ULONG_PTR)Result + Offset);
-}
-
-
-/**********************************************************************
- * NAME EXPORTED
- * MmUnmapIoSpace@8
- *
- * DESCRIPTION
- * Unmaps a physical memory range from system space.
- *
- * ARGUMENTS
- * BaseAddress
- * The base virtual address which maps the region;
- *
- * NumberOfBytes
- * Number of bytes to unmap.
- *
- * RETURN VALUE
- * None.
- *
- * NOTE
- * Code taken from ntoskrnl/mm/special.c.
- *
- * REVISIONS
- *
- * @implemented
- */
-VOID NTAPI
-MmUnmapIoSpace (IN PVOID BaseAddress,
- IN SIZE_T NumberOfBytes)
-{
- LONG Offset;
- PVOID Address = BaseAddress;
-
- Offset = (ULONG_PTR)Address % PAGE_SIZE;
- Address = RVA(Address, - Offset);
- NumberOfBytes += Offset;
-
- MmLockAddressSpace(MmGetKernelAddressSpace());
- MmFreeMemoryAreaByPtr(MmGetKernelAddressSpace(),
- Address,
- NULL,
- NULL);
- MmUnlockAddressSpace(MmGetKernelAddressSpace());
-}
-
-
-/**********************************************************************
- * NAME EXPORTED
- * MmMapVideoDisplay@16
- *
- * @implemented
- */
-PVOID NTAPI
-MmMapVideoDisplay (IN PHYSICAL_ADDRESS PhysicalAddress,
- IN SIZE_T NumberOfBytes,
- IN MEMORY_CACHING_TYPE CacheType)
-{
- return MmMapIoSpace (PhysicalAddress, NumberOfBytes, (BOOLEAN)CacheType);
-}
-
-
-/*
- * @implemented
- */
-VOID NTAPI
-MmUnmapVideoDisplay (IN PVOID BaseAddress,
- IN SIZE_T NumberOfBytes)
-{
- MmUnmapIoSpace (BaseAddress, NumberOfBytes);
-}
-
-
-/* EOF */
diff --git a/reactos/ntoskrnl/mm/kmap.c b/reactos/ntoskrnl/mm/kmap.c
deleted file mode 100644
index 0a442803f5e..00000000000
--- a/reactos/ntoskrnl/mm/kmap.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: ntoskrnl/mm/kmap.c
- * PURPOSE: Implements the kernel memory pool
- *
- * PROGRAMMERS: David Welch (welch@cwcom.net)
- */
-
-/* INCLUDES ****************************************************************/
-
-#include
-#define NDEBUG
-#include
-
-/* GLOBALS *****************************************************************/
-
-/* FUNCTIONS ***************************************************************/
-
-NTSTATUS
-NTAPI
-MiZeroPage(PFN_TYPE Page)
-{
- PEPROCESS Process;
- KIRQL Irql;
- PVOID TempAddress;
-
- Process = PsGetCurrentProcess();
- TempAddress = MiMapPageInHyperSpace(Process, Page, &Irql);
- if (TempAddress == NULL)
- {
- return(STATUS_NO_MEMORY);
- }
- memset(TempAddress, 0, PAGE_SIZE);
- MiUnmapPageInHyperSpace(Process, TempAddress, Irql);
- return(STATUS_SUCCESS);
-}
-
-NTSTATUS
-NTAPI
-MiCopyFromUserPage(PFN_TYPE DestPage, PVOID SourceAddress)
-{
- PEPROCESS Process;
- KIRQL Irql;
- PVOID TempAddress;
-
- Process = PsGetCurrentProcess();
- TempAddress = MiMapPageInHyperSpace(Process, DestPage, &Irql);
- if (TempAddress == NULL)
- {
- return(STATUS_NO_MEMORY);
- }
- memcpy(TempAddress, SourceAddress, PAGE_SIZE);
- MiUnmapPageInHyperSpace(Process, TempAddress, Irql);
- return(STATUS_SUCCESS);
-}
-
-/* EOF */
diff --git a/reactos/ntoskrnl/mm/marea.c b/reactos/ntoskrnl/mm/marea.c
index 131225f0eb0..5fe30972862 100644
--- a/reactos/ntoskrnl/mm/marea.c
+++ b/reactos/ntoskrnl/mm/marea.c
@@ -49,6 +49,9 @@
#pragma alloc_text(INIT, MmInitMemoryAreas)
#endif
+MEMORY_AREA MiStaticMemoryAreas[MI_STATIC_MEMORY_AREAS];
+ULONG MiStaticMemoryAreaCount;
+
/* #define VALIDATE_MEMORY_AREAS */
/* FUNCTIONS *****************************************************************/
@@ -986,9 +989,28 @@ MmCreateMemoryArea(PMMSUPPORT AddressSpace,
return STATUS_CONFLICTING_ADDRESSES;
}
}
-
- MemoryArea = ExAllocatePoolWithTag(NonPagedPool, sizeof(MEMORY_AREA),
- TAG_MAREA);
+
+ //
+ // Is this a static memory area?
+ //
+ if (Type & MEMORY_AREA_STATIC)
+ {
+ //
+ // Use the static array instead of the pool
+ //
+ ASSERT(MiStaticMemoryAreaCount < MI_STATIC_MEMORY_AREAS);
+ MemoryArea = &MiStaticMemoryAreas[MiStaticMemoryAreaCount++];
+ }
+ else
+ {
+ //
+ // Allocate the memory area from nonpaged pool
+ //
+ MemoryArea = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(MEMORY_AREA),
+ TAG_MAREA);
+ }
+
RtlZeroMemory(MemoryArea, sizeof(MEMORY_AREA));
MemoryArea->Type = Type;
MemoryArea->StartingAddress = *BaseAddress;
diff --git a/reactos/ntoskrnl/mm/mdlsup.c b/reactos/ntoskrnl/mm/mdlsup.c
deleted file mode 100644
index c0aa24cf06b..00000000000
--- a/reactos/ntoskrnl/mm/mdlsup.c
+++ /dev/null
@@ -1,919 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: ntoskrnl/mm/mdl.c
- * PURPOSE: Manipulates MDLs
- *
- * PROGRAMMERS: David Welch (welch@cwcom.net)
- */
-
-/* INCLUDES ****************************************************************/
-
-#include
-#define NDEBUG
-#include